Sei sulla pagina 1di 38

Pilas, Colas y Hash

2012

Pilas, Colas y Hash


1. Pilas.Una pila (stack en ingls) es una lista ordinal o estructura de datos en la que el modo de acceso a sus elementos es de tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir) que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el rea de informtica debido a su simplicidad y ordenacin implcita de la propia estructura. Para el manejo de los datos se cuenta con dos operaciones bsicas: apilar (push), que coloca un objeto en la pila, y su operacin inversa, retirar (o desapilar, pop), que retira el ltimo elemento apilado. En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo objeto apilado (denominado TOS, Top of Stack en ingls). La operacin retirar permite la obtencin de este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con anterioridad), que pasa a ser el nuevo TOS. Por analoga con objetos cotidianos, una operacin apilar equivaldra a colocar un plato sobre una pila de platos, y una operacin retirar a retirarlo. Las pilas suelen emplearse en los siguientes contextos:

Pilas, Colas y Hash

2012

Evaluacin de expresiones en notacin postfija (notacin polaca inversa). Reconocedores sintcticos de lenguajes independientes del contexto Implementacin de recursividad.

2. Historia.El mtodo de pila para la evaluacin de expresiones fue propuesto en 1955 y dos aos despus patentado por Fiedrich L.Bauer, quin recibi en 1988 el premio "IEEE Computer Society Pioneer Award" por su trabajo en el desarrollo de dicha estructura de datos.

3. Pila como tipo abstracto de datos.A modo de resumen tipo de datos, la pila es un contenedor de nodos y tiene dos operaciones bsicas: push (o apilar) y pop (o desapilar). 'Push' aade un nodo a la parte superior de la pila, dejando por debajo el resto de los nodos. 'Pop' elimina y devuelve el actual nodo superior de la pila. Una metfora que se utiliza con frecuencia es la idea de una pila de platos en una cafetera con muelle de pila. En esa serie, slo la primera placa es visible y accesible para el usuario, todas las dems placas permanecen ocultas. Como se aaden las nuevas placas, cada nueva placa se convierte en la parte superior de la pila, escondidos debajo de cada plato, empujando a la pila de placas. A medida que la placa superior se elimina de la pila, la segunda placa se convierte en la parte superior de la pila. Dos principios importantes son ilustrados por esta metfora: En primer lugar la ltima salida es un principio, la segunda es que el contenido de la pila est oculto. Slo la placa de la parte superior
2

Pilas, Colas y Hash

2012

es visible, por lo que para ver lo que hay en la tercera placa, el primer y segundo platos tendrn que ser retirados.

3.1Operaciones
Una pila cuenta con 2 operaciones imprescindibles: apilar y desapilar, a las que en las implementaciones modernas de las pilas se suelen aadir ms de uso habitual. Crear: se crea la pila vaca. (Constructor) Tamao: regresa el nmero de elementos de la pila. (size) Apilar: se aade un elemento a la pila. (push) Desapilar: se elimina el elemento frontal de la pila. (pop) Cima: devuelve el elemento que esta en la cima de la pila. (Top o peek) Vaca: devuelve cierto si la pila est vaca o falso en caso contrario (empty).

3.2Implementacin
Un requisito tpico de almacenamiento de una pila de n elementos es O(n). El requisito tpico de tiempo de O (1) las operaciones tambin son fciles de satisfacer con un Array o con listas enlazadas simples. La biblioteca de plantillas de C++ estndar proporciona una "pila" clase templated que se limita a slo apilar/desapilar operaciones. Java contiene una biblioteca de la clase Pila que es una especializacin de

Pilas, Colas y Hash

2012

Vector. Esto podra ser considerado como un defecto, porque el diseo heredado get () de Vector mtodo LIFO ignora la limitacin de la Pila.

En JAVA

3.3Estructura de Datos Relacionadas


El tipo base de la estructura FIFO (el primero en entrar es el primero en salir) es la cola, y la combinacin de las operaciones de la pila y la cola es proporcionado por el deque. Por ejemplo, el cambio de una pila en una cola en un algoritmo de bsqueda puede cambiar el algoritmo de bsqueda en primera profundidad (en ingls, DFS) por una bsqueda en
4

Pilas, Colas y Hash

2012

amplitud (en ingls, BFS). Una pila acotada es una pila limitada a un tamao mximo impuesto en su especificacin.

4. Pilas Hardware.Un uso muy comn de las pilas a nivel de arquitectura hardware es la asignacin de memoria.

