SlideShare una empresa de Scribd logo
1 de 18
CODIGOS DE HUFFMAN
Definición : La codificación de Huffman es una
técnica para la compresión de datos, ampliamente
usada y muy efectiva
Ejemplo : Fichero con 100.000 caracteres. Se sabe
que aparecen 6 caracteres diferentes y la frecuencia
de aparición de cada uno de ellos es :
a b c d e f
Frecuencia
( en miles )
45 13 12 16 9 5
¿ Cómo codificar los caracteres para comprimir el
espacio ocupado utilizando un código binario ?
Solución 1 : Código de longitud fija
Para 6 caracteres se necesitan 3 bits (300000 bits)
Fija 000 001 010 011 100 101
Solución 2 : Código de longitud variable en el que
los más frecuentes tienen el código más corto.
Restricción : ningún código es prefijo de otro.
( 224000 bits )
Variable 0 101 100 111 1101 1100
1
Esta técnica de codificación se denomina código
prefijo.
⇒ Codificación : Basta con concatenar el código
de cada uno de los caracteres.
Ejemplo :
aabacd ≡ 0⋅0⋅101⋅0⋅100⋅111≡ 001010100111
⇒ Descodificación : Fácil porque ningún código
es prefijo de otro código ⇒ NO hay
ambigüedad.
Ejemplo :
101011101111011100 ≡ badadcf
¡ Es la única posibilidad !
Un árbol binario es una forma de representar el
código prefijo que simplifica el proceso de
descodificación :
las hojas son los caracteres,
el camino de la raíz a la hojas con la interpretación
0 a la izquierda y 1 a la derecha nos da el código
de cada hoja.
2
Este sería el árbol binario de la codificación de
longitud fija:
Y éste el de la codificación de longitud variable :
3
100
86 14
58 28 14
0
0
1
1
a:45 b:13 f:5c:12 d:16 e:9
0 0
0
0 1 1 1
a:45
b:13c:12 d:16
e:9f:5
0
0
0
0
0
1
1
1
1
100
55
25 30
14
1
Dado T el árbol binario que corresponde a una
codificación prefijo, es fácil averiguar el número de
bits necesarios para codificar el fichero :
Para cada carácter c diferente del alfabeto C que
aparece en el fichero,
⇒ sea f(c) la frecuencia de c en la entrada,
⇒ sea dT(c)la profundidad de la hoja c en el árbol
T, entonces el número de bits requeridos es :
B(T) = ∑ f(c)⋅ dT(c)
c∈ C
B(T) nos da el coste de T.
Algoritmo Greedy
Huffman inventó un algoritmo voraz que construye
una codificación prefijo óptima.
⇒ Construye un árbol binario de códigos de
longitud variable de manera ascendente de
modo que [MIN] B(T).
Ejemplo de funcionamiento
Fase 1. : Caracteres colocados en orden creciente de
frecuencia.
Fase 2. y posteriores : Fusionar hasta obtener un
sólo árbol manteniendo la ordenación creciente.
4
f:5 e:9 c:12 b:13 d:16 a:45
5
c:12 b:13 d:16 a:4514
f:5 e:9
0 1
14
f:5 e:9
0 1
d:16 a:4525
c:12 b:13
0 1
25
c:12 b:13
0 1
a:4530
d:1614
f:5 e:9
0 1
0 1
6
30
d:1614
f:5 e:9
0 1
0 1
25
c:12 b:13
0 1
a:45 55
0 1
a:45
b:13
bb:1
3
c:12 d:16
e:9f:5
0
0
0
0
0
1
1
1
1
100
55
25 30
14
1
Implementación del algoritmo
Se usa una cola de prioridad, Q, con clave la
frecuencia lo que permite seleccionar los dos objetos
de la cola con la frecuencia más baja.
El resultado de fusionar dos objetos es un nuevo
objeto cuya frecuencia es la suma de frecuencias de
los dos objetos fusionados.
función COD_HUF ( C es conj_<car,frec> )
{ Pre : C está bien construido y no es vacio }
n := C;
CO:= ordenar_crec_por_frec(C) ;
/* se ordena crecientemente por frecuencia el
conjunto de caracteres de la entrada */
Q := Insertar_todos (CO);
/* la cola contiene todos los elementos */
Para i=1 hasta n-1 hacer
z:= crear_objeto();
/* elección de los candidatos */
x := izq(z) := primero(Q); Q:= avanzar(Q);
y:= der(z) := primero(Q); Q:= avanzar(Q);
frec[z] := frec[x] + frec[y];
/* actualizar solución */
Q:= insertar_ordenado ( Q, z);
fpara
{ Post : Q contiene un único elemento que es un
árbol de codificación de prefijo óptimo }
dev ( primero(Q))
ffunción
7
Demostración de optimalidad del criterio
• Sea T un árbol binario de codificación óptimo.
• Sean b y c dos hojas hermanas en T que se
encuentran a profundidad máxima.
• Sean x e y dos hojas de T tales que son los 2
caracteres del alfabeto C con la frecuencia más
baja.
árbol T
Vamos a ver que T, que es un árbol óptimo, se puede
transformar en otro árbol T’’, también óptimo, en el
que los 2 caracteres, x e y, con la frecuencia más
baja serán hojas hermanas que estarán a la máxima
profundidad ⇒ El árbol que genera el algoritmo
voraz cumple exactamente esa condición.
8
y
b c
x
Podemos suponer que f[b] ≤ f[c] y que f[x] ≤ f[y].
Además, se puede deducir que f[x] ≤ f[b] y f[y] ≤
f[c].
Se puede construir un nuevo árbol, T’, en el que se
intercambia la posición que ocupan en T las hojas b
y x.
árbol T’
B(T) – B(T’) =∑f[c].dT(c) –∑f[c].dT’(c) =
c∈C c∈C
= f[x].dT(x) + f[b].dT(b) –
f[x].dT’(x) – f[b].dT’(b) =
= f[x].dT(x) + f[b].dT(b) –
9
y
x c
b
f[x].dT (b) –f[b].dT (x) =
= ( f[b] – f[x] ) . ( dT(b) – dT (x) ) ≥ 0
De forma similar, se construye el árbol T’’
intercambiando c e y.
árbol T’’
Con este intercambio tampoco se incrementa el coste
y B(T’) − B(T’’) ≥ 0.
Por tanto, B(T’’) ≤ B(T) y como T es óptimo,
entonces T’’ también lo es y B(T’’) = B(T).
Y ya para acabar la demostración :
10
c
x y
b
Sea T un árbol binario que representa un código
prefijo óptimo para un alfabeto C. Consideremos 2
hojas hermanas, x e y, de T y sea z el padre de
ambas. Consideremos que la frecuencia de z es f[z]
= f[x] + f[y].
Entonces, el árbol T’ = T–{x,y} representa un código
prefijo óptimo para el alfabeto C’ = C – {x, y}∪ {z}.
Precisamente eso es lo que hace el algoritmo voraz :
una vez que ha fusionado los dos caracteres de
frecuencia más baja, inserta un nuevo elemento en el
alfabeto con su frecuencia y repite el proceso de
seleccionar los dos elementos con frecuencia más
baja ahora para un alfabeto con un elemento menos.
11
CAMINOS MINIMOS
Shortest-paths problem
Definiciones
Sea G=(V,E) un grafo dirigido y etiquetado con valores
naturales.
Se define el peso del camino p, con p=<v0,v1,v2, ...,vk>,
como la suma de los valores de las aristas que lo
componen.
k
peso(p) = ∑valor(G,vi-1,vi)
i=1
Se define el camino de peso mínimo del vértice u al v
en G, con u,v ∈V, con la siguiente función :
 MIN{ peso(p) : u ∼>v }
 si hay camino de u a v
