Recientemente leí sobre tablas hash en un libro muy famoso " Introducción a los algoritmos ". Todavía no los he usado en ninguna aplicación real, pero quiero hacerlo. Pero no sé cómo empezar.
¿Alguien puede darme algunas muestras de su uso, por ejemplo, cómo realizar una aplicación de diccionario (como ABBYY Lingvo) usando tablas hash?
Y finalmente me gustaría saber cuál es la diferencia entre tablas hash y matrices asociativas en PHP, quiero decir, ¿qué tecnología debo usar y en qué situaciones?
Si me equivoco (pido perdón), corríjanme, porque en realidad estoy comenzando con tablas hash y solo tengo conocimientos básicos (teóricos) sobre ellas.
Muchas gracias.
php
hashtable
associative-array
Bakhtiyor
fuente
fuente
Respuestas:
En PHP, las matrices asociativas se implementan como tablas hash, con un poco de funcionalidad adicional.
Sin embargo, técnicamente hablando, una matriz asociativa no es idéntica a una tabla hash, simplemente se implementa en parte con una tabla hash detrás de escena. Debido a que la mayor parte de su implementación es una tabla hash, puede hacer todo lo que puede hacer una tabla hash, pero también puede hacer más.
Por ejemplo, puede recorrer una matriz asociativa usando un bucle for, lo que no puede hacer con una tabla hash.
Entonces, aunque son similares, una matriz asociativa puede hacer un superconjunto de lo que puede hacer una tabla hash, por lo que no son exactamente lo mismo. Piense en ello como tablas hash más una funcionalidad adicional.
Ejemplos de código:
Usando una matriz asociativa como una tabla hash :
$favoriteColor = array(); $favoriteColor['bob']='blue'; $favoriteColor['Peter']='red'; $favoriteColor['Sally']='pink'; echo 'bob likes: '.$favoriteColor['bob']."\n"; echo 'Sally likes: '.$favoriteColor['Sally']."\n"; //output: bob likes blue // Sally likes pink
Bucle a través de una matriz asociativa :
$idTable=array(); $idTable['Tyler']=1; $idTable['Bill']=20; $idTable['Marc']=4; //up until here, we're using the array as a hashtable. //now we loop through the array - you can't do this with a hashtable: foreach($idTable as $person=>$id) echo 'id: '.$id.' | person: '.$person."\n"; //output: id: 1 | person: Tyler // id: 20 | person: Bill // id: 4 | person: Marc
Observe especialmente cómo en el segundo ejemplo, el orden de cada elemento se mantiene (Tyler, Bill Marc) según el orden en el que se ingresaron en la matriz. Esta es una gran diferencia entre matrices asociativas y tablas hash. Una tabla hash no mantiene ninguna conexión entre los elementos que contiene, mientras que una matriz asociativa PHP sí lo hace (incluso puede ordenar una matriz asociativa PHP).
fuente
las matrices php SON básicamente tablas hash
fuente
La diferencia entre una matriz asociativa y una tabla hash es que una matriz asociativa es un tipo de datos, mientras que una tabla hash es una implementación de datos. Obviamente, el tipo de matriz asociativa es muy importante en muchos lenguajes de programación actuales: Perl, Python, PHP, etc. Una tabla hash es la forma principal de implementar una matriz asociativa, pero no la única. Y las matrices asociativas son el uso principal de las tablas hash, pero no el único uso. Así que no es que sean iguales, pero si ya tiene matrices asociativas, por lo general no debería preocuparse por la diferencia.
Por motivos de rendimiento, puede ser importante saber que sus matrices asociativas en su idioma favorito se implementan como hashes. Y puede ser importante tener una idea del costo general de esa implementación. Las tablas hash son más lentas y usan más memoria que las matrices lineales como las ve en C.
Perl agrupa los dos conceptos llamando a las matrices asociativas "hashes". Al igual que una serie de funciones de Perl, no está del todo mal, pero es descuidado.
fuente
Una matriz en PHP es en realidad un mapa ordenado, no una tabla hash. La principal diferencia entre mapa y tabla hash consiste en la incapacidad de recordar el orden en el que se han agregado los elementos. Por otro lado, las tablas hash son mucho más rápidas que los mapas. La complejidad de obtener un elemento del mapa es O (nlogn) y de la tabla hash es O (1).
fuente
Una matriz asociativa es una matriz en la que no se accede a los elementos mediante un índice, sino mediante una clave. Cómo funciona esto internamente es específico de la implementación (no hay una regla de cómo debe funcionar). Una matriz asociativa podría implementarse mediante una tabla hash (la mayoría de las implementaciones lo harán), pero también podría implementarse mediante algún tipo de estructura de árbol o una lista de omisión o el algoritmo simplemente itera sobre todos los elementos de la matriz y busca una clave que coincide (esto sería terriblemente lento, pero funciona).
Una tabla hash es una forma de almacenar datos donde los valores están asociados a las claves y donde pretende encontrar valores para las claves dentro de un tiempo (generalmente casi) constante. Esto suena exactamente como lo que espera de una matriz asociativa, por eso la mayoría de las veces se utilizan tablas hash para implementar esas matrices, pero eso no es obligatorio.
fuente