5. Arquitectura bsica de una pila.Una pila tpica es un rea de la memoria de los computadores con un origen fijo y un tamao variable. Al principio, el tamao de la pila es cero. Un puntero de pila, por lo general en forma de un registro de hardware, apunta a la ms reciente localizacin en la pila; cuando la pila tiene un tamao de cero, el puntero de pila de puntos en el origen de la pila. Las dos operaciones aplicables a todas las pilas son: Una operacin apilar, en el que un elemento de datos se coloca en el lugar apuntado por el puntero de pila, y la direccin en el puntero de pila se ajusta por el tamao de los datos de partida. Una operacin desapilar: un elemento de datos en la ubicacin actual apuntada por el puntero de pila es eliminado, y el puntero de pila se ajusta por el tamao de los datos de partida.

Pilas, Colas y Hash

2012

Hay muchas variaciones en el principio bsico de las operaciones de pila. Cada pila tiene un lugar fijo en la memoria en la que comienza. Como los datos se aadirn a la pila, el puntero de pila es desplazado para indicar el estado actual de la pila, que se expande lejos del origen (ya sea hacia arriba o hacia abajo, dependiendo de la aplicacin concreta). Por ejemplo, una pila puede comenzar en una posicin de la memoria de mil, y ampliar por debajo de las direcciones, en cuyo caso, los nuevos datos se almacenan en lugares que van por debajo de 1000, y el puntero de pila se decrementa cada vez que un nuevo elemento se agrega. Cuando un tema es eliminado de la pila, el puntero de pila se incrementa. Los punteros de pila pueden apuntar al origen de una pila o de un nmero limitado de direcciones, ya sea por encima o por debajo del origen (dependiendo de la direccin en que crece la pila), sin embargo el puntero de pila no puede cruzar el origen de la pila. En otras palabras, si el origen de la pila est en la direccin 1000 y la pila crece hacia abajo (hacia las direcciones 999, 998, y as sucesivamente), el puntero de pila nunca debe ser incrementado ms all de 1000 (para 1001, 1002, etc.) Si un desapilar operacin en la pila hace que el puntero de pila se deje atrs el origen de la pila, una pila se produce desbordamiento. Si una operacin de apilar hace que el puntero de pila incremente o decremente ms all del mximo de la pila, en una pila se produce desbordamiento.
6

Pilas, Colas y Hash

2012

La pila es visualizada ya sea creciente de abajo hacia arriba (como pilas del mundo real), o, con el mximo elemento de la pila en una posicin fija, o creciente, de izquierda a derecha, por lo que el mximo elemento se convierte en el mximo a "la derecha". Esta visualizacin puede ser independiente de la estructura real de la pila en la memoria. Esto significa que rotar a la derecha es mover el primer elemento a la tercera posicin, la segunda a la primera y la tercera a la segunda. Aqu hay dos equivalentes visualizaciones de este proceso:

Una pila es normalmente representada en los ordenadores por un bloque de celdas de memoria, con los "de abajo" en una ubicacin fija, y el puntero de pila de la direccin actual de la "cima" de clulas de la pila. En la parte superior e inferior se utiliza la

Pilas, Colas y Hash

2012

terminologa con independencia de que la pila crece realmente a la baja de direcciones de memoria o direcciones de memoria hacia mayores. Apilando un elemento en la pila,se ajusta el puntero de pila por el tamao de elementos (ya sea decrementar o incrementar, en funcin de la direccin en que crece la pila en la memoria), que apunta a la prxima celda, y copia el nuevo elemento de la cima en rea de la pila. Dependiendo de nuevo sobre la aplicacin exacta, al final de una operacin de apilar, el puntero de pila puede sealar a la siguiente ubicacin no utilizado en la pila, o tal vez apunte al mximo elemento de la pila. Si la pila apunta al mximo elemento de la pila, el puntero de pila se actualizar antes de que un nuevo elemento se apile, si el puntero que apunta a la prxima ubicacin disponible en la pila, que se actualizar despus de que el mximo elemento se apile en la pila. Desapilando es simplemente la inversa de apilar. El primer elemento de la pila es eliminado y el puntero de pila se actualiza, en el orden opuesto de la utilizada en la operacin de apilar.

6. Soporte de Hardware.Muchas CPUs tienen registros que se pueden utilizar como punteros de pila. Algunos, como el Intel x86, tienen instrucciones especiales que implcitamente el uso de un registro dedicado a la tarea de ser un puntero de pila. Otros, como el DEC PDP-11 y de la familia 68000 de Motorola tienen que hacer frente a los modos de hacer posible la utilizacin de toda una serie de registros como un puntero de pila. La serie Intel 80x87

Pilas, Colas y Hash

2012

numrico de coprocessors tiene un conjunto de registros que se puede acceder ya sea como una pila o como una serie de registros numerados. Algunos microcontroladores, por ejemplo algunos PICs, tienen un fondo fijo de pila que no es directamente accesible. Tambin hay una serie de microprocesadores que aplicar una pila directamente en el hardware: Computer vaqueros MuP21 Harris RTX lnea Novix NC4016 Muchas pilas basadas en los microprocesadores se utilizan para aplicar el lenguaje de programacin Forth en el nivel de microcdigo. Pila tambin se utilizaron como base de una serie de mainframes y miniordenadores. Esas mquinas fueron llamados pila de mquinas, el ms famoso es el Burroughs B5000.