δ(u,v) = 
 ∞ en otro caso
El camino más corto, camino mínimo, de u a v en G, se
define como cualquier camino p tal que peso(p) =
δ(u,v).
Los problemas de caminos mínimos
1/ Single_source shortest_paths problem :
12
Encontrar el camino más corto entre un vértice fijado,
source, y todos los vértices restantes del grafo.
2/ Single_destination shortest_paths problem
Encontrar el camino más corto desde todos los vértices
a uno fijado, destination.
3/ Single_pair shortest_paths problem : Fijados dos
vértices del grafo, source y destination, encontrar el
camino más corto entre ellos.
4/ All_pairs shortest_paths problem : Encontrar el
camino más corto entre los vértices u y v, para todo par
de vértices del grafo.
El algoritmo de Dijkstra (1959)
Resuelve el problema de encontrar el camino más corto
entre un vértice dado y todos los restantes del grafo.
función DIJKSTRA ( g es grafo; v_ini es vértice )
dev ( D es vector[1..n] de naturales )
{ Pre : g=(V,E) es un grafo etiquetado con valores
naturales dirigido. Se supone que el grafo está
implementado en una matriz y que M[i,j] contiene el
valor de la arista que va del vértice i al j y, si no hay
arista, contiene el valor infinito }
Para cada v∈V hacer D[v] := M[v_ini, v] fpara;
13
D[v_ini]:= 0;
VISTOS := añadir( conjunto_vacio, v_ini );
{ Inv : ∀u : u∈ V−VISTOS: D[u] contiene la longitud
del camino más corto desde v_ini a u que no sale de
VISTOS, es decir, el camino está formado por v_ini y
una serie de vértices todos ellos pertenecientes a
VISTOS excepto el propio u.
∀u : u ∈ VISTOS: D[u] contiene la longitud del
camino más corto desde v_ini a u }
*[ |VISTOS| < |V| --->
u := MINIMO( D, u∈V−VISTOS );
/* el candidato es el vértice u∈V-VISTOS que
tiene D mínima */
VISTOS := VISTOS ∪{u};
Para cada v ∈ suc(g,u) t.q. v ∈V−VISTOS hacer
/* Ajustar D : Recalcular los valores para
aplicar la función de selección sobre los
candidatos que quedan */
[ D[v] > D[u] + valor( g,u,v ) --->
D[v] := D[u] + valor( g,u,v );
[] D[v] ≤ D[u] + valor ( g,u,v ) ---> seguir
]
fpara;
]
{ Post : ∀u : u∈V: D[u] contiene la longitud del
camino más corto desde v_ini a u que no sale de
VISTOS, y como VISTOS ya contiene todos los vértices,
se tienen en D las distancias mínimas definitivas }
14
dev ( D )
ffunción
Coste
Grafo implementado en matriz θ(n2
):
•El bucle que inicializa el vector D cuesta θ(n).
•El bucle principal efectúa n-1 iteraciones.
•Coste de cada iteración : la obtención del mínimo,
coste lineal, y el ajuste de D que también es θ(n).
Grafo implementado con listas + Heap de mínimos
θ((n+|E|).log n) :
•La construcción del Heap θ(n.log n),
•Seleccionar el mínimo cuesta θ(1),
•Cada operación de ajuste requerirá θ(log n).
•En total se efectuan θ(|E|) operaciones de ajustar D.
Demostración:
Sea u un vértice tal que u∈V−VISTOS.
Supongamos que D[u] contiene información cierta, es
decir, contiene la distancia mínima entre el vértice
inicial y u siguiendo por un camino que sólo contiene
vértices que pertenecen a VISTOS.
•Si u es el vértice con el valor de D más pequeño, el
criterio de selección lo elegirá como candidato e
inmediatamente pasará a formar parte de VISTOS y
15
se considerará que su D[u] es una distancia
definitiva.
Supongamos que no es CIERTO, es decir, que existe un
camino más corto, aún no considerado, desde el vértice
inicial a u que pasa por v, obviamente v∈V−VISTOS.
Si v se encuentra en el camino más corto desde el
vértice inicial a u, ¡ es que D[v]<D[u] ! lo que
contradice la elección de u.
⇒ siempre que D contenga información correcta, la
función de selección elige un vértice con un valor de D
ya definitivo (ninguno de los vértices que no están en
VISTOS lograrán que se reduzca ).
Ejemplo de funcionamiento
0 1
2
4
3 5
2
1
1
1
12
2
6
5
Vértice inicial : vértice con etiqueta 0.
D : 0 1 2 3 4 5 VISTOS
0 2 5 2 ∞ ∞ { 0 }
0 2 3 2 3 ∞ {0,1}
0 2 3 2 3 8 {0,1,3}
16
0 2 3 2 3 5 {0,1,3,2}
0 2 3 2 3 4 {0,1,3,2,4}
0 2 3 2 3 4 {0,1,3, 2,4,5}
RECONSTRUCCION DE CAMINOS MINIMOS
•En primer lugar hay que almacenar información para
saber que vértices forman parte del camino de
longitud mínima que parte del vértice inicial.
función DIJKSTRA_CAM ( g es grafo;
v_ini es vértice )
dev ( D, CAMINO es vector[1..n] de natural )
{ Pre : la misma que DIJKSTRA }
Para cada v∈V hacer
D[v] := M[v_ini, v]; CAMINO[v]:= v_ini;
fpara;
D[v_ini]:= 0;
VISTOS := añadir( conjunto_vacio, v_ini );
*[ |VISTOS| < |V| --->
u := MINIMO( D, u∈V−VISTOS );
VISTOS := VISTOS∪{u};
Para cada v ∈ suc(g,u) t.q. v ∈V−VISTOS hacer
[ D[v] > D[u] + valor( g,u,v ) --->
D[v] := D[u] + valor( g,u,v );
CAMINO[v]:= u;
[] D[v] ≤ D[u] + valor ( g,u,v ) ---> seguir
]
fpara;
]
17
{ Post : La misma de Dijkstra y ∀u : u∈V: CAMINO[u]
contiene el otro vértice de la última arista del camino
mínimo de v_ini a u}
dev ( D, CAMINO )
ffunción
•En segundo lugar utilizar un procedimiento recursivo,
RECONSTRUIR, que recibe el vértice para el cual
se quiere reconstruir el camino, v, y el vector
CAMINO.
función RECONSTRUIR ( v, v_ini es vértice;
CAMINO es vector[1..n] de vértices )
dev ( s es secuencia_aristas )
[ v = v_ini ---> s := secuencia_vacia;
[] v ≠ v_ini --->
u := CAMINO[v];
s := RECONSTRUIR( u,v_ini,CAMINO);
s := concatenar( s, (u, v) );
]
{ Post : s contiene las aristas del camino mínimo desde
v_ini a v }
dev ( s )
ffunción
18

