procedimiento AÑADIR (x:elemento; HASH1:HASH); var i,j:entero; enc:booleano; fvar i:=0; enc:=falso; mientras (i<=m-1) and no(enc) hacer j:=hda(x,i); si Libre(HASH1[j]) or (HASH1[j]=x) entonces enc:=cierto; si Libre(HASH1[j]) entonces HASH1[j]:=x fsi sino i:=i+1; fsi fmientras si no(enc) entonces escribir ('Error Tabla Llena') fsi fprocedimiento {a,b,c,d} h(a)=3 h(b)=5 h(c)= 4 3 d a c b h(d)=0 d ELIMINAR (a,HASH1) d AÑADIR (c,HASH1) c b c c b 2.3.2 Prueba cuadrática hda(x,i)=( h(x)+C1*1+C2*i2) mod m 2.3.3 Doble Hashing hda(x,i)=( h(x)+i*h'(x) ) mod m h(x)=x mod m h'(x)=1 + (x mod m') siendo m'<m 2.4 Conclusiones - Encadenamiento Separado (HASHING ABIERTO) : Las variables se duplican por lo que ocupan mucho espacio, además de tener que gestionar todas esas variables dinámicas. La ventaja es que permite aumentar el tamaño de la HASH y añadir elementos aunque esta esté llena. - Direccionamiento Abierto (HASHING CERRADO) : Las eliminaciones son complicadas y una vez llena la tabla no se pueden añadir más elementos, pero ocupa poco espacio en memoria. * La estructura de tabla HASH es la más eficiente para resolver el problema de los diccionarios, pues solo emplea las operaciones de AÑADIR, ELIMINAR y PERTENENCIA. Su principal inconveniente es que se trata de una estructura estática fija y al implementar cualquier otra operación el coste es muy elevado. 3. HEAPS Es la estructura más eficiente para resolver el problema de colas de prioridad ( planificadores de CPU, de dispositivos, etc.) Operaciones asociadas: - añadir elemento a la cola (AÑADIR) - obtener elemento de valor máximo (mínimo)---> MAXIMO (MINIMO) - eliminar el elemento de valor máximo (mínimo) ---> ELIMINAR_MAX (ELIMINAR_MIN) Propiedades: - Es un arbol binario. - Es completo ( o casi ). - Para todos los nodos se cumple que: Estructura MIN_HEAP: el valor de un nodo es menor o igual que el de sus hijos. Estructura MAX_HEAP: el valor de un nodo es mayor o igual que el de sus hijos. - Los subarboles de un HEAP son a su vez HEAPS. - La altura h de un HEAP con n nodos está limitada inferior y superiormente por LOG2 n. - El número de nodos internos del HEAP es igual al número de hojas o al número de hojas menos 1. 3.1. Representación. Se utiliza un vector. TIPO HEAP:vector [1..maxnodos] de elementos VAR HEAP1:HEAP; tam_heap:entero; Con esta representación es sencillo obtener: Padre(i)=i div 2 Hijo_izq (i)= 2i Hijo_der (i)= 2i+1 3.2 Operaciones 3.2.1 Mantenimiento de la condicion de HEAP -----> HEAPIFY Dado un vector de elementos y un indice a un nodo del vector, y asumiendo que el nodo indice es el padre de 2 subarboles que son HEAPS, esta operación convierte a todo el arbol (vector) en un HEAP.