7. Soporte de Software.En programas de aplicacin escrito en un lenguaje de alto nivel, una pila puede ser implementada de manera eficiente, ya sea usando vectores o listas enlazadas. En LISP no hay necesidad de aplicar la pila, puesto que las funciones apilar y desapilar estn disponibles para cualquier lista. Adobe PostScript tambin est diseada en torno a una pila que se encuentra directamente visible y manipuladas por el programador. El uso de las pilas est muy presente en el desarrollo de software por ello la importancia de las pilas como tipo abstracto de datos.
9

Pilas, Colas y Hash

2012

8. Expresin de evaluacin y anlisis sintctico.Se calcula empleando la notacin polaca inversa utilizando una estructura de pila para los posibles valores. Las expresiones pueden ser representadas en prefijo, infijo, postfijo. La conversin de una forma de la expresin a otra forma necesita de una pila. Muchos compiladores utilizan una pila para analizar la sintaxis de las expresiones, bloques de programa, etc. Antes de traducir el cdigo de bajo nivel. La mayora de los lenguajes de programacin son de contexto libre de los idiomas que les permite ser analizados con mquinas basadas en la pila. Por ejemplo, el clculo: ((1 + 2) * 4) + 3, puede ser anotado como en notacin postfija con la ventaja de no prevalecer las normas y los parntesis necesarios: 12+4*3+ La expresin es evaluada de izquierda a derecha utilizando una pila: Apilar cuando se enfrentan a un operando y Desafilar dos operandos y evaluar el valor cuando se enfrentan a una operacin. Apilar el resultado. De la siguiente manera (la Pila se muestra despus de que la operacin se haya llevado a cabo):

10

Pilas, Colas y Hash

2012

8.1 Tiempo de ejecucin de la gestin de memoria


Una serie de lenguajes de programacin estn orientadas a la pila, lo que significa que la mayora definen operaciones bsicas (aadir dos nmeros, la impresin de un carcter) cogiendo sus argumentos de la pila, y realizando de nuevo los valores de retorno en la pila. Por ejemplo, PostScript tiene una pila de retorno y un operando de pila, y tambin tiene un montn de grficos estado y un diccionario de pila.

Forth utiliza dos pilas, una para pasar argumentos y una subrutina de direcciones de retorno. El uso de una pila de retorno es muy comn, pero el uso poco habitual de un argumento para una pila legible para humanos es el lenguaje de programacin Forth razn que se denomina una pila basada en el idioma.

Muchas mquinas virtuales tambin estn orientadas hacia la pila, incluida la p-cdigo mquina y la mquina virtual Java.

11

Pilas, Colas y Hash

2012

Casi todos los entornos de computacin de tiempo de ejecucin de memoria utilizan una pila especial PILA para tener informacin sobre la llamada de un procedimiento o funcin y de la anidacin con el fin de cambiar al contexto de la llamada a restaurar cuando la llamada termina. Ellos siguen un protocolo de tiempo de ejecucin entre el que llama y el llamado para guardar los argumentos y el valor de retorno en la pila. Pila es una forma importante de apoyar llamadas anidadas o a funciones recursivas. Este tipo de pila se utiliza implcitamente por el compilador para apoyar CALL y RETURN estados (o sus equivalentes), y no es manipulada directamente por el programador.

Algunos lenguajes de programacin utilizar la pila para almacenar datos que son locales a un procedimiento. El espacio para los datos locales se asigna a los temas de la pila cuando el procedimiento se introduce, y son borradas cuando el procedimiento termina. El lenguaje de programacin C es generalmente aplicado de esta manera. Utilizando la misma pila de los datos y llamadas de procedimiento tiene importantes consecuencias para la seguridad (ver ms abajo), de los que un programador debe ser consciente, a fin de evitar la introduccin

12

Pilas, Colas y Hash

2012

8.2 Solucionar problemas de bsqueda


La bsqueda de la solucin de un problema, es independientemente de si el enfoque es exhaustivo u ptimo, necesita espacio en la pila. Ejemplos de bsqueda exhaustiva mtodos son fuerza bruta y backtraking. Ejemplos de bsqueda ptima a explorar mtodos,son branch and bound y soluciones heursticas. Todos estos algoritmos utilizan pilas para recordar la bsqueda de nodos que se han observado, pero no explorados an. La nica alternativa al uso de una pila es utilizar la recursividad y dejar que el compilador sea recursivo (pero en este caso el compilador todava est utilizando una pila interna). El uso de pilas es frecuente en muchos problemas, que van desde almacenar la profundidad de los rboles hasta resolver crucigramas o jugar al ajedrez por ordenador. Algunos de estos problemas pueden ser resueltos por otras estructuras de datos como una cola.

