Documentos de Académico
Documentos de Profesional
Documentos de Cultura
CARRERA DE INGENIERÍA EN
TELECOMUNICACIONES
TEORÍA DE LA INFORMACIÓN
PROYECTO FINAL
DISEÑO DEL ARBOL Y PROGRAMACION DE LA
ESTUDIANTE
Jhonatan Paul Lapo Chuquimarca
2
8. ANEXOS...........................................................................................................................24
8.1 MANUAL DEL PROGRAMADOR..........................................................................24
8.2 MANUAL DEL USUARIO......................................................................................35
9. VITA..................................................................................................................................38
10. CODIGO DEL PROGRAMA.........................................................................................39
INDICE DE TABLAS
INDICE DE FIGURAS
1. ANTECEDENTES
3
asigna palabras de código con una longitud de código correspondiente.[ CITATION
Int07 \l 12298 ]
La codificación de Shannon-Fano es fácil de implementar, en la operación la
codificación de Shannon-Fano no es de mayor importancia esto se debe
especialmente a la menor eficiencia del código en comparación con la
codificación de Huffman. Su principal uso es en aplicar un algoritmo simple con
alto rendimiento y requisitos mínimos para la programación. [ CITATION Int07 \l
12298 ]
David Albert Huffman nacido en Ohio el 9 de agosto de 1925, obtuvo su
licenciatura en ingeniería eléctrica de la universidad estatal de Ohio a la edad de
18 en 1944. Posteriormente obtuvo su maestría en Ohio 1949 y su PhD del MIT
en 1953. [ CITATION Ins21 \l 12298 ]
Huffman hizo importantes contribuciones en muchas otras áreas, incluida la
teoría y la codificación de la información, el diseño de señales para aplicaciones
de radar y comunicaciones y los procedimientos de diseño para circuitos lógicos
asíncronos. Como resultado de su trabajo sobre las propiedades matemáticas de
las superficies de "curvatura gaussiana cero", Huffman desarrolló sus propias
técnicas para doblar papel en formas esculpidas inusuales (que dieron lugar al
campo del origami computacional).[ CITATION Ins21 \l 12298 ]
Desarrollo también el procedimiento de codificación Huffman mientras se
encontraba como estudiante en el MIT. El “código de Huffman” está presente
hoy en día en casi todas las aplicaciones que precisan de un sistema eficiente de
representación de información de código binario.[ CITATION Jos03 \l 12298 ]
El algoritmo descrito por David Huffman asigna a cada símbolo a un nodo hoja
de un árbol de código binario estos nodos están ponderados por el número de
apariciones del símbolo correspondiente llamado frecuencia costo. [ CITATION
Int07 \l 12298 ]
La estructura de árbol es el resultado de combinar los nodos paso a paso hasta
que todos se incrustan en un árbol raíz. El algoritmo siempre combina los dos
nodos que proporcionan la frecuencia más baja en un procedimiento de abajo
hacia arriba. Los nuevos nodos interiores obtienen la suma de las frecuencias de
ambos nodos secundarios. Las ramas del árbol representan los valores binarios
(1,0) y de acuerdo con las reglas para arboles de códigos libre de prefijos
4
comunes. La ruta desde el árbol raíz hasta el nodo hoja correspondiente definen
la palabra de código particular.[ CITATION Int07 \l 12298 ]
2. JUSTIFICACION
5
programa los hace difícil de entender llegando al problema de no entender la
codificación de Huffman y lo que trato de solucionar con su algoritmo.
3. OBJETIVOS
3.1. OBJETIVO GENERAL
Obtener una interfaz amigable y de fácil manejo para que el usuario pueda
ingresar las palabras y así obtener el diseño del árbol.
6
4. METODOLOGIA
Para poder lograr con nuestros objetivos planteados para el presente proyecto
utilizaremos una gran variedad de métodos y herramientas que nos faciliten la
creación e implementación del proyecto los cuales son:
4.1 INVESTIGACION
Investigamos las opciones que teníamos para trabajar nuestro proyecto como
son: la plataforma de Guide, librerías, lenguaje de programación en Matlab. Lo
cual se trató de buscar las herramientas más accesibles y de fácil manejo al
momento de programar.
7
Investigamos datos ya planteados acerca de programas similares, lo que
buscamos con esto es tener la mayor información posible de como plantear
nuestro programa
4.2 CONOCIMIENTOS
Tener claro temas como: características y creación del código de Huffman,
implementación y funcionalidad del árbol de Huffman, comportamiento de las
condiciones que trata Huffman de demostrar, conceptos básicos como códigos
de Shannon-Fano, etc.
4.3 PROCEDIMIENTOS
Primeramente, ya teniendo todo el conocimiento necesario para introducirse de
lleno a trabajar en el proyecto establecido se vio como algo fundamental realizar
el respectivo cronograma el cual ayudara a tener una organización, y poder
verificar los avances que se tiene con el proyecto, así planteándose cada semana
un objetivo que cumplir.
8
esto teniendo en cuenta muchos conceptos ya adquiridos en la materia de teoría
de la información y referencias del programa que se utiliza para este proyecto.
5. CONTENIDO TEMATICO
5.1 INTRODUCCION
Este informe reúne diversos conceptos aprendidos en la materia de teoría de la
información y programación aplicada, los cuales son necesarios tener en cuenta
a lo largo de nuestro camino profesional, por medio de este proyecto se busca
enlazar todos esos conocimientos para crear un programa que ayude al usuario a
crear un árbol de Huffman con las frecuencias de las letras más usadas en el
idioma del español tomando en cuenta que dichas frecuencias tienen su
respectiva probabilidad de uso y también estas mismas basando en el libro de la
REGENTA el cual establece la frecuencias de cada letra y signo usado en este
mismo estas probabilidades también se las verifico en el libro de Secret and
Urgent - The Story of Codes and Ciphers esto nos llevó a una conclusión de
cómo utilizar las herramientas que contamos en el programa de Matlab y
también las herramientas de la materia misma.
5.2 MATLAB
Programa basado en matemáticas, gráficos, programación y otras opciones más
nos permite realizar un análisis de datos como desarrolladores de algoritmos o
creadores de modelos, Matlab se ha diseñado para una interacción más profunda
con el programador y el programa.
9
Ilustración 1. Logo de Matlab
5.3 GUIDE
Crear o editar un archivo de interfaz de usuario en GUIDE. Es un entorno de
diseño de interfaz de usuario, desde el cuadro de diálogos de inicio rápido se
puede elegir abrir una interfaz de usuario creada anteriormente o crear una nueva
usando las plantillas predeterminadas.
10
Ilustración 2. Pantalla de Inicio de GUIDE.
11
Ilustración 4. Ilustración del botón de pulsar.
5.5 EDIT TEXT
Los controles “edit text” despliega líneas de teto editables. El botón “edit text”
usualmente se utiliza para ajustar con capturar la propiedad “String”, con el
ajuste se despliega el nuevo valor de la propiedad y con la captura es posible el
procesamiento de la información dentro del código. Es decir que el usuario
puede cambiar su texto interactivamente porque existe la forma de invocar la
rutina callback asociada con esta misma.
12
Ilustración 6. Texto estático, herramienta en Guide.
5.7 AXES
Axes crea los ejes cartesianos predeterminados en la figura actual y los convierte
en los ejes actuales. Por lo general, no es necesario crear ejes antes de trazar, ya
que las funciones gráficas crean ejes automáticamente al trazar si no existen.
5.8 CALLBACK
Es una propiedad importante en la que especifica el “callback” o código que se
ejecuta cuando el usuario activa el botón. Cuando se añade por primera vez un
componente al GUIDE, la propiedad “callback” es ajustada al valor de caracteres
“codificación_huffman”. Por defecto, se puede observar, que cuando se instala
por primera vez un botón “Push Button” se le asigna como leyenda genérica el
nombre “pushbutton1_Callback” y para el caso del archivo
“codificación_huffman se optó por dicha denominarlo con otro nombre.
13
5.9 FUNCTION
function [y1, ..., yN] = myfun (x1, ..., xM) declara una función denominada
myfun que acepta entradas x1, ..., xM y devuelve salidas y1, ..., yN. Esta
instrucción de declaración debe ser la primera línea ejecutable de la función. Los
nombres de función válidos empiezan por un carácter alfabético y pueden
contener letras, números o guiones bajos.
5.10 READTABLE
T = readtable(filename) crea una tabla leyendo datos orientados a columnas de
un archivo.
readtable crea una variable T para cada columna del archivo y lee los nombres
de las variables de la primera fila del archivo. De forma predeterminada, crea
variables que tienen tipos de datos que son apropiados para los valores de datos
detectados en cada columna del archivo de entrada, readtable.
14
5.12 UNIQUE
Valores únicos en array. C = unique (A) devuelve los mismos datos que en A,
pero sin repeticiones. C está en orden ordenada.
Generalmente, contiene el índice más bajo para cada valor del que es
miembro. Los valores de indican de dónde no es miembro.
LocbBAB0AB
Si 'rows' se especifica la opción, entonces contiene el índice más bajo
para cada fila en que también es una fila. Los valores de indican dónde
no es una fila de. LocbBAB0AB
Si Ay Bson tablas o horarios, entonces contiene el índice más bajo para
cada fila que también es una fila. Los valores de indican dónde no es una
fila de. LocbBAB0AB
5.14 ACCUMARRAY
A = accumarray (subs, val) devuelve array A por elementos de acumulación de
vector val utilizando los subíndices subs. Si subs es un vector de columna,
entonces cada elemento define un subíndice correspondiente en la salida, que
también es un vector de columna. La accumarray función recopila todos los
elementos val que tienen subíndices idénticos subs y almacena su suma en la
ubicación A correspondiente a ese subíndice (for index i,
A(i)=sum(val(subs(:)==i))). Los elementos A cuyos subíndices no aparecen en
subs son iguales a 0.
15
5.15 FOR
for index = values, statements, end ejecuta un grupo de instrucciones en un bucle
un número especificado de veces. Values tiene una de las siguientes formas:
initVal: step: endVal: incrementa index según el valor de step en cada iteración o
disminuye index cuando step es negativo.
5.16 NUM_BITS
Calcula el número de bits con los que codificar. En un sistema binario, se
necesitan n bits para codificar 2 ^ n elementos, por lo que el número de bits a
usar en el codificador Huffman es simplemente el log-base2 del número de
elementos a codificar.
num_bits = ceil(log2(length(prob_dist)))
5.17 WHILE
while expression, statements, end evalúa una expresión y repite la ejecución de
un grupo de instrucciones en un bucle mientras que la expresión es verdadera.
Una expresión es verdadera cuando su resultado no está vacío y contiene solo
elementos no nulos (numéricos reales o lógicos). De lo contrario, la expresión es
falsa.
5.18 TREEPLOT
treeplot(p)traza una imagen de un árbol dado un vector de punteros principales,
con p(i)= 0 para una raíz.
16
Ilustración 8. Grafica de un árbol con el comando treeplot(p).
17
Tabla 1. Tabla de códigos de longitud variable para codificar
18
5.21 FRECUENCIA DE LETRAS EN ESPAÑOL
El análisis y cálculo de la frecuencia de letras como signos en una legua es
difícil y esto debido a su interpretación. Se cuenta la frecuencia de las letras de
un texto arbitrariamente largo como “La regenta” debido a su uso de letras y
signos en el español se tomó en cuenta sus tablas de frecuencias como indicación
para el programa debido al uso frecuente y repetición de las todas las letras del
alfabeto español.
T Fre
a cue Frec.rel
b ncia %
l
a
2
.
T
a
b
l
a
d
e
f
r
e
c
u
e
n
c
i
a
s
“
19
L
a
r
e
g
e
n
t
a
”
d
e
l
e
t
r
a
s
y
s
i
g
n
o
s
e
n
e
l
e
s
p
a
ñ
20
o
l.
S
i
g
n
o
e 305 1
s 290 7
p ,
a 5
ci 9
o 9
a 186 1
459 0
,
7
4
9
e 171 9
111 ,
8
6
4
o 119 6
217 ,
8
7
2
s 101 5
317 ,
8
4
1
r 892 5
21
43 ,
1
4
5
n 875 5
85 ,
0
4
9
l 835 4
24 ,
8
1
5
i 687 3
91 ,
9
6
6
d 672 3
15 ,
8
7
5
u 562 3
87 ,
2
4
5
t 539 3
37 ,
1
0
9
c 523 3
46 ,
22
0
1
8
m 365 2
00 ,
1
0
4
p 339 1
70 ,
9
5
8
b 266 1
58 ,
5
3
7
. 260 1
79 ,
5
0
3
, 244 1
47 ,
4
0
9
q 177 1
73 ,
0
2
5
í 174 1
93 ,
0
23
0
8
v 154 0
91 ,
8
9
3
g 152 0
02 ,
8
7
6
h 137 0
96 ,
7
9
5
y 136 0
19 ,
7
8
5
ó 879 0
2 ,
5
0
7
f 845 0
4 ,
4
8
7
j 642 0
8 ,
3
7
24
1
á 620 0
7 ,
3
5
8
z 554 0
9 ,
3
2
é 514 0
1 ,
2
9
6
; 365 0
8 ,
2
1
1
ñ 350 0
1 ,
2
0
2
ú 128 0
6 ,
0
7
4
x 122 0
4 ,
0
7
1
: 941 0
25
,
0
5
4
ü 89 0
,
0
0
5
k 59 0
,
0
0
3
w 20 0
,
0
0
1
26
Tabla 3. Tabla de frecuencias de letras en español de criptografía.
Nota: como último análisis se pudo concluir que para mejorar el programa sería
mejor utilizar el código ASCII ya que este es universal en el lenguaje de la
máquina.
6. CONCLUSIONES Y RECOMENDACIONES
CONCLUSIONES
Se logro crear un programa que permita al usuario obtener el árbol y
codificación de Huffman, teniendo como único ingreso la palabra o palabras que
el usuario valla a ingresar, por lo tanto, se disminuye el tiempo en que el usuario
tenía que ingresar más datos.
Este proyecto cumple con la función principal de crear un árbol de Huffman
mediante programación y funciones internas de Matlab.
27
Se busco generar una interfaz gráfica acorde al programa, de modo que el
usuario si tiene dudas sobre que es la codificación de Huffman y el árbol de
Huffman se le implemento un menú de ayuda para que este consulte.
RECOMENDACIONES
Trabajar en sincronía con el cronograma establecido al inicio del proyecto fue
fundamental para ir cumpliendo con todas las actividades planteadas, con esto se
evitó retrasos y aglomeraciones de trabajo al final.
Realizar una investigación previa sobre el programa y de algunos ejemplos
similares al proyecto, que se encuentran en internet sirvió como base y guía al
momento de ir construyendo el programa. Además, tener claro los contenidos
teóricos de programación y de la materia de Teoría de la información.
Presentar un interfaz grafico que sea entendible para el usuario, con esto se
evitara problemas al momento de su manipulación.
Tener en consideración que cuando se trabaja, es recomendable tener dividido el
programa por partes y comentada ya que este mismo puedo sufrir alguna
alteración o perdida de datos para su funcionamiento.
7. REFERENCIAS
Engineers, I. o. (2021). IEEE.org. Obtenido de
https://www.computer.org/profiles/david-huffman
Internet Archive . (21 de Agosto de 2007). Obtenido de
https://web.archive.org/web/20070821221604/http://www.binaryessence.
com/dct/en000041.htm
Mina, E. A. (23 de 05 de 2016). Universidad del Valle. Obtenido de
https://www.slideshare.net/estediaz/grafos-92-2016
Ocampo, Y. C. (18 de 05 de 2016). Codificacion Huffman Mejorada con
Cifrado Datos. Obtenido de
https://d1wqtxts1xzle7.cloudfront.net/52587439/Codificacion-huffman-
mejorada.pdf?1491958458=&response-content-disposition=inline
%3B+filename
%3DCodificacion_Huffman_Mejorada_con_Cifrad.pdf&Expires=16139
48224&Signature=fdXt5yjvGxvt~IarV4ptSuZ5aYfc9GCygFGlao
Prieto, J. L. (14 de Octubre de 2003). Glosario Terminologia Informatica.
Obtenido de http://www.tugurium.com/gti/termino.php?Tr=Huffman
%2C%20David%20Albert&Tp=P&Or=0
28
29
8. ANEXOS
30
8.1 MANUAL DEL PROGRAMADOR
6
3
5
4
31
Ilustración 11. Manual del Programador Anexo 2.
32
16
15
13
10
12
14
11
.
10. Herramientas de Guide.
11. Push button: esta herramienta se utilizará para crear un botón.
12. Edit text: se utilizará para poner un cuadro de texto estático en la
interfaz.
13. Herramientas para crear menús de ayuda.
14. Axes: donde se podrá visualizar las figuras de la programación.
15. En esta opción podremos guardar todo el avance de la Guide.
16. En esta opción podremos visualizar como va quedando nuestra interfaz
en Guide
17
18
33
Ilustración 14. Manual del Programador Anexo 5.
17. Menú de edición de las características de los botones, este menú aparece
pulsando dos veces clic izquierdo en cualquier herramienta de Guide que
desee editar sus propiedades.
18. String: en este apartado podremos editar los nombres de las herramientas
de Guide.
19
34
20
21
35
21. En este apartado cargaremos nuestra imagen que va a servir como fondo
de pantalla y también cargaremos la hoja de Excel con las frecuencias
que se van a utilizar en el programa.
22. En este apartado ya empezamos con la programación de cada objeto que
se va a utilizar en el programa. Comenzando con la imagen de fondo de
pantalla de nuestro interfaz.
23. Esta programación nos permitirá poner fondo de pantalla a nuestra
interfaz como lo indica la siguiente ilustración.
23
36
Ilustración 19. Manual del Programador Anexo 10.
25
26
37
28
29
38
30
31
32
39
33
34
35
36
40
37
38
41
8.2 MANUAL DEL USUARIO
El presente manual de usuario está organizado de acuerdo al procedimiento
que deber seguir el usuario para obtener los resultados deseados.
3 4
42
5. Menú de ayuda para el usuario.
43
7
44
9. VITA
Autor: Jhonatan Paul Lapo Chuquimarca
45
10. CODIGO DEL PROGRAMA
A continuación, se presenta las partes más importantes del código.
46
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
% --- Outputs from this function are returned to the command line.
function varargout = Codigo_Huffman_OutputFcn(hObject, eventdata,
handles)
% varargout cell array for returning output args (see VARARGOUT);
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
47
clc;
axes(handles.axes1)
%% Ingreso de las palabras del usuario
word = get(handles.edit1,'String');%edita el nombre del cuadro de
edicion
rep = accumarray(ix,1);
rep=rep';
prob = prob.* rep;
48
% Crea nuevo simbolo
new_node = strcat(clase_str(2),clase_str(1));
new_prob = sum(sorted_prob(1:2));
% Se recorre el simbolo usado del viejo
clase_str = clase_str(3:length(clase_str));
sorted_prob = sorted_prob(3:length(sorted_prob));
% Agregamos un nuevo simbolo detras del viejo
clase_str = [clase_str, new_node];
sorted_prob = [sorted_prob, new_prob];
% Agregamos un nuevo simbolo
newq_str(rear) = new_node;
newq_prob(rear) = new_prob;
rear = rear + 1;
end
%% Formulario de datos del arbol de Huffman
tree = [newq_str,init_str];
tree_prob = [newq_prob, init_prob];
% Usamos la clase de elementos de arbol completo
[sorted_tree_prob,indeces] = sort(tree_prob,'descend');
sorted_tree = tree(indeces);
%% Calculos de los parametros del arbol
parent(1) = 0;
num_children = 2;
for i = 2:length(sorted_tree)
me = sorted_tree{i};% Extraemos el simbolo
% Buscamos un parecido de simbolo
count = 1;%el cout busca simbolos parecidos en las frecuencias
parent_maybe = sorted_tree{i-count};
diff = strfind(parent_maybe,me);
while (isempty(diff))
count = count + 1;
parent_maybe = sorted_tree{i-count};
diff = strfind(parent_maybe,me);
end
parent(i) = i - count;
end
%% Traza el arbol de Huffman
treeplot(parent);
title(strcat('Arbol de Codigo de Huffman - "',word,'"'));
%% Simbolos del arbol y sus probabilidades
display(sorted_tree);
display(sorted_tree_prob)
%% Extraccion de parametros del arbol
[xs,ys,h,s] = treelayout(parent);
text(xs,ys,sorted_tree);
% etiquetado de los bordes del arbol
for i = 2:length(sorted_tree)
% Uso las coordenadas para acomodarlo
my_x = xs(i);
my_y = ys(i);
% Uso el parentesco de las coordenadas
parent_x = xs(parent(i));
parent_y = ys(parent(i));
% Calculo el ancho de las coordenadas (midpoint)
mid_x = (my_x + parent_x)/2;
mid_y = (my_y + parent_y)/2;
%Calculo el ancho (Positiva = 1, Negativa = 0)
slope = (parent_y - my_y)/(parent_x - my_x);
if (slope > 0)
weight(i) = 1;
else
49
weight(i) = 0;
end
text(mid_x,mid_y,num2str(weight(i)));
end
%% Calculo del libro de Huffman
for i = 1:length(sorted_tree)
% Codigo de inicializar
code{i} = '';
% Crear un ciclo para encontra el parentesco
index = i;
p = parent(index);
while(p ~= 0)
w = num2str(weight(index));
code{i} = strcat(w,code{i});
index = parent(index);
p = parent(index);
end
end
% Salida de la consola-Libro de codigos de Huffman
codeBook=[sorted_tree', code']
axis on
axes(handles.axes3);
set(handles.axes3, 'visible', 'off')
cla
%para graficar los codigos de huffman
P = strcat(char(sorted_tree),'= ',char(code));
text('Interpreter','latex',...
'String',P,...
'Position',[0.3 .6],...
'FontSize',14);
50
% handles empty - handles not created until after all CreateFcns
called
% --------------------------------------------------------------------
function Untitled_1_Callback(hObject, eventdata, handles)
% hObject handle to Untitled_1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% --------------------------------------------------------------------
function Codificacion_Callback(hObject, eventdata, handles)
% hObject handle to Codificacion (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
winopen('codificacion.pdf');%para llamar el archivo pdf que ingresamos
en la misma carpeta
% --------------------------------------------------------------------
function arbol_Callback(hObject, eventdata, handles)
% hObject handle to arbol (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
winopen('arbol.pdf');
51
function axes2_CreateFcn(hObject, eventdata, handles)
% hObject handle to axes2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns
called
52