Tabella hash nella struttura dati: Python Esempio

โšก Riepilogo intelligente

Una tabella hash in una struttura dati memorizza i valori come coppie chiave-valore, utilizzando una funzione hash per mappare ogni chiave a un indice per una ricerca rapida. Questa risorsa spiega le funzioni hash, le collisioni, il concatenamento, il probing, le operazioni e Python esempi includono il dizionario integrato.

  • ๐Ÿ”‘ Idea centrale: Una tabella hash memorizza coppie chiave-valore, dove una funzione hash converte ogni chiave in un indice di array.
  • ๐Ÿงฎ Funzione hash: Una formula comune utilizza l'operatore modulo, h(k) = k % m, per mantenere le chiavi entro le dimensioni della tabella.
  • ๐Ÿ’ฅ Collisioni: Quando due chiavi corrispondono allo stesso indice, il conflitto viene risolto tramite concatenamento o sondaggio.
  • โšก Performance: La ricerca, l'inserimento e la cancellazione in una tabella hash hanno un tempo medio O(1) indipendentemente dalla dimensione del dataset.
  • ๐Ÿ Python Esempio: Il tipo di dizionario integrato รจ una tabella hash che gestisce automaticamente l'hashing e le collisioni.

Cos'รจ l'hashing?

Un hash รจ un valore che ha una lunghezza fissa e viene generato utilizzando una formula matematica. I valori hash vengono utilizzati nella compressione dei dati, nella crittografia, ecc. Nell'indicizzazione dei dati, i valori hash vengono utilizzati perchรฉ hanno una dimensione di lunghezza fissa indipendentemente dai valori utilizzati per generarli. Fa sรฌ che i valori hash occupino uno spazio minimo rispetto ad altri valori di diversa lunghezza.

Una funzione hash utilizza un algoritmo matematico per convertire la chiave in un hash. Si verifica una collisione quando una funzione hash produce lo stesso valore hash per piรน di una chiave.

Cos'รจ una tabella hash?

A TABELLA HASH รจ una struttura dati che memorizza valori utilizzando una coppia di chiavi e valori. A ogni valore viene assegnata una chiave univoca generata utilizzando una funzione hash.

Il nome della chiave viene utilizzato per accedere al suo valore associato. Ciรฒ rende la ricerca di valori in una tabella hash molto veloce, indipendentemente dal numero di elementi nella tabella hash.

Funzioni hash

Ad esempio, se desideriamo archiviare i record dei dipendenti e ciascun dipendente viene identificato in modo univoco utilizzando un numero di dipendente.

Possiamo utilizzare il numero del dipendente come chiave e assegnare i dati del dipendente come valore.

L'approccio di cui sopra richiederร  spazio libero aggiuntivo dell'ordine di (m*n2) dove la variabile m รจ la dimensione del schieramentoe la variabile n รจ il numero di cifre per il numero del dipendente. Questo approccio introduce un problema di spazio di archiviazione.

Una funzione hash risolve il problema sopra descritto ottenendo il numero di dipendente e utilizzandolo per generare un valore hash intero, con un numero fisso di cifre e ottimizzando lo spazio di archiviazione. Lo scopo di una funzione hash รจ creare una chiave che verrร  utilizzata per fare riferimento al valore che si desidera memorizzare. La funzione accetta il valore da salvare e quindi utilizza un algoritmo per calcolare il valore della chiave.

Di seguito รจ riportato un esempio di una semplice funzione hash

h(k) = k1 % m

QUI,

  • h(k) รจ la funzione hash che accetta un parametro k. Il parametro k รจ il valore per il quale vogliamo calcolare la chiave.
  • k1 % m รจ l'algoritmo per la nostra funzione hash dove k1 รจ il valore che vogliamo memorizzare e m รจ la dimensione dell'elenco. Usiamo l'operatore modulo per calcolare la chiave.

Esempio

Supponiamo di avere un elenco con una dimensione fissa di 3 e i seguenti valori