9. Seguridad.La seguridad a la hora de desarrollar software usando estructuras de datos de tipo pila es un factor a tener en cuenta debido a cierta vulnerabilidad que un uso incorrecto de stas puede originar en la seguridad de nuestro software o en la seguridad del propio sistema que lo ejecuta. Por ejemplo, algunos lenguajes de programacin usan una misma pila para almacenar los datos para unos procedimientos y el link que permite retornar a su invocador. Esto significa que el programa introduce y extrae los datos de la misma

13

Pilas, Colas y Hash

2012

pila en la que se encuentra informacin crtica con las direcciones de retorno de las llamadas a procedimiento, supongamos que al introducir datos en la pila lo hacemos en una posicin errnea de manera que introducimos una datos de mayor tamao al soportado por la pila corrompiendo as las llamadas a procedimientos provocaramos un fallo en nuestro programa. sta tcnica usada de forma maliciosa (es similar, pero en otro mbito al buffer overflow) permitira a un atacante modificar el funcionamiento normal de nuestro programa y nuestro sistema, y es al menos una tcnica til si no lo evitamos en lenguajes muy populares como el ejemplo C++.

Colas
Una cola (tambin llamada fila) es una estructura de datos, caracterizada por ser una secuencia de elementos en la que la operacin de insercin push se realiza por un extremo y la operacin de extraccin pop por el otro. Tambin se le llama estructura FIFO (del ingls First In First Out), debido a que el primer elemento en entrar ser tambin el primero en salir. Las colas se utilizan en sistemas informticos, transportes y operaciones de investigacin (entre otros), dnde los objetos, personas o eventos son tomados como datos que se almacenan y se guardan mediante colas para su posterior procesamiento. Este tipo de estructura de datos abstracta se implementa en lenguajes orientados a objetos mediante clases, en forma de listas enlazadas.

14

Pilas, Colas y Hash

2012

10.Uso de la Cola.La particularidad de una estructura de datos de cola es el hecho de que slo podemos acceder al primer y al ltimo elemento de la estructura. As mismo, los elementos slo se pueden eliminar por el principio y slo se pueden aadir por el final de la cola. Ejemplos de colas en la vida real seran: personas comprando en un supermercado, esperando para entrar a ver un partido de bisbol, esperando en el cine para ver una pelcula, una pequea peluquera, etc. La idea esencial es que son todos lneas de espera.

15

Pilas, Colas y Hash

2012

En caso de estar vaca, borrar un elemento sera imposible hasta que no se aade un nuevo elemento. A la hora de aadir un elemento podramos darle una mayor importancia a unos elementos que a otros (un cargo VIP) y para ello se crea un tipo de cola especial que es la cola de prioridad.

11.Cola de Prioridad.Este tipo especial de colas tienen las mismas operaciones que las colas , pero con la condicin de que los elementos se atienden en orden de prioridad. Ejemplos de la vida diaria seran la sala de urgencias de un hospital, ya que los enfermos se van atendiendo en funcin de la gravedad de su enfermedad. Entendiendo la prioridad como un valor numrico y asignando a altas prioridades valores pequeos, las colas de prioridad nos permiten aadir elementos en cualquier orden y recuperarlos de menor a mayor.

11.1 Implementacin.Hay 2 formas de implementacin: Aadir un campo a cada nodo con su prioridad. Resulta conveniente mantener la cola ordenada por orden de prioridad. Crear tantas colas como prioridades haya, y almacenar cada elemento en su cola.

16

Pilas, Colas y Hash

2012

11.2 Tipos. Colas de prioridades con ordenamiento ascendente: en ellas los elementos se insertan de forma arbitraria, pero a la hora de extraerlos, se extrae el elemento de menor prioridad. Colas de prioridades con ordenamiento descendente: son iguales que las colas de prioridad con ordenamiento ascendente, pero al extraer el elemento se extrae el de mayor prioridad.

12.Implementacin en Java

17

Pilas, Colas y Hash

2012

13.Operaciones Bsicas. Crear: se crea la cola vaca. Encolar (aadir, entrar, insertar): se aade un elemento a la cola. Se aade al final de esta. Desencolar (sacar, salir, eliminar): se elimina el elemento frontal de la cola, es decir, el primer elemento que entr. Frente (consultar, front): se devuelve el elemento frontal de la cola, es decir, el primer elemento que entr.

14.Implementacin en Java.-

18

Pilas, Colas y Hash

2012

14.1 Ejemplo Practico.-

19

