Qual è la differenza tra un hash e un dizionario?


Risposte:


92

Hashè una struttura di dati dal nome estremamente scadente in cui il programmatore ha confuso l'interfaccia con l'implementazione ( ed era troppo pigro per scrivere il nome completo, vale a dire HashTableinvece ricorrere ad un'abbreviazione Hash).

Dictionaryè il nome "corretto" dell'interfaccia (= ADT ), ovvero un contenitore associativo che mappa (solitamente univoci) le chiavi su valori (non necessariamente univoci).

Una tabella hash è una possibile implementazione di un tale dizionario che fornisce caratteristiche di accesso abbastanza buone (in termini di runtime) ed è quindi spesso l'implementazione predefinita.

Tale implementazione ha due proprietà importanti:

  1. le chiavi devono essere hashing e l' uguaglianza comparabile .
  2. le voci non appaiono in un ordine particolare nel dizionario.

(Affinché una chiave sia hash significa che possiamo calcolare un valore numerico da una chiave che viene successivamente utilizzata come indice in un array.)

Esistono implementazioni alternative della struttura dei dati del dizionario che impongono un ordinamento sulle chiavi - questo viene spesso chiamato dizionario ordinato (e di solito viene implementato in termini di un albero di ricerca, sebbene esistano altre implementazioni efficienti).


Riassumendo: un dizionario è un ADT che mappa le chiavi sui valori. Esistono diverse implementazioni possibili di questo ADT, di cui la tabella hash è una. Hashè un termine improprio ma nel contesto è equivalente a un dizionario implementato in termini di una tabella hash.


4
Per fare un esempio in C ++, i modelli di contenitore associativo standard non possono essere implementati come hash, anche se lo standard successivo avrà quelle che sono effettivamente tabelle hash. Sono chiamati unordered_mapa mostrare quello che fanno piuttosto che quello che sono.
David Thornley,

6
"Corretto" secondo quale autorità? In alcune lingue, come Ruby e Perl, il nome ufficiale "leggi" corretto "per queste strutture è" hash ".
nohat

11
@nohat: nota il mio uso delle virgolette. Inoltre, io ho spiegato il motivo per cui il nome è mal scelto, non ho io? Quindi, se hai bisogno di un'autorità, allora dirò che è dall'autorità della polizia teorica dell'informatica.
Konrad Rudolph,

9
È interessante notare che in Ruby 1.9 è effettivamente impossibile implementare la Hashclasse con una tabella hash, dal momento che Ruby 1.9 Hashes preserva l'ordine di inserimento mentre una tabella hash no. Quindi, in Ruby 1.9, il nome Hashnon riflette nemmeno più l'implementazione.
Jörg W Mittag,

7
@hippietrail Ti sbagli: in primo luogo, queste sono descrizioni oggettive. Dopotutto, mi qualifico perché la denominazione è scarsa e un termine improprio (vedi sotto). "Troppo pigro" è una licenza artistica da parte mia, ma rimane il punto che la ragione per abbreviare il nome è intrinseca, cioè non c'è motivo di usare un nome breve qui se non quello di abbreviare il nome. E ti sbagli sul "dizionario": questo è semplicemente il nome ufficiale della struttura dei dati. La tua definizione di "dizionario" è sbagliata nel contesto dell'informatica e il nome precede Python da decenni.
Konrad Rudolph,

8

"Dizionario" è il nome del concetto. Una tabella hash è una possibile implementazione.


1
Hash è anche un ADT. HashTable è un'implementazione di un Hash
Sairam il

3
@Sairam Penso che sia molto più comune che 'hash' significhi una funzione hash piuttosto che una tabella hash.
jk.

@jk In realtà l '"hash" è il risultato dell'applicazione di una "funzione / algoritmo hash" ad alcuni input. Una "tabella hash" o "mappa hash" omehoe collega e oggetto hash a qualche oggetto (oggetto in una forma generica, non limitato a OOP)
johannes

Ci sono lingue che usano 'Hash' per riferirsi a una struttura di tipo dizionario piuttosto che semplicemente all'operazione della funzione hash. Ruby, per esempio .
Sean Burton,

7

Un dizionario è il termine collettivo indicato per qualsiasi implementazione della struttura di dati utilizzata per ricerche / inserimenti rapidi. Ciò può essere ottenuto / implementato utilizzando una varietà di strutture dati come una tabella hash, salta liste, albero rb ecc. Una tabella hash è una struttura dati specifica utile per molti scopi, inclusa l'implementazione di un dizionario.


Hash è anche un ADT. C'è qualche differenza specifica tra Hash e Dictionary ADT?
Sairam,

2
@Sairam: No, un hash è l'output di un certo tipo di algoritmo (funzione hash).

5

Un dizionario utilizza una chiave per fare riferimento al valore direttamente all'interno di un array associativo .

vale a dire (KEY => VALUE)

Un hash è più spesso descritto come una tabella hash che utilizza una funzione hash per calcolare la posizione in memoria (o più facilmente un array) dove sarà il valore. L'hash prenderà KEY come input e darà un valore come output. Quindi collegare quel valore nella memoria o nell'indice dell'array.

vale a dire KEY => HASH FUNCTION => VALUE

Immagino che uno sia diretto mentre l'altro no. Le funzioni di hash potrebbero non essere perfette e talvolta possono fornire un indice che fa riferimento a un valore errato. Ma questo può essere corretto.

Il miglior posto dove cercare: Wikipedia ( array associativo e tabella hash )

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.