Más contenido relacionado

La actualidad más candente

Algoritmo de dijkstra final
Algoritmo de dijkstra finalAlgoritmo de dijkstra final
Algoritmo de dijkstra finalsalomon
 
Algoritmo de Dijkstra
Algoritmo de DijkstraAlgoritmo de Dijkstra
Algoritmo de DijkstraPedro Miranda
 
Matematica III Derivada direccional
Matematica III Derivada direccionalMatematica III Derivada direccional
Matematica III Derivada direccionalLuis José Olivares
 
Concepto de integral indefinida
Concepto de integral indefinida Concepto de integral indefinida
Concepto de integral indefinida Jose R Padrón
 
Canal de comunicación y caos
Canal de comunicación y caosCanal de comunicación y caos
Canal de comunicación y caosdarg0001
 
Lección 1 y 2 de la unidad 5 grado 11
Lección 1 y 2 de la unidad 5 grado 11Lección 1 y 2 de la unidad 5 grado 11
Lección 1 y 2 de la unidad 5 grado 11tutor7
 
Producto escalar
Producto escalarProducto escalar
Producto escalarHenry Cueva
 
4 la derivada por formulas
4 la derivada por formulas4 la derivada por formulas
4 la derivada por formulasJesus Gil
 
Integrales infefinidas
Integrales infefinidasIntegrales infefinidas
Integrales infefinidasGlenda Freire
 