Pilas, Colas y Hash

2012

15.Colas Circulares (anillos).Una cola circular o anillo es una estructura de datos en la que los elementos estn de forma circular y cada elemento tiene un sucesor y un predecesor. Los elementos pueden consultarse, aadirse y eliminarse nicamente desde la cabeza del anillo que es una posicin distinguida. Existen dos operaciones de rotaciones, una en cada sentido, de manera que la cabeza del anillo pasa a ser el elemento sucesor, o el predecesor, respectivamente, de la cabeza actual.

15.1 Implementacin en Java.-

20

Pilas, Colas y Hash

2012

16.Bicola.La bicola o doble cola es un tipo de cola especial que permiten la insercin y eliminacin de elementos de ambos extremos de la cola; se les llama DEQUE (Double Ended QUEue). Puede representarse a partir de un vector y dos ndices, siendo su representacin ms frecuente una lista circular doblemente enlazada. Todas las operaciones de este tipo de datos tienen coste constante. Hay variantes: Bicolas de entrada restringida: Son aquellas donde la insercin slo se hace por el final, aunque podemos eliminar al inicio al final. Bicolas de salida restringida: Son aquellas donde slo se elimina por el final, aunque se puede insertar al inicio y al final.

21

Pilas, Colas y Hash

2012

16.1 Implementacin en Java.-

22

Pilas, Colas y Hash

2012

17.Hash.Una tabla hash, mapa hash o tabla de dispersin es una estructura de datos que asocia llaves o claves con valores. La operacin principal que soporta de manera eficiente es la bsqueda: permite el acceso a los elementos (telfono y direccin, por ejemplo) almacenados a partir de una clave generada (usando el nombre o nmero de cuenta, por ejemplo). Funciona transformando la clave con una funcin hash en un hash, un nmero que identifica la posicin (casilla o cubeta) donde la tabla hash localiza el valor deseado. Las tablas hash se suelen implementar sobre vectores de una dimensin, aunque se pueden hacer implementaciones multi-dimensionales basadas en varias claves. Como en el caso de los arrays, las tablas hash proveen tiempo constante de bsqueda promedio O(1),1 sin importar el nmero de elementos en la tabla. Sin embargo, en casos particularmente malos el tiempo de bsqueda puede llegar a O(n), es decir, en funcin del nmero de elementos. Comparada con otras estructuras de arrays asociadas, las tablas hash son ms tiles cuando se almacenan grandes cantidades de informacin. Las tablas hash almacenan la informacin en posiciones pseudo-aleatorias, as que el acceso ordenado a su contenido es bastante lento. Otras estructuras como rboles binarios auto-balanceables son ms rpidos en promedio (tiempo de bsqueda O(log n)) pero la informacin est ordenada en todo momento.

23

Pilas, Colas y Hash

2012

18.Funcionamiento.Las operaciones bsicas implementadas en las tablas hash son: Insercin (llave, valor) Bsqueda (llave) que devuelve valor La mayora de las implementaciones tambin incluyen borrar(llave). Tambin se pueden ofrecer funciones como iteracin en la tabla, crecimiento y vaciado. Algunas tablas hash permiten almacenar mltiples valores bajo la misma clave. Para usar una tabla hash se necesita: Una estructura de acceso directo (normalmente un array). Una estructura de datos con una clave Una funcin resumen (hash) cuyo dominio sea el espacio de claves y su imagen (o rango) los nmeros naturales.

18.1 Insercin.Para almacenar un elemento en la tabla hash se ha de convertir su clave a un nmero. Esto se consigue aplicando la funcin resumen (hash) a la clave del elemento. El resultado de la funcin resumen ha de mapearse al espacio de direcciones del arreglo que se emplea como soporte, lo cual se consigue con la funcin mdulo. Tras este paso se obtiene un ndice vlido para la tabla.
24

Pilas, Colas y Hash

2012

El elemento se almacena en la posicin de la tabla obtenido en el paso anterior. Si en la posicin de la tabla ya haba otro elemento, se ha producido una colisin. Este problema se puede solucionar asociando una lista a cada posicin de la tabla, aplicando otra funcin o buscando el siguiente elemento libre. Estas posibilidades han de considerarse a la hora de recuperar los datos.

18.2 Bsqueda.Para recuperar los datos, es necesario nicamente conocer la clave del elemento, a la cual se le aplica la funcin resumen. El valor obtenido se mapea al espacio de direcciones de la tabla. Si el elemento existente en la posicin indicada en el paso anterior tiene la misma clave que la empleada en la bsqueda, entonces es el deseado. Si la clave es distinta, se ha de buscar el elemento segn la tcnica empleada para resolver el problema de las colisiones al almacenar el elemento.

