Tabelle hash VS array associativi


84

Recentemente ho letto delle tabelle hash in un libro molto famoso " Introduzione agli algoritmi ". Non li ho ancora usati in nessuna applicazione reale, ma vorrei. Ma non so come iniziare.
Qualcuno può darmi alcuni esempi di utilizzo, ad esempio, come realizzare un'applicazione di dizionario (come ABBYY Lingvo) utilizzando tabelle hash?
E infine vorrei sapere qual è la differenza tra tabelle hash e array associativi in ​​PHP, intendo dire quale tecnologia dovrei usare e in quali situazioni?
Se mi sbaglio (chiedo scusa) correggetemi, perché in realtà sto iniziando con le tabelle hash e ho solo una conoscenza di base (teorica) su di esse.
Molte grazie.


Risposte:


123

In PHP, gli array associativi sono implementati come tabelle hash, con un po 'di funzionalità extra.

Tuttavia, tecnicamente parlando, un array associativo non è identico a una tabella hash: è semplicemente implementato in parte con una tabella hash dietro le quinte. Poiché la maggior parte della sua implementazione è una tabella hash, può fare tutto ciò che può fare una tabella hash, ma può fare anche di più.

Ad esempio, puoi eseguire il ciclo attraverso un array associativo utilizzando un ciclo for, cosa che non puoi fare con una tabella hash.

Quindi, sebbene siano simili, un array associativo può effettivamente fare un superset di ciò che può fare una tabella hash, quindi non sono esattamente la stessa cosa. Consideralo come tabelle hash più funzionalità extra.

Esempi di codice:

Utilizzo di un array associativo come tabella 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

Loop attraverso un array associativo :

$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

Notare in particolare come nel secondo esempio viene mantenuto l'ordine di ogni elemento (Tyler, Bill Marc) in base all'ordine in cui sono stati inseriti nell'array. Questa è una delle principali differenze tra array associativi e tabelle hash. Una tabella hash non mantiene alcuna connessione tra gli elementi che contiene, mentre un array associativo PHP sì (puoi persino ordinare un array associativo PHP).


3
Hmmm, una spiegazione così breve. Quindi sono ASSOLUTAMENTE la stessa cosa?
Bakhtiyor

2
@Bak Non sono in generale, ma sono in PHP, che gioca un po 'velocemente e liberamente con le strutture dei dati poiché c'è meno preoccupazione per le prestazioni
Michael Mrozek

Capisco, ma in questo caso perché ci sono così tanti algoritmi per funzioni hash e cose del genere, se hash function = array?
Bakhtiyor

4
@Michael, lo fai sembrare uno svantaggio? Rende PHP diverso, ma penso che sia una buona differenza.

1
@Bakhityor: la tua ultima frase è perfetta. Tuttavia, non è necessario "dimenticare" le tabelle hash - in effetti è fantastico che tu capisca già le tabelle hash, perché ora puoi applicare quella conoscenza agli array associativi. Aggiungo alcuni esempi alla mia risposta per chiarirti ulteriormente la cosa.
Cam

21

gli array php SONO fondamentalmente tabelle hash


Modifica: Ah, battimi su :) +1.
Cam

questo è quello che stavo cercando :)
Faizan

11
non c'è modo. una tabella hash richiederebbe una sorta di risoluzione delle collisioni, che gli array php non hanno. La loro strategia di risoluzione delle collisioni sta semplicemente sostituendo il vecchio valore, e questa non è una tabella hash per definizione.
Juan

4
Per quanto ricordo, la risoluzione delle collisioni nelle tabelle hash è per la chiave hash , non per la chiave originale (come dovrebbe funzionare?)
Emanuel Oster

18

La differenza tra un array associativo e una tabella hash è che un array associativo è un tipo di dati, mentre una tabella hash è un'implementazione dei dati. Ovviamente il tipo di array associativo è molto importante in molti linguaggi di programmazione attuali: Perl, Python, PHP, ecc. Una tabella hash è il modo principale per implementare un array associativo, ma non proprio l'unico. E gli array associativi sono l'uso principale delle tabelle hash, ma non proprio l'unico. Quindi non è che siano uguali, ma se hai già array associativi, di solito non dovresti preoccuparti della differenza.

Per motivi di prestazioni, può essere importante sapere che i tuoi array associativi nella tua lingua preferita sono implementati come hash. E può essere importante avere un'idea del costo generale di tale implementazione. Le tabelle hash sono più lente e utilizzano più memoria rispetto agli array lineari come li vedi in C.

Perl raggruppa i due concetti chiamando gli array associativi "hash". Come molte funzionalità di Perl, non è del tutto sbagliato, ma è sciatto.


7

Un array in PHP è in realtà una mappa ordinata, non una tabella hash. La principale differenza tra map e hashtable consiste nell'incapacità di ricordare l'ordine in cui gli elementi sono stati aggiunti. D'altra parte, gli hashtable sono molto più veloci delle mappe. La complessità del recupero di un elemento da map è O (nlogn) e da hashtable è O (1).


4
"La complessità del recupero di un elemento dalla mappa è O (nlogn)" - questo semplicemente non è vero. Anche per una LinkedList, il recupero di un dato elemento è solo O (n). Inoltre, come indicato su en.wikipedia.org/wiki/Hash_table , la tabella hash utilizzata in PHP per implementare un array associativo ha la ricerca di O (1)
StackG

1
Come spiegato qui dopo aver controllato il codice sorgente, gli array associativi in ​​PHP sono implementati come tabelle hash in cui "ogni valore memorizzato nell'hash è collegato al valore memorizzato prima di esso e il valore memorizzato dopo" come una lista collegata. Quindi utilizza memoria extra per questo, ma l'accesso a un determinato elemento utilizzando una chiave è altrettanto veloce di una normale tabella hash, O (1), non più lento.
Leopoldo Sanczyk

2

Un array associativo è un array in cui non si accede agli elementi tramite un indice, ma tramite una chiave. Il modo in cui funziona internamente dipende dall'implementazione (non esiste una regola su come deve funzionare). Un array associativo potrebbe essere implementato da una tabella hash (la maggior parte delle implementazioni lo farà), ma potrebbe anche essere implementato da una sorta di struttura ad albero o da un elenco di salto oppure l'algoritmo itera semplicemente su tutti gli elementi dell'array e cerca una chiave che corrisponde (questo sarebbe terribilmente lento, ma funziona).

Una tabella hash è un modo per archiviare i dati in cui i valori sono associati alle chiavi e dove intendi trovare i valori per le chiavi entro un tempo (di solito quasi) costante. Questo suona esattamente come quello che ti aspetti da un array associativo, ecco perché la maggior parte delle volte le tabelle hash vengono utilizzate per implementare quegli array, ma questo non è obbligatorio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.