Funciones en varias variables, una introduccion
Funciones en varias variables, una introduccionFunciones en varias variables, una introduccion
Funciones en varias variables, una introduccioneecoronado
 
Integral indefinida
Integral indefinidaIntegral indefinida
Integral indefinidaruyepesro
 
Aplicaciones del Cálculo Diferencial
Aplicaciones del Cálculo DiferencialAplicaciones del Cálculo Diferencial
Aplicaciones del Cálculo DiferencialJuliho Castillo
 
Ejercicios detallados del obj 7 mat iii 733
Ejercicios detallados del obj 7 mat iii  733 Ejercicios detallados del obj 7 mat iii  733
Ejercicios detallados del obj 7 mat iii 733 Jonathan Mejías
 
M1 integral
M1 integralM1 integral
M1 integralFe
 

La actualidad más candente (20)

Algoritmo de dijkstra final
Algoritmo de dijkstra finalAlgoritmo de dijkstra final
Algoritmo de dijkstra final
 
Analisis numericoi tema5
Analisis numericoi tema5Analisis numericoi tema5
Analisis numericoi tema5
 
Algoritmo de Dijkstra
Algoritmo de DijkstraAlgoritmo de Dijkstra
Algoritmo de Dijkstra
 
Matematica III Derivada direccional
Matematica III Derivada direccionalMatematica III Derivada direccional
Matematica III Derivada direccional
 
Concepto de integral indefinida
Concepto de integral indefinida Concepto de integral indefinida
Concepto de integral indefinida
 
Canal de comunicación y caos
Canal de comunicación y caosCanal de comunicación y caos
Canal de comunicación y caos
 
Lección 1 y 2 de la unidad 5 grado 11
Lección 1 y 2 de la unidad 5 grado 11Lección 1 y 2 de la unidad 5 grado 11
Lección 1 y 2 de la unidad 5 grado 11
 
Problema de la ruta mas corta
Problema de la ruta mas cortaProblema de la ruta mas corta
Problema de la ruta mas corta
 
Producto escalar
Producto escalarProducto escalar
Producto escalar
 
4 la derivada por formulas
4 la derivada por formulas4 la derivada por formulas
4 la derivada por formulas
 
Integrales infefinidas
Integrales infefinidasIntegrales infefinidas
Integrales infefinidas
 
Funciones en varias variables, una introduccion
Funciones en varias variables, una introduccionFunciones en varias variables, una introduccion
Funciones en varias variables, una introduccion
 
Códigos lineales
Códigos linealesCódigos lineales
Códigos lineales
 
Integral indefinida
Integral indefinidaIntegral indefinida
Integral indefinida
 
Teoremas de derivadas
Teoremas de derivadasTeoremas de derivadas
Teoremas de derivadas
 
Unidad i luis r
Unidad i luis rUnidad i luis r
Unidad i luis r
 
Aplicaciones del Cálculo Diferencial
Aplicaciones del Cálculo DiferencialAplicaciones del Cálculo Diferencial
Aplicaciones del Cálculo Diferencial
 
Ejercicios detallados del obj 7 mat iii 733
Ejercicios detallados del obj 7 mat iii  733 Ejercicios detallados del obj 7 mat iii  733
Ejercicios detallados del obj 7 mat iii 733
 
M1 integral
M1 integralM1 integral
M1 integral
 
Algoritmo rsa
Algoritmo rsaAlgoritmo rsa
Algoritmo rsa
 

Destacado

Procesos productivos
Procesos productivosProcesos productivos
Procesos productivosdanielafredes
 
Junior's Notebook 2nd term
Junior's Notebook 2nd termJunior's Notebook 2nd term
Junior's Notebook 2nd termJunior Padilla
 
Portofolio albgpro "under construction"
Portofolio albgpro "under construction"Portofolio albgpro "under construction"
Portofolio albgpro "under construction"albmlkf
 
loisirs par Elaine et Cécile
loisirs par Elaine et Cécileloisirs par Elaine et Cécile
loisirs par Elaine et CécileMaria Olinda Reis
 
08 les-inventions-les-plus-folles-pour-la-maison
08 les-inventions-les-plus-folles-pour-la-maison08 les-inventions-les-plus-folles-pour-la-maison
08 les-inventions-les-plus-folles-pour-la-maisonDominique Pongi
 
06 une-serie-de-citations
06 une-serie-de-citations06 une-serie-de-citations
06 une-serie-de-citationsDominique Pongi
 
Smo Manuel Roulaud Aveclogo 20110821
Smo Manuel Roulaud Aveclogo 20110821Smo Manuel Roulaud Aveclogo 20110821
Smo Manuel Roulaud Aveclogo 20110821ROULAUD
 
Nuevo Modelo Olla GM E Freidora Con Voz
Nuevo Modelo Olla GM E Freidora Con Voz
Nuevo Modelo Olla GM E Freidora Con Voz
Nuevo Modelo Olla GM E Freidora Con Voz workmanqgoloisraw
 