19.Practica Recomendad para la funcin Hash.Una buena funcin hash es esencial para el buen rendimiento de una tabla hash. Las colisiones son generalmente resueltas por algn tipo de bsqueda lineal, as que si la funcin tiende a generar valores similares, las bsquedas resultantes se vuelven lentas.

25

Pilas, Colas y Hash

2012

En una funcin hash ideal, el cambio de un simple bit en la llave (incluyendo el hacer la llave ms larga o ms corta) debera cambiar la mitad de los bits del hash, y este cambio debera ser independiente de los cambios provocados por otros bits de la llave. Como una funcin hash puede ser difcil de disear, o computacionalmente cara de ejecucin, se han invertido muchos esfuerzos en el desarrollo de estrategias para la resolucin de colisiones que mitiguen el mal rendimiento del hasheo. Sin embargo, ninguna de estas estrategias es tan efectiva como el desarrollo de una buena funcin hash de principio. Es deseable utilizar la misma funcin hash para arrays de cualquier tamao concebible. Para esto, el ndice de su ubicacin en el array de la tabla hash se calcula generalmente en dos pasos: Un valor hash genrico es calculado, llenando un entero natural de mquina. Este valor es reducido a un ndice vlido en el vector encontrando su mdulo con respecto al tamao del array. El tamao del vector de las tablas hash es con frecuencia un nmero primo. Esto se hace con el objetivo de evitar la tendencia de que los hash de enteros grandes tengan divisores comunes con el tamao de la tabla hash, lo que provocara colisiones tras el clculo del mdulo. Sin embargo, el uso de una tabla de tamao primo no es un sustituto a una buena funcin hash.

26

Pilas, Colas y Hash

2012

Un problema bastante comn que ocurre con las funciones hash es el aglomera miento. El aglomera miento ocurre cuando la estructura de la funcin hash provoca que llaves usadas comnmente tiendan a caer muy cerca unas de otras o incluso consecutivamente en la tabla hash. Esto puede degradar el rendimiento de manera significativa, cuando la tabla se llena usando ciertas estrategias de resolucin de colisiones, como el sondeo lineal. Cuando se depura el manejo de las colisiones en una tabla hash, suele ser til usar una funcin hash que devuelva siempre un valor constante, como 1, que cause colisin en cada insercin.

19.1 Funciones Hash mas usadas.a) Hash de Divisin:


Dado un diccionario D, se fija un nmero m >= |D| (m mayor o igual al tamao del diccionario) y que sea primo no cercano a potencia de 2 o de 10. Siendo k la clave a buscar y h(k) la funcin hash, se tiene h(k)=k%m (Resto de la divisin k/m). b) Hash de Multiplicacin: Si por alguna razn, se necesita una tabla hash con tantos elementos o punteros como una potencia de 2 o de 10, ser mejor usar una funcin hash de multiplicacin, independiente del tamao de la tabla. Se escoge un tamao de tabla m >= |D| (m mayor o igual al tamao del diccionario) y un cierto nmero

27

Pilas, Colas y Hash

2012

irracional (normalmente se usa 1+5^(1/2)/2 o 1-5^(1/2)/2). De este modo se define h (k)= Suelo(m*Parte fraccionaria(k*))

20.Resolucin de Colisiones.Si dos llaves generan un hash apuntando al mismo ndice, los registros correspondientes no pueden ser almacenados en la misma posicin. En estos casos, cuando una casilla ya est ocupada, debemos encontrar otra ubicacin donde almacenar el nuevo registro, y hacerlo de tal manera que podamos encontrarlo cuando se requiera. Para dar una idea de la importancia de una buena estrategia de resolucin de colisiones, considrese el siguiente resultado, derivado de la paradoja de las fechas de nacimiento. Aun cuando supongamos que el resultado de nuestra funcin hash genera ndices aleatorios distribuidos uniformemente en todo el vector, e incluso para vectores de 1 milln de entradas, hay un 95% de posibilidades de que al menos una colisin ocurra antes de alcanzar los 2.500 registros. Hay varias tcnicas de resolucin de colisiones, pero las ms populares son encadenamiento y direccionamiento abierto.

20.1 Hashing Abierto.En la tcnica ms simple de encadenamiento, cada casilla en el array referencia una lista de los registros insertados que colisionan en la misma casilla. La insercin consiste en encontrar la casilla correcta y agregar al
28

Pilas, Colas y Hash

2012