[1,2,3]

Possiamo usare la formula sopra per calcolare le posizioni che ogni valore dovrebbe occupare.

L'immagine seguente mostra gli indici disponibili nella nostra tabella hash.

Funzioni hash

Passo 1) Calcola la posizione che sarร  occupata dal primo valore in questo modo

h(1) = 1% 3

= 1

Il valore 1 occuperร  lo spazio su indice 1

Passo 2) Calcola la posizione che sarร  occupata dal secondo valore

h(2) = 2% 3

= 2

Il valore 2 occuperร  lo spazio su indice 2

Passo 3) Calcola la posizione che sarร  occupata dal terzo valore.

h(3) = 3% 3

= 0

Il valore 3 occuperร  lo spazio su indice 0

Risultato Finale

La nostra tabella hash compilata sarร  ora la seguente.

Funzioni hash

Qualitร  di una buona funzione hash

Una buona funzione hash dovrebbe avere le seguenti qualitร .

  • La formula per generare l'hash dovrebbe utilizzare il valore dei dati da archiviare nell'algoritmo.
  • La funzione hash dovrebbe generare valori hash univoci anche per i dati di input che hanno la stessa quantitร .
  • La funzione dovrebbe ridurre al minimo il numero di collisioni. Le collisioni si verificano quando lo stesso valore viene generato per piรน di un valore.
  • I valori devono essere distribuiti in modo coerente su tutti gli hash possibili.

Collisione

Si verifica una collisione quando l'algoritmo genera lo stesso hash per piรน di un valore.

Diamo un'occhiata a un esempio.

Supponiamo di avere il seguente elenco di valori

[3,2,9,11,7]

Supponiamo che la dimensione della tabella hash sia 7 e utilizzeremo la formula (k1 % m) dove m รจ la dimensione della tabella hash.

La tabella seguente mostra i valori hash che verranno generati.

Le Algoritmo hash (k1 % m) Valore hash
3 3% 7 3
2 2% 7 2
9 9% 7 2
11 11% 7 4
7 7% 7 0

Come possiamo vedere dai risultati sopra, i valori 2 e 9 hanno lo stesso valore hash e non possiamo memorizzare piรน di un valore in ciascuna posizione.

Il problema dato puรฒ essere risolto usando il concatenamento o il sondaggio. Le sezioni seguenti discutono in dettaglio il concatenamento e il sondaggio.

chaining

Il concatenamento รจ una tecnica utilizzata per risolvere il problema della collisione utilizzando elenchi collegati ciascuno con indici univoci.

L'immagine seguente visualizza l'aspetto di un elenco concatenato

chaining

Sia 2 che 9 occupano lo stesso indice, ma sono memorizzati come elenchi collegati. Ogni elenco ha un identificatore univoco.

Vantaggi degli elenchi concatenati

Ecco i vantaggi degli elenchi concatenati:

  • Gli elenchi concatenati offrono prestazioni migliori durante l'inserimento di dati perchรฉ l'ordine di inserimento รจ O(1).
  • Non รจ necessario ridimensionare una tabella hash che utilizza un elenco concatenato.
  • Puรฒ contenere facilmente un gran numero di valori purchรฉ sia โ€‹โ€‹disponibile spazio libero.

Sondaggio

L'altra tecnica utilizzata per risolvere la collisione รจ il sondaggio. Quando si utilizza il metodo di sondaggio, se si verifica una collisione, possiamo semplicemente andare avanti e trovare uno slot vuoto in cui memorizzare il nostro valore.

Di seguito sono riportati i metodi di sondaggio:

Metodo Descrizione
Sondaggio lineare Proprio come suggerisce il nome, questo metodo ricerca gli slot vuoti in modo lineare partendo dalla posizione in cui รจ avvenuta la collisione e andando avanti. Se viene raggiunta la fine dell'elenco e non viene trovato nessuno slot vuoto. L'indagine inizia dall'inizio dell'elenco.
Sondaggio quadratico Questo metodo utilizza espressioni polinomiali quadratiche per trovare il successivo slot libero disponibile.
Double hashing Questa tecnica utilizza un algoritmo di funzione hash secondaria per trovare il successivo slot libero disponibile.

