Tablas hash VS matrices asociativas

84

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.

Bakhtiyor
fuente

Respuestas:

123

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).

Leva
fuente
3
Hmmm, una explicación tan corta. ¿Entonces son ABSOLUTAMENTE lo mismo?
Bakhtiyor
2
@Bak No son en general, pero están en PHP, que juega un poco rápido y suelto con las estructuras de datos ya que hay menos preocupación por el rendimiento
Michael Mrozek
Ya veo, pero en este caso, ¿por qué hay tantos algoritmos para funciones hash y cosas así, si función hash = matrices?
Bakhtiyor
4
@Michael, ¿lo haces parecer una desventaja? Hace que PHP sea diferente, pero creo que es una buena diferencia.
1
@Bakhityor: Tu última oración es perfecta. Sin embargo, no necesita 'olvidarse' de las tablas hash; de hecho, es genial que ya comprenda las tablas hash, porque ahora puede aplicar ese conocimiento a las matrices asociativas. Estoy agregando algunos ejemplos a mi respuesta para aclararlo aún más.
Cam
21

las matrices php SON básicamente tablas hash

Sergey Eremin
fuente
Editar: Ah - adelante :) +1.
Cam
eso es lo que estaba buscando :)
Faizan
10
de ninguna manera. una tabla hash requeriría algún tipo de resolución de colisión, que las matrices php no tienen. Su estrategia de resolución de colisiones es simplemente reemplazar el valor anterior, y esa no es una tabla hash por definición.
Juan
4
Por lo que recuerdo, la resolución de colisión en las tablas hash es para la clave hash , no para la clave original (¿cómo debería funcionar?)
Emanuel Oster
18

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.

Greg Kuperberg
fuente
7

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).

WoZ
fuente
4
"La complejidad de obtener un elemento del mapa es O (nlogn)"; esto simplemente no es cierto. Incluso para una LinkedList, obtener un elemento dado es solo O (n). Además, como se aborda en en.wikipedia.org/wiki/Hash_table , la tabla hash utilizada en PHP para implementar una matriz asociativa tiene una búsqueda de O (1)
StackG
1
Como se explica aquí después de verificar el código fuente, las matrices asociativas en PHP se implementan como tablas hash donde "cada valor almacenado en el hash está vinculado al valor almacenado antes y al valor almacenado después" como una lista vinculada. Entonces usa memoria adicional para eso, pero acceder a un determinado elemento usando una clave es tan rápido como una tabla hash habitual, O (1), no más lento.
Leopoldo Sanczyk
2

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.

Mecki
fuente