final de la lista correspondiente. El borrado consiste en buscar y quitar de la lista. La tcnica de encadenamiento tiene ventajas sobre direccionamiento abierto. Primero el borrado es simple y segundo el crecimiento de la tabla puede ser pospuesto durante mucho ms tiempo dado que el rendimiento disminuye mucho ms lentamente incluso cuando todas las casillas ya estn ocupadas. De hecho, muchas tablas hash encadenadas pueden no requerir crecimiento nunca, dado que la degradacin de rendimiento es lineal en la medida que se va llenando la tabla. Por ejemplo, una tabla hash encadenada con dos veces el nmero de elementos recomendados, ser dos veces ms lenta en promedio que la misma tabla a su capacidad recomendada. Las tablas hash encadenadas heredan las desventajas de las listas ligadas. Cuando se almacenan cantidades de informacin pequeas, el gasto extra de las listas ligadas puede ser significativo. Tambin los viajes a travs de las listas tienen un rendimiento de cach muy pobre. Otras estructuras de datos pueden ser utilizadas para el encadenamiento en lugar de las listas ligadas. Al usar rboles auto-balanceables, por ejemplo, el tiempo terico del peor de los casos disminuye de O(n) a O(log n). Sin embargo, dado que se supone que cada lista debe ser pequea, esta estrategia es normalmente ineficiente a menos que la tabla
29

Pilas, Colas y Hash

2012

hash sea diseada para correr a mxima capacidad o existan ndices de colisin particularmente grandes. Tambin se pueden utilizar vectores dinmicos para disminuir el espacio extra requerido y mejorar el rendimiento del cach cuando los registros son pequeos.

20.2 Hashing Cerrado.Las tablas hash de direccionamiento abierto pueden almacenar los registros directamente en el array. Las colisiones se resuelven mediante un sondeo del array, en el que se buscan diferentes localidades del array (secuencia de sondeo) hasta que el registro es encontrado o se llega a una casilla vaca, indicando que no existe esa llave en la tabla.

30

Pilas, Colas y Hash

2012

Las secuencias de sondeo ms socorridas incluyen: Sondeo lineal En el que el intervalo entre cada intento es constante (frecuentemente 1). Sondeo cuadrtico En el que el intervalo entre los intentos aumenta linealmente (por lo que los ndices son descritos por una funcin cuadrtica), y Doble hasheo En el que el intervalo entre intentos es constante para cada registro pero es calculado por otra funcin hash. El sondeo lineal ofrece el mejor rendimiento del cach, pero es ms sensible al aglomera miento, en tanto que el doble hasheo tiene pobre rendimiento en el cach pero elimina el problema de aglomera miento. El sondeo cuadrtico se sita en medio. El doble hasheo tambin puede requerir ms clculos que las otras formas de sondeo. Una influencia crtica en el rendimiento de una tabla hash de direccionamiento abierto es el porcentaje de casillas usadas en el array. Conforme el array se acerca al 100% de su capacidad, el nmero de saltos requeridos por el sondeo puede aumentar considerablemente. Una vez que se llena la tabla, los algoritmos de sondeo pueden incluso caer en un
31

Pilas, Colas y Hash

2012

crculo sin fin. Incluso utilizando buenas funciones hash, el lmite aceptable de capacidad es normalmente 80%. Con funciones hash pobremente diseadas el rendimiento puede degradarse incluso con poca informacin, al provocar aglomera miento significativo. No se sabe a ciencia cierta qu provoca que las funciones hash generen aglomera miento, y es muy fcil escribir una funcin hash que, sin querer, provoque un nivel muy elevado de aglomera miento.

21.Ventajas e Inconvenientes.Una tabla hash tiene como principal ventaja que el acceso a los datos suele ser muy rpido si se cumplen las siguientes condiciones:

32

Pilas, Colas y Hash

2012

Una razn de ocupacin no muy elevada (a partir del 75% de ocupacin se producen demasiadas colisiones y la tabla se vuelve ineficiente). Una funcin resumen que distribuya uniformemente las claves. Si la funcin est mal diseada, se producirn muchas colisiones. Los inconvenientes de las tablas hash son: Necesidad de ampliar el espacio de la tabla si el volumen de datos almacenados crece. Se trata de una operacin costosa. Dificultad para recorrer todos los elementos. Se suelen emplear listas para procesar la totalidad de los elementos. Desaprovechamiento de la memoria. Si se reserva espacio para todos los posibles elementos, se consume ms memoria de la necesaria; se suele resolver reservando espacio nicamente para punteros a los elementos.

22.Implementacin en Java.En este mtodo no se requiere que los elementos estn ordenados. El mtodo consiste en asignar el ndice a cada elemento mediante una transformacin del elemento, esto se hace mediante una funcin de conversin llamada funcin hash. Hay diferentes funciones para transformar el elemento y el nmero obtenido es el ndice del elemento.

33

Pilas, Colas y Hash

2012