Hackers lesly suarez marliryan lopez 10-2
Hackers lesly suarez   marliryan lopez 10-2Hackers lesly suarez   marliryan lopez 10-2
Hackers lesly suarez marliryan lopez 10-2leslytatiana
 
Colegio nacional nicolás esguerra html
Colegio nacional nicolás esguerra htmlColegio nacional nicolás esguerra html
Colegio nacional nicolás esguerra htmljuansebastian200028
 
Vous pensez avoir_tout_vu_2__36_
Vous pensez avoir_tout_vu_2__36_Vous pensez avoir_tout_vu_2__36_
Vous pensez avoir_tout_vu_2__36_Dominique Pongi
 
Rol y status
Rol y statusRol y status
Rol y statuslgarcia95
 
Una buena nutrición
Una buena nutriciónUna buena nutrición
Una buena nutriciónmerecedesk
 
GeckoData Predict, solution d'analyse de données
GeckoData Predict, solution d'analyse de donnéesGeckoData Predict, solution d'analyse de données
GeckoData Predict, solution d'analyse de donnéesNP6
 

Destacado (20)

Procesos productivos
Procesos productivosProcesos productivos
Procesos productivos
 
Junior's Notebook 2nd term
Junior's Notebook 2nd termJunior's Notebook 2nd term
Junior's Notebook 2nd term
 
Portofolio albgpro "under construction"
Portofolio albgpro "under construction"Portofolio albgpro "under construction"
Portofolio albgpro "under construction"
 
loisirs par Elaine et Cécile
loisirs par Elaine et Cécileloisirs par Elaine et Cécile
loisirs par Elaine et Cécile
 
08 les-inventions-les-plus-folles-pour-la-maison
08 les-inventions-les-plus-folles-pour-la-maison08 les-inventions-les-plus-folles-pour-la-maison
08 les-inventions-les-plus-folles-pour-la-maison
 
My trip to spain
My trip to spainMy trip to spain
My trip to spain
 
06 une-serie-de-citations
06 une-serie-de-citations06 une-serie-de-citations
06 une-serie-de-citations
 
Método científico
Método científicoMétodo científico
Método científico
 
Smo Manuel Roulaud Aveclogo 20110821
Smo Manuel Roulaud Aveclogo 20110821Smo Manuel Roulaud Aveclogo 20110821
Smo Manuel Roulaud Aveclogo 20110821
 
Las 7 c
Las 7 cLas 7 c
Las 7 c
 
Provence
ProvenceProvence
Provence
 
Nuevo Modelo Olla GM E Freidora Con Voz
Nuevo Modelo Olla GM E Freidora Con Voz
Nuevo Modelo Olla GM E Freidora Con Voz
Nuevo Modelo Olla GM E Freidora Con Voz
 
Hackers lesly suarez marliryan lopez 10-2
Hackers lesly suarez   marliryan lopez 10-2Hackers lesly suarez   marliryan lopez 10-2
Hackers lesly suarez marliryan lopez 10-2
 
Colegio nacional nicolás esguerra html
Colegio nacional nicolás esguerra htmlColegio nacional nicolás esguerra html
Colegio nacional nicolás esguerra html
 
Vous pensez avoir_tout_vu_2__36_
Vous pensez avoir_tout_vu_2__36_Vous pensez avoir_tout_vu_2__36_
Vous pensez avoir_tout_vu_2__36_
 
Rol y status
Rol y statusRol y status
Rol y status
 
Una buena nutrición
Una buena nutriciónUna buena nutrición
Una buena nutrición
 
DEPORTES
DEPORTESDEPORTES
DEPORTES
 
Las Redes Sociales
Las Redes SocialesLas Redes Sociales
Las Redes Sociales
 
GeckoData Predict, solution d'analyse de données
GeckoData Predict, solution d'analyse de donnéesGeckoData Predict, solution d'analyse de données
GeckoData Predict, solution d'analyse de données
 

Similar a Greedy (20)

Flujo en redes
Flujo en redesFlujo en redes
Flujo en redes
 
Grafos_presentación con ejercicios.pdf
Grafos_presentación con ejercicios.pdfGrafos_presentación con ejercicios.pdf
Grafos_presentación con ejercicios.pdf
 
Modelo del camino mas corto.pptx
Modelo del camino mas corto.pptxModelo del camino mas corto.pptx
Modelo del camino mas corto.pptx
 
Problema del viajante
Problema del viajanteProblema del viajante
Problema del viajante
 
S8-EDD-4.2 Aplicaciones de árboles en informática
S8-EDD-4.2 Aplicaciones de árboles en informáticaS8-EDD-4.2 Aplicaciones de árboles en informática
S8-EDD-4.2 Aplicaciones de árboles en informática
 
IO 2(REDES).pdf
IO 2(REDES).pdfIO 2(REDES).pdf
IO 2(REDES).pdf
 
Problemas redes
Problemas redesProblemas redes
Problemas redes
 
Presentación OR Problemas de Caminos Más Cortos
Presentación OR Problemas de Caminos Más CortosPresentación OR Problemas de Caminos Más Cortos
Presentación OR Problemas de Caminos Más Cortos
 
Ma475 semana 3_sesion_1_2016_0
Ma475 semana 3_sesion_1_2016_0Ma475 semana 3_sesion_1_2016_0
Ma475 semana 3_sesion_1_2016_0
 