Utilizzando il nostro esempio precedente, la tabella hash dopo aver utilizzato il sondaggio apparirebbe come segue:

Sondaggio

Operazioni sulle tabelle hash

Ecco i Operazioni supportate dalle tabelle Hash:

  • Inserimento - Questo Operation viene utilizzato per aggiungere un elemento alla tabella hash
  • Ricerca - Questo Operation viene utilizzato per cercare elementi nella tabella hash utilizzando la chiave
  • Eliminazione - Questo Operazione viene utilizzata per eliminare elementi dalla tabella hash

Operazione di inserimento dati

L'operazione di inserimento viene utilizzata per memorizzare valori nella tabella hash. Quando un nuovo valore viene memorizzato nella tabella hash, gli viene assegnato un numero di indice. Il numero di indice viene calcolato utilizzando la funzione hash. La funzione hash risolve eventuali collisioni che si verificano durante il calcolo del numero di indice.

Cerca l'operazione dati

L'operazione di ricerca viene utilizzata per cercare valori nella tabella hash utilizzando il numero di indice. L'operazione di ricerca restituisce il valore collegato al numero dell'indice di ricerca. Ad esempio, se memorizziamo il valore 6 nell'indice 2, l'operazione di ricerca con il numero di indice 2 restituirร  il valore 6.

Operazione di eliminazione dei dati

L'operazione di eliminazione viene utilizzata per rimuovere un valore da una tabella hash. Per eliminare il OperaLa cancellazione avviene tramite il numero di indice. Una volta eliminato un valore, il numero di indice viene reso libero. Puรฒ essere utilizzato per memorizzare altri valori tramite l'operazione di inserimento.

Implementazione della tabella hash con Python Esempio

Diamo un'occhiata a un semplice esempio che calcola il valore hash di una chiave

def hash_key( key, m):
    return key % m


m = 7

print(f'The hash value for 3 is {hash_key(3,m)}')
print(f'The hash value for 2 is {hash_key(2,m)}')
print(f'The hash value for 9 is {hash_key(9,m)}')
print(f'The hash value for 11 is {hash_key(11,m)}')
print(f'The hash value for 7 is {hash_key(7,m)}')

Tabella hash Code Spiegazione

Tabella hash Code Spiegazione

QUI,

  1. Definisce una funzione hash_key che accetta i parametri key e m.
  2. Utilizza una semplice operazione di modulo per determinare il valore hash
  3. Definisce una variabile m inizializzata al valore 7. Questa รจ la dimensione della nostra tabella hash
  4. Calcola e stampa il valore hash di 3
  5. Calcola e stampa il valore hash di 2
  6. Calcola e stampa il valore hash di 9
  7. Calcola e stampa il valore hash di 11
  8. Calcola e stampa il valore hash di 7

L'esecuzione del codice sopra riportato produce i seguenti risultati.

The hash value for 3 is 3
The hash value for 2 is 2
The hash value for 9 is 2
The hash value for 11 is 4
The hash value for 7 is 0

Python Esempio di dizionario

Python viene fornito con un tipo di dati integrato chiamato Dizionario. Un dizionario รจ un esempio di tabella hash. Memorizza i valori utilizzando una coppia di chiavi e valori. I valori hash vengono generati automaticamente per noi e qualsiasi collisione viene risolta per noi in background.

L'esempio seguente mostra come รจ possibile utilizzare un tipo di dati dizionario in python 3

employee = {
    'name': 'John Doe',
    'age': 36,
    'position': 'Business Manager.'
}

print (f"The name of the employee is {employee['name']}")
employee['position'] = 'Software Engineer'
print (f"The position of {employee['name']} is {employee['position']}")
employee.clear()