La principal forma de transformar el elemento es asignarlo directamente, es decir al 0 le corresponde el ndice 0, al 1 el 1, y as sucesivamente pero cuando los elementos son muy grandes se desperdicia mucho espacio ya que necesitamos arreglo grandes para almacenarlos y estos quedan con muchos espacios libres, para utilizar mejor el espacio se utilizan funciones ms complejas. La funcin de hash ideal debera ser biyectiva, esto es, que a cada elemento le corresponda un ndice, y que a cada ndice le corresponda un elemento, pero no siempre es fcil encontrar esa funcin, e incluso a veces es intil, ya que puedes no saber el nmero de elementos a almacenar. La funcin de hash depende de cada problema y de cada finalidad, y se pueden utilizar con nmeros o cadenas, pero las ms utilizadas son:

22.1 Restas Sucesivas


Esta funcin se emplea con claves numricas entre las que existen huecos de tamao conocido, obtenindose direcciones consecutivas. Un ejemplo seran los alumnos de ingeniera en sistemas que entraron en el ao 2005 sus nmeros de control son consecutivos y est definido el nmero de alumnos.
05210800 -05210800 0 05210801 -05210800 1 05210802 -05210800 2 05210899 -05210800 99 34

Pilas, Colas y Hash

2012

22.2 Aritmtica Modular


El ndice de un nmero es resto de la divisin de ese nmero entre un nmero N prefijado, preferentemente primo. Los nmeros se guardarn en las direcciones de memoria de 0 a N-1. Este mtodo tiene el problema de que dos o ms elementos pueden producir el mismo residuo y un ndice puede ser sealado por varios elementos. A este fenmeno se le llama colisin. Si el nmero N es el 7, los nmeros siguientes quedan transformados en:
1679 6 4567 3 8471 1 0435 1 5033 0

Mientras ms grande sea nmero de elementos es mejor escoger un nmero primo mayor para seccionar el arreglo en ms partes. El nmero elegido da el nmero de partes en que se secciona el arreglo, y las cada seccin est compuesta por todos los elementos que arrojen el mismo residuo, y mientras ms pequeas sean las secciones la bsqueda se agilizara mas que es lo que nos interesa.

35

Pilas, Colas y Hash

2012

22.3 Mitad del Cuadrado


Consiste en elevar al cuadrado la clave y coger las cifras centrales. Este mtodo tambin presenta problemas de colisin. 709^2=502681 26 456^2=207936 79 105^2=011025 10 879^2=772641 26 619^2=383161 31

Nota: en caso de que la cifra resultante sea impar se toma el valor nmero y el anterior.

22.4 Truncamiento
Consiste en ignorar parte del nmero y utilizar los elementos restantes como ndice. Tambin se produce colisin. Por ejemplo, si un nmero de 7 cifras se debe ordenar en un arreglo de elementos, se pueden tomar el segundo, el cuarto y el sexto para formar un nuevo nmero: 5700931 703 3498610 481 0056241 064 9134720 142 5174829 142

36

Pilas, Colas y Hash

2012

22.5 Plegamiento
Consiste en dividir el nmero en diferentes partes, y operar con ellas (normalmente con suma o multiplicacin). Tambin se produce colisin. Por ejemplo, si dividimos el nmero de 7 cifras en 2, 2 y 3 cifras y se suman, dar otro nmero de tres cifras (y si no, se toman las tres ltimas cifras): 5700931 > 57 + 00 + 931 = 988 3498610 34 + 98 + 610 = 742 0056241 00 + 56 + 241 = 297 9134720 91 + 34 + 720 = 845 5174929 51 + 74 + 929 = 1054

22.6 Tratamiento de Colisiones


Hay diferentes maneras de solucionarlas pero lo ms efectivo es en vez de crear un arreglo de nmero, crear un arreglo de punteros, donde cada puntero seala el principio de una lista enlazada. As, cada elemento que llega a un determinado ndice se pone en el ltimo lugar de la lista de ese ndice. El tiempo de bsqueda se reduce considerablemente, y no hace falta poner restricciones al tamao del arreglo, ya que se pueden aadir nodos dinmicamente a la lista.

37

Pilas, Colas y Hash

2012

22.7 Prueba Lineal


Consiste en que una vez detectada la colisin se debe recorrer el arreglo secuencialmente a partir del punto de colisin, buscando al elemento. El proceso de bsqueda concluye cuando el elemento es hallado, o bien cuando se encuentra una posicin vaca. Se trata al arreglo como a una estructura circular: el siguiente elemento despus del ltimo es el primero. La funcin de rehashing es, por tanto, de la forma: R(H(X)) = (H(X) + 1) % m (siendo m el tamao del arreglo) Ejemplo: Si la posicin 397 ya estaba ocupada, el registro con clave 0596397 es colocado en la posicin 398, la cual se encuentra disponible. Una vez que el registro ha sido insertado en esta posicin, otro registro que genere la posicin 397 o la 398 es insertado en la posicin siguiente disponible.

38

Potrebbero piacerti anche