R153041
R153041R153041
R153041
 
Tensor metrico
Tensor metricoTensor metrico
Tensor metrico
 
328912819-Cap-10-Secc-10-3-Ec-Parametricas-y-Calculo.pdf
328912819-Cap-10-Secc-10-3-Ec-Parametricas-y-Calculo.pdf328912819-Cap-10-Secc-10-3-Ec-Parametricas-y-Calculo.pdf
328912819-Cap-10-Secc-10-3-Ec-Parametricas-y-Calculo.pdf
 
Teorema de gauss
Teorema de gaussTeorema de gauss
Teorema de gauss
 
7 7 texto-diferencias_finitas-schvezov
7 7 texto-diferencias_finitas-schvezov7 7 texto-diferencias_finitas-schvezov
7 7 texto-diferencias_finitas-schvezov
 
Rutamascorta1
Rutamascorta1Rutamascorta1
Rutamascorta1
 
Algoritmo
AlgoritmoAlgoritmo
Algoritmo
 
134688864-Exposicion-Integrales-en-Linea.pptx
134688864-Exposicion-Integrales-en-Linea.pptx134688864-Exposicion-Integrales-en-Linea.pptx
134688864-Exposicion-Integrales-en-Linea.pptx
 
Transformaciones lineales
Transformaciones lineales Transformaciones lineales
Transformaciones lineales
 
algoritmos
algoritmosalgoritmos
algoritmos
 
Programacion matlab
Programacion matlabProgramacion matlab
Programacion matlab
 