print (employee)

Python Esempio di dizionario

QUI,

  1. Definisce un impiegato variabile del dizionario. Il nome della chiave viene utilizzato per archiviare il valore John Doe, l'etร  memorizza 36 e la posizione memorizza il valore Business Manager.
  2. Recupera il valore del nome della chiave e lo stampa nel terminale
  3. Aggiorna il valore della posizione chiave al valore Software Engineer
  4. Stampa i valori del nome e della posizione dei tasti
  5. Elimina tutti i valori memorizzati nella variabile dipendente del nostro dizionario
  6. Stampa il valore del dipendente

L'esecuzione del codice sopra riportato produce i seguenti risultati.

The name of the employee is John Doe.
The position of John Doe is a Software Engineer.
{}

Analisi della complessitร 

Le tabelle hash hanno una complessitร  temporale media di O (1) nello scenario migliore. La complessitร  temporale nel caso peggiore รจ O(n). Lo scenario peggiore si verifica quando molti valori generano la stessa chiave hash e dobbiamo risolvere la collisione tramite sondaggio.

Applicazioni del mondo reale

Nel mondo reale, le tabelle hash vengono utilizzate per archiviare i dati

  • Database
  • Matrici associative
  • Set
  • Cache di memoria

Vantaggi delle tabelle hash

Ecco i vantaggi/vantaggi dell'utilizzo delle tabelle hash:

  • Le tabelle hash offrono prestazioni elevate durante la ricerca di dati, l'inserimento e l'eliminazione di valori esistenti.
  • La complessitร  temporale delle tabelle hash รจ costante indipendentemente dal numero di elementi nella tabella.
  • Funzionano molto bene anche quando si lavora con set di dati di grandi dimensioni.

Svantaggi delle tabelle hash

Ecco gli svantaggi dell'utilizzo delle tabelle hash:

  • Non รจ possibile utilizzare un valore null come chiave.
  • Non รจ possibile evitare collisioni durante la generazione delle chiavi utilizzando. funzioni hash. Le collisioni si verificano quando viene generata una chiave giร  in uso.
  • Se la funzione di hashing presenta molte collisioni, ciรฒ puรฒ portare a un calo delle prestazioni.

DOMANDE FREQUENTI

Un array utilizza indici interi sequenziali, quindi trovare un elemento per valore significa eseguire una scansione. Una tabella hash mappa qualsiasi chiave a un indice tramite una funzione hash, offrendo una complessitร  media di ricerca, inserimento ed eliminazione O(1) indipendentemente dalle dimensioni.

Il fattore di carico รจ il rapporto tra il numero di voci memorizzate e il numero totale di slot in una tabella hash. Un fattore di carico elevato aumenta le collisioni e rallenta le operazioni, quindi molte implementazioni ridimensionano e ricalcolano l'hash una volta che il fattore di carico supera una determinata soglia.

L'indirizzamento a catena memorizza le chiavi in โ€‹โ€‹conflitto in liste concatenate in ogni slot, in modo che la tabella possa contenere piรน elementi rispetto agli slot. L'indirizzamento aperto (probing) mantiene tutte le voci all'interno dell'array, cercando il primo slot libero. L'indirizzamento a catena gestisce meglio i carichi elevati.

L'hashing supporta l'intelligenza artificiale attraverso l'hashing delle caratteristiche, o trucco di hashing, che mappa grandi quantitร  di testo o caratteristiche categoriche in un vettore di dimensioni fisse. Ciรฒ consente di risparmiare memoria e velocizzare l'addestramento, sebbene le collisioni di hash possano unire caratteristiche distinte.

Sรฌ. L'IA puรฒ suggerire modelli di funzioni hash, testarne la distribuzione uniforme e stimare i tassi di collisione su dati di esempio. Aiuta a confrontare le opzioni, ma รจ comunque consigliabile testare la funzione sul proprio carico di lavoro reale prima di adottarla.

Riassumi questo post con: