Escolar Documentos
Profissional Documentos
Cultura Documentos
Estructuras de Datos
FIEC03012
Estructuras de Datos
© ESPOL 1
2016-1T
CONCEPTOS
Arbol Binario Completo
Todos sus niveles n-1 estan llenos
A excepción del ultimo nivel,
Alli las hojas van apareciendo
seguidas de izquierda a derecha
150
• El heap se utiliza
• Para el ordenamiento de elementos(HeapSort)
• Para implementar colas de prioridad
• QDesencolarMax, es retirar el valor de la raiz
Estructuras de Datos
© ESPOL 3
2016-1T
1
IMPLEMENTACION 2 150 3
125 75
4 5 6 7
80 30 25 72
• Un heap no admite “huecos”,
• C/nivel se va llenando de izq. A der
15 20 28
• Hay una secuencia i/2
8 9 10
• Podriamos numerar c/nodo
• En el orden de llenado
Estructuras de Datos
© ESPOL 4
2016-1T
CONTANDO DESDE 0 0
15 20 28
Estructuras de Datos
© ESPOL 5
2016-1T
REGLAS
•Arreglo A de tamaño efectivo n 0
1 150 2
• A[0] es la raiz
125 75
• Dado un nodo A[i] 3 4 5 6
80 30 25 72
• Si 2i+1 < n, A[2i+1] es el hijo izq
• Si 2i+2 < n, A[2i+2] es el hijo der 15 20 28
• Si i != 0, A[(i-1)/2] es el padre 7 8 9
150 125 75 80 30 25 72 15 20 28
0 1 2 3 4 5 6 7 8 9
Estructuras de Datos
© ESPOL 6
2016-1T
DECLARACION: TDA HEAP
Estructuras de Datos
© ESPOL 7
2016-1T
OPERACIONES BASICAS: TDA HEAP
• Desencolar y Encolar
• Desencolar: Extraer el elemento mas grande/pequeño del heap(la raiz)
• Encolar: Insertar un valor al heap y ubicarlo en la posicion correcta
• HeapSort
• Dado un Heap permite generar un arreglo/lista ordenado
• Operaciones Adicionales
• Ajustar
• Reestablece la propiedad de orden de un subheap hacia abajo
• No a todo el arbol!
• Construir_heap
• Dado un arreglo que no representa un heap
• ardena el arreglo y lo convierte en un Heap
Estructuras de Datos
© ESPOL 8
2016-1T
MAS OPERACIONES
• int posIzq(int i); public Heap(int tmax, TipoOrden t);
• Retorna el indice del nodo izq de i Constructor de un heap, inicializa para tener un
Estructuras de Datos
© ESPOL 9
2016-1T
AJUSTAR
• Recobra la propiedad de orden
• Desde un nodo de índice pos
• Dado un índice pos, PosIzq y PosDer
• Se compararan los tres para ver quien tiene el mayor
• Si el mayor lo tiene algun hijo
• Intercambia
• Al hacer esto, el sub-heap afectado puede perder su propiedad de Orden….
• Ajustar el sub-heap afectado
Estructuras de Datos
© ESPOL 10
2016-1T
AJUSTAR: EJEMPLO
0
• Un heap puede perder su orden
Pos 1 150 2
80
60 75 Ejemplo:
3 4 5 6 Ejemplo:
Pos
PosMayor En el
No
En el nodo
se nodo
puede31 no
no se
se cumple
ajustarcumple
un nodo hoja
80
60
70 30 25 72
Ajustar
Ajustar
El mayor
El
mayor es
es elel nodo
nodo 33
20 70
70
60 28 Intercambiar
Intercambiar
PosMayor Ajustar Otra
Ajustar
desde nodo intercambiado(3)
Vez
7 8 9
150 80
60 75 80
70 30 25 72 20 70
60 28
0 1 2 3 4 5 6 7 8 9
Estructuras de Datos
© ESPOL 11
2016-1T
AJUSTAR: IMPLEMENTACION
static void ajustar(int posnodo ){
int pos_mayor, izq, der;
pos_mayor = posnodo;
izq = posnodo*2+1;
der = posnodo*2+2;
Estructuras de Datos
© ESPOL 12
2016-1T
CONSTRUIR UN HEAP
• La estructura de un heap
• Puede almacenar un arreglo que no cumpla las propiedades de
orden
15 1 28 35 10 5 8 21 50 42
• Ejemplo:
0 1 2 3 4 5 6 7 8 9
0
Hay que arreglar la propiedad
1 15 2
de orden
1 28
De cada raiz 3 4 5 6
Ajustar c/raiz
35 10 5 8
Desde la ultima a la primera
21 50 42
7 8 9
Estructuras de Datos
© ESPOL 13
2016-1T
CONSTRUIR HEAP: EJEMPLO
15
50 42
1 28 35 10
15 5 8 21 50
1 42
10
3 7 8 9
• Ajustar el ultimo nodo raiz 0 1 2 4 5 6
0
• Los nodos raiz comienzan desde
1 50
15 2
0 hasta (n-1)/2
50
42
15
1 28
• Al ajustar cada nodo 3 4 5 6
Estructuras de Datos
© ESPOL 14
2016-1T
CONSTRUIR HEAP:
IMPLEMENTACION
void makeHeap(){
int i;
for(i = (this.nEfectivo-1)/2; i >= 0; i--){
ajustar(i);
}
}
Estructuras de Datos
© ESPOL 15
2016-1T
DESENCOLAR
• Que importancia tiene la raiz en el heap?
• Es el mayor/menor elemento del mismo
• Sobre el resto de elementos no estamos seguros
• Pero de la raiz, es la mayor de todos
• Desencolar es eliminar la raiz
• Que valor se ubica en la nueva raiz?
• El ultimo reemplaza al primero
• El tamaño efectivo del heap cambia
• Se ajusta desde la raiz
• El arbol queda bien otra vez
Estructuras de Datos
© ESPOL 16
2016-1T
DESENCOLAR: EJEMPLO
0
80
28
125 75
• Raiz con ultimo 3 4 5 6
28
80 30 25 72
• Aminorar tamaño
efectivo 15 20 28
150
125
28 125
80 75 80
28 30 25 72 15 20 28
0 1 2 3 4 5 6 7 8 9
Estructuras de Datos
© ESPOL 17
2016-1T
DESENCOLAR: IMPLEMENTACION
T Dequeue (){
T max;
if(!isEmpty(H)){
max = this.elementos[0];
intercambiar(0,this.nEfectiva-1);
this.nEfectiva --;
ajustar(0);
return max;
}
return null;
}
Estructuras de Datos
© ESPOL 18
2016-1T
ENCOLAR
•Al añadir un nuevo elemento el Heap
• DEBE conservar su propiedad de orden
•Se añade al final del arreglo
•El elemento empieza a subir a su posición ideal
• Comparando siempre con el padre
• Hasta que el valor insertado sea menor que el del
padre
Estructuras de Datos
© ESPOL 19
2016-1T
ENCOLAR: EJEMPLO
0
1 150 2
• Insertar al final
125
130 75
• Subir el valor hasta que ya 3 4 5 6
no sea necesario 80 30
130
125 25 72
15 20 28 30
130
7 8 9
Estructuras de Datos
© ESPOL 20
2016-1T
ENCOLAR: IMPLEMENTACION
Estructuras de Datos
© ESPOL 21
2016-1T
HEAPSORT
•Uno de los usos de los heaps es ordenar
•Como?
• Extraer el mayor elemento del heap(raiz)
• Ponerla al final de otro arreglo
• Repetir los dos ultimos pasos hasta que el Heap
quede Vacio
•El arreglo quedara ordenado
Estructuras de Datos
© ESPOL 22
2016-1T
HEAPSORT: EJEMPLO 0
1 125
28
15
20
75
72
30
25
28
80
150 2
125
30
28
20
15
80 75
72
25
15
• Desencolar y ponerlo al 3 4 5 6
arreglo/lista
15 20 28
• Repetir hasta que el 7 8 9
15 20 25 28 30 72 75 80 125 150
0 1 2 3 4 5 6 7 8 9
Estructuras de Datos
© ESPOL 23
2016-1T
HEAPSORT: IMPLEMENTACION
Estructuras de Datos
© ESPOL 24
2016-1T
CODIGOS DE HUFFMAN
Estructuras de Datos
FIEC03012
Estructuras de Datos
© ESPOL 25
2016-1T
CODIFICACION
• Codificar un texto
• Reemplazar con códigos por seguridad o ahorrar espacio
• Para obtener el texto original
• Se debe decodificar
• En el envío de información es muy popular
• Para ocular la información y volver el envio mas seguro
Estructuras de Datos
© ESPOL 26
2016-1T
UNA FORMA
• Codigos binarios
• Que represente cada letra del alfabeto.
• Si el alfabeto esta conformado por
• A, B, C, y D
• Podemos codificar cada letra con
• 010, 100, 000, 111
• La cadena ABACCDA quedaria
• 010100010000000111010
Estructuras de Datos
© ESPOL 27
2016-1T
ANALIZANDO
•Ventajas
• Es muy facil codificar y decodificar
• Solo reemplazar
• Cada código tiene la misma longitud
•Desventajas
• La cadena resultante es muy larga comparada con
el mensaje
•Como se podra reducir la cadena codificada?
Estructuras de Datos
© ESPOL 28
2016-1T
MEJORAR LA CODIFICACION
• A es la letra que mas se repite en el mensaje,
• Debería tener un código pequeño(menos espacio)
• La letra que menos aparece
• Puede tener un codigo mas grande
• El código de cada letra
• Puede depender de la frecuencia de la letra en la cadena
• O del idioma
• Códigos de Huffman
• códigos de longitud variable para codificar un determinado
símbolo basándose en la probabilidad estimada de aparición de
cada posible valor de dicho símbolo
Estructuras de Datos
© ESPOL 29
2016-1T
UN EJEMPLO
•A, B, C, D
•Se le puede asignar 0, 110, 10, 111
•Entonces ABACCDA es 011001010111
• Ya!, mas pequeña
Estructuras de Datos
© ESPOL 30
2016-1T
DECODIFICANDO
011001010111 A 0
B 110
Puede
Puede ser
Puede ser
ser
ser
C 10 Puede
A ? ?B A ?C C ??D B,BCC
B, o DD
B ooo
CD
D 111
Estructuras de Datos
© ESPOL 32
2016-1T
Una vez construido el
arbol, obtendremos los
codigos de c/letra
CONSTRUIR EL ARBOL
A 3
• Necesitamos la frecuencia de cada Ej: ABACCDA
B 1
letra en la cadena
C 2
Notemos que c/letra es una hoja D 1
A B C D
3 1 2 1
Empecemos con las dos letras de menor frecuencia ACBD 7
Se unen y crean un nuevo simbolo
La frecuencia del nuevo es la suma de los dos ant. A(0) CBD(1)
CBD 4
Se desechan los dos anteriores
3
El grupo de letras se vuelve mas pequeño
C(0) BD 2
BD(1)
Todo se repite hasta que no queden mas letras ind.
2
B(0) D(1)
Estructuras de Datos 1 1
© ESPOL 33
2016-1T
CONSEGUIR LOS CODIGOS
• Es una busqueda binaria
ACBD 7 • Los codigos se van acumulando a medida
que se busca la letra
A(0) CBD(1)
CBD 4 • Las letras siempre son hojas
3 • Si letra buscada esta
C(0) BD(1) 2 • En el subarbol izquierdo, se acumula un 0 o
2 • En el subarbol derecho, se acumula un 1
B(0) D(1)
1 1
A 0
B 110
11
1
C 10
1
D 1
111
11
Estructuras de Datos
© ESPOL 34
2016-1T
DECIDIENDO QUE USAR
Primero, se construyen hojas para
A B C D
c/letra
3 1 2 1
Para facilitar la ubicación de un nodo hoja al crear codigos
Estos son almacenados a una cola de Prioridad
Estructuras de Datos
© ESPOL 35
2016-1T
DECLARACION DE TDA: ARBOL E INFO
Cada Nodo tendra Info, sub. Iza. Y Cada elemento del nodo tiene: una
subarbol der: cadena, frecuencia y un bit
Es ideal agrupar toda esta
informacion en un nuevo tipo de dato
public class NodoAB {
Info info; public class Info {
NodoAB izq, der; String Cadena;
} int frecuencia;
int bit;
}
Estructuras de Datos
© ESPOL 36
2016-1T
LA COLA DE PRIORIDAD
La cola de Prioridad almacenará nodos de Arbol.
Se la puede implementar como una lista ordenada o un arreglo
Si fuese lista, cada nodo seria NodoAB y la cola:
Estructuras de Datos
© ESPOL 37
2016-1T
IMPLENTACION: CONSTRUIR ARBOL
public NodoAB construirArbolHuffman(String[] cadenas, int[] frecuencias) {
ColaPrioridad cola = new ColaPrioridad();
for (int i=0; i<cadenas.size(); i++) {
NodoAB nodo = new NodoAB(new Info(cadenas[i], frecuencias[i]));
cola.encolar(info);
}
while(cola.size() > 1) {
NodoAB izq = cola.desencolar();
NodoAB der = cola.desencolar();
izq.getInfo().setBit(0);
der.getInfo().setBit(1);
String cadenacomb = izq.getInfo().getCadena() + der.getInfo().getCadena();
int freqcomb = izq.getInfo().getFrecuencia()+der.getInfo().getFrecuencia();
NodoAB tmp = new NodoAB(new Info(cadenacomb, freqcomb));
tmp.setIzquierdo(izq);
tmp.setDerecho(der);
cola.encolar(tmp);
}
return cola.desencolar();
}
Estructuras de Datos
© ESPOL 38
2016-1T
IMPLEMENTACION: ASIGNAR CODIGOS
public String codificarCadena(String cadena, NodoAB arbol){
String codigo="";
NodoAB p = arbol;
while(!p.esHoja() && !p.estaVacio()){
NodoAB izq = p.getIzquierdo();
NodoAB der = p.getDerecho();
if(encontrarCadena(izq.getInfo().getCadena(), cadena)){
codigo += izq.getInfo().getBit();
p = izq;
}
else if(encontrarCadena(der.getInfo().getCadena(), cadena){
codigo += izq.getInfo().getBit();
p = der;
}
else {
codigo = "";
break;
}
}
return codigo;
}
Estructuras de Datos
© ESPOL 39
2016-1T
EJERCICIO EN CLASE
•Construya el arbol de Huffman con la siguientes
frecuencias
A 15 D 12 G 6
B 6 E 25 H 3
C 7 F 4 I 15
Estructuras de Datos
© ESPOL 40
2016-1T
EJERCICIO EN CLASE
Estructuras de Datos
© ESPOL 41
2016-1T