Greedy

  • 1. CODIGOS DE HUFFMAN Definición : La codificación de Huffman es una técnica para la compresión de datos, ampliamente usada y muy efectiva Ejemplo : Fichero con 100.000 caracteres. Se sabe que aparecen 6 caracteres diferentes y la frecuencia de aparición de cada uno de ellos es : a b c d e f Frecuencia ( en miles ) 45 13 12 16 9 5 ¿ Cómo codificar los caracteres para comprimir el espacio ocupado utilizando un código binario ? Solución 1 : Código de longitud fija Para 6 caracteres se necesitan 3 bits (300000 bits) Fija 000 001 010 011 100 101 Solución 2 : Código de longitud variable en el que los más frecuentes tienen el código más corto. Restricción : ningún código es prefijo de otro. ( 224000 bits ) Variable 0 101 100 111 1101 1100 1
  • 2. Esta técnica de codificación se denomina código prefijo. ⇒ Codificación : Basta con concatenar el código de cada uno de los caracteres. Ejemplo : aabacd ≡ 0⋅0⋅101⋅0⋅100⋅111≡ 001010100111 ⇒ Descodificación : Fácil porque ningún código es prefijo de otro código ⇒ NO hay ambigüedad. Ejemplo : 101011101111011100 ≡ badadcf ¡ Es la única posibilidad ! Un árbol binario es una forma de representar el código prefijo que simplifica el proceso de descodificación : las hojas son los caracteres, el camino de la raíz a la hojas con la interpretación 0 a la izquierda y 1 a la derecha nos da el código de cada hoja. 2
  • 3. Este sería el árbol binario de la codificación de longitud fija: Y éste el de la codificación de longitud variable : 3 100 86 14 58 28 14 0 0 1 1 a:45 b:13 f:5c:12 d:16 e:9 0 0 0 0 1 1 1 a:45 b:13c:12 d:16 e:9f:5 0 0 0 0 0 1 1 1 1 100 55 25 30 14 1
  • 4. Dado T el árbol binario que corresponde a una codificación prefijo, es fácil averiguar el número de bits necesarios para codificar el fichero : Para cada carácter c diferente del alfabeto C que aparece en el fichero, ⇒ sea f(c) la frecuencia de c en la entrada, ⇒ sea dT(c)la profundidad de la hoja c en el árbol T, entonces el número de bits requeridos es : B(T) = ∑ f(c)⋅ dT(c) c∈ C B(T) nos da el coste de T. Algoritmo Greedy Huffman inventó un algoritmo voraz que construye una codificación prefijo óptima. ⇒ Construye un árbol binario de códigos de longitud variable de manera ascendente de modo que [MIN] B(T). Ejemplo de funcionamiento Fase 1. : Caracteres colocados en orden creciente de frecuencia. Fase 2. y posteriores : Fusionar hasta obtener un sólo árbol manteniendo la ordenación creciente. 4 f:5 e:9 c:12 b:13 d:16 a:45
  • 5. 5 c:12 b:13 d:16 a:4514 f:5 e:9 0 1 14 f:5 e:9 0 1 d:16 a:4525 c:12 b:13 0 1 25 c:12 b:13 0 1 a:4530 d:1614 f:5 e:9 0 1 0 1
  • 6. 6 30 d:1614 f:5 e:9 0 1 0 1 25 c:12 b:13 0 1 a:45 55 0 1 a:45 b:13 bb:1 3 c:12 d:16 e:9f:5 0 0 0 0 0 1 1 1 1 100 55 25 30 14 1
  • 7. Implementación del algoritmo Se usa una cola de prioridad, Q, con clave la frecuencia lo que permite seleccionar los dos objetos de la cola con la frecuencia más baja. El resultado de fusionar dos objetos es un nuevo objeto cuya frecuencia es la suma de frecuencias de los dos objetos fusionados. función COD_HUF ( C es conj_<car,frec> ) { Pre : C está bien construido y no es vacio } n := C; CO:= ordenar_crec_por_frec(C) ; /* se ordena crecientemente por frecuencia el conjunto de caracteres de la entrada */ Q := Insertar_todos (CO); /* la cola contiene todos los elementos */ Para i=1 hasta n-1 hacer z:= crear_objeto(); /* elección de los candidatos */ x := izq(z) := primero(Q); Q:= avanzar(Q); y:= der(z) := primero(Q); Q:= avanzar(Q); frec[z] := frec[x] + frec[y]; /* actualizar solución */ Q:= insertar_ordenado ( Q, z); fpara { Post : Q contiene un único elemento que es un árbol de codificación de prefijo óptimo } dev ( primero(Q)) ffunción 7
  • 8. Demostración de optimalidad del criterio • Sea T un árbol binario de codificación óptimo. • Sean b y c dos hojas hermanas en T que se encuentran a profundidad máxima. • Sean x e y dos hojas de T tales que son los 2 caracteres del alfabeto C con la frecuencia más baja. árbol T Vamos a ver que T, que es un árbol óptimo, se puede transformar en otro árbol T’’, también óptimo, en el que los 2 caracteres, x e y, con la frecuencia más baja serán hojas hermanas que estarán a la máxima profundidad ⇒ El árbol que genera el algoritmo voraz cumple exactamente esa condición. 8 y b c x
  • 9. Podemos suponer que f[b] ≤ f[c] y que f[x] ≤ f[y]. Además, se puede deducir que f[x] ≤ f[b] y f[y] ≤ f[c]. Se puede construir un nuevo árbol, T’, en el que se intercambia la posición que ocupan en T las hojas b y x. árbol T’ B(T) – B(T’) =∑f[c].dT(c) –∑f[c].dT’(c) = c∈C c∈C = f[x].dT(x) + f[b].dT(b) – f[x].dT’(x) – f[b].dT’(b) = = f[x].dT(x) + f[b].dT(b) – 9 y x c b
  • 10. f[x].dT (b) –f[b].dT (x) = = ( f[b] – f[x] ) . ( dT(b) – dT (x) ) ≥ 0 De forma similar, se construye el árbol T’’ intercambiando c e y. árbol T’’ Con este intercambio tampoco se incrementa el coste y B(T’) − B(T’’) ≥ 0. Por tanto, B(T’’) ≤ B(T) y como T es óptimo, entonces T’’ también lo es y B(T’’) = B(T). Y ya para acabar la demostración : 10 c x y b
  • 11. Sea T un árbol binario que representa un código prefijo óptimo para un alfabeto C. Consideremos 2 hojas hermanas, x e y, de T y sea z el padre de ambas. Consideremos que la frecuencia de z es f[z] = f[x] + f[y]. Entonces, el árbol T’ = T–{x,y} representa un código prefijo óptimo para el alfabeto C’ = C – {x, y}∪ {z}. Precisamente eso es lo que hace el algoritmo voraz : una vez que ha fusionado los dos caracteres de frecuencia más baja, inserta un nuevo elemento en el alfabeto con su frecuencia y repite el proceso de seleccionar los dos elementos con frecuencia más baja ahora para un alfabeto con un elemento menos. 11
  • 12. CAMINOS MINIMOS Shortest-paths problem Definiciones Sea G=(V,E) un grafo dirigido y etiquetado con valores naturales. Se define el peso del camino p, con p=<v0,v1,v2, ...,vk>, como la suma de los valores de las aristas que lo componen. k peso(p) = ∑valor(G,vi-1,vi) i=1 Se define el camino de peso mínimo del vértice u al v en G, con u,v ∈V, con la siguiente función :  MIN{ peso(p) : u ∼>v }  si hay camino de u a v δ(u,v) =   ∞ en otro caso El camino más corto, camino mínimo, de u a v en G, se define como cualquier camino p tal que peso(p) = δ(u,v). Los problemas de caminos mínimos 1/ Single_source shortest_paths problem : 12
  • 13. Encontrar el camino más corto entre un vértice fijado, source, y todos los vértices restantes del grafo. 2/ Single_destination shortest_paths problem Encontrar el camino más corto desde todos los vértices a uno fijado, destination. 3/ Single_pair shortest_paths problem : Fijados dos vértices del grafo, source y destination, encontrar el camino más corto entre ellos. 4/ All_pairs shortest_paths problem : Encontrar el camino más corto entre los vértices u y v, para todo par de vértices del grafo. El algoritmo de Dijkstra (1959) Resuelve el problema de encontrar el camino más corto entre un vértice dado y todos los restantes del grafo. función DIJKSTRA ( g es grafo; v_ini es vértice ) dev ( D es vector[1..n] de naturales ) { Pre : g=(V,E) es un grafo etiquetado con valores naturales dirigido. Se supone que el grafo está implementado en una matriz y que M[i,j] contiene el valor de la arista que va del vértice i al j y, si no hay arista, contiene el valor infinito } Para cada v∈V hacer D[v] := M[v_ini, v] fpara; 13
  • 14. D[v_ini]:= 0; VISTOS := añadir( conjunto_vacio, v_ini ); { Inv : ∀u : u∈ V−VISTOS: D[u] contiene la longitud del camino más corto desde v_ini a u que no sale de VISTOS, es decir, el camino está formado por v_ini y una serie de vértices todos ellos pertenecientes a VISTOS excepto el propio u. ∀u : u ∈ VISTOS: D[u] contiene la longitud del camino más corto desde v_ini a u } *[ |VISTOS| < |V| ---> u := MINIMO( D, u∈V−VISTOS ); /* el candidato es el vértice u∈V-VISTOS que tiene D mínima */ VISTOS := VISTOS ∪{u}; Para cada v ∈ suc(g,u) t.q. v ∈V−VISTOS hacer /* Ajustar D : Recalcular los valores para aplicar la función de selección sobre los candidatos que quedan */ [ D[v] > D[u] + valor( g,u,v ) ---> D[v] := D[u] + valor( g,u,v ); [] D[v] ≤ D[u] + valor ( g,u,v ) ---> seguir ] fpara; ] { Post : ∀u : u∈V: D[u] contiene la longitud del camino más corto desde v_ini a u que no sale de VISTOS, y como VISTOS ya contiene todos los vértices, se tienen en D las distancias mínimas definitivas } 14
  • 15. dev ( D ) ffunción Coste Grafo implementado en matriz θ(n2 ): •El bucle que inicializa el vector D cuesta θ(n). •El bucle principal efectúa n-1 iteraciones. •Coste de cada iteración : la obtención del mínimo, coste lineal, y el ajuste de D que también es θ(n). Grafo implementado con listas + Heap de mínimos θ((n+|E|).log n) : •La construcción del Heap θ(n.log n), •Seleccionar el mínimo cuesta θ(1), •Cada operación de ajuste requerirá θ(log n). •En total se efectuan θ(|E|) operaciones de ajustar D. Demostración: Sea u un vértice tal que u∈V−VISTOS. Supongamos que D[u] contiene información cierta, es decir, contiene la distancia mínima entre el vértice inicial y u siguiendo por un camino que sólo contiene vértices que pertenecen a VISTOS. •Si u es el vértice con el valor de D más pequeño, el criterio de selección lo elegirá como candidato e inmediatamente pasará a formar parte de VISTOS y 15
  • 16. se considerará que su D[u] es una distancia definitiva. Supongamos que no es CIERTO, es decir, que existe un camino más corto, aún no considerado, desde el vértice inicial a u que pasa por v, obviamente v∈V−VISTOS. Si v se encuentra en el camino más corto desde el vértice inicial a u, ¡ es que D[v]<D[u] ! lo que contradice la elección de u. ⇒ siempre que D contenga información correcta, la función de selección elige un vértice con un valor de D ya definitivo (ninguno de los vértices que no están en VISTOS lograrán que se reduzca ). Ejemplo de funcionamiento 0 1 2 4 3 5 2 1 1 1 12 2 6 5 Vértice inicial : vértice con etiqueta 0. D : 0 1 2 3 4 5 VISTOS 0 2 5 2 ∞ ∞ { 0 } 0 2 3 2 3 ∞ {0,1} 0 2 3 2 3 8 {0,1,3} 16
  • 17. 0 2 3 2 3 5 {0,1,3,2} 0 2 3 2 3 4 {0,1,3,2,4} 0 2 3 2 3 4 {0,1,3, 2,4,5} RECONSTRUCCION DE CAMINOS MINIMOS •En primer lugar hay que almacenar información para saber que vértices forman parte del camino de longitud mínima que parte del vértice inicial. función DIJKSTRA_CAM ( g es grafo; v_ini es vértice ) dev ( D, CAMINO es vector[1..n] de natural ) { Pre : la misma que DIJKSTRA } Para cada v∈V hacer D[v] := M[v_ini, v]; CAMINO[v]:= v_ini; fpara; D[v_ini]:= 0; VISTOS := añadir( conjunto_vacio, v_ini ); *[ |VISTOS| < |V| ---> u := MINIMO( D, u∈V−VISTOS ); VISTOS := VISTOS∪{u}; Para cada v ∈ suc(g,u) t.q. v ∈V−VISTOS hacer [ D[v] > D[u] + valor( g,u,v ) ---> D[v] := D[u] + valor( g,u,v ); CAMINO[v]:= u; [] D[v] ≤ D[u] + valor ( g,u,v ) ---> seguir ] fpara; ] 17
  • 18. { Post : La misma de Dijkstra y ∀u : u∈V: CAMINO[u] contiene el otro vértice de la última arista del camino mínimo de v_ini a u} dev ( D, CAMINO ) ffunción •En segundo lugar utilizar un procedimiento recursivo, RECONSTRUIR, que recibe el vértice para el cual se quiere reconstruir el camino, v, y el vector CAMINO. función RECONSTRUIR ( v, v_ini es vértice; CAMINO es vector[1..n] de vértices ) dev ( s es secuencia_aristas ) [ v = v_ini ---> s := secuencia_vacia; [] v ≠ v_ini ---> u := CAMINO[v]; s := RECONSTRUIR( u,v_ini,CAMINO); s := concatenar( s, (u, v) ); ] { Post : s contiene las aristas del camino mínimo desde v_ini a v } dev ( s ) ffunción 18