Junior
Qual è il principio di funzionamento di una tabella hash?
sobes.tech AI
Risposta dell'AI
La tabella hash (o array associativo) memorizza coppie "chiave-valore". Il principio di funzionamento si basa sull'uso di una funzione hash, che trasforma la chiave in un indice numerico (hash), indicando il luogo di memorizzazione del valore nell'array (cestino).
Passaggi:
- Calcolo dell'hash: Per una chiave data, si calcola l'hash.
<?php $key = "example"; $hash = crc32($key); // Esempio di funzione hash semplice - Determinazione dell'indice: L'hash viene trasformato in un indice dell'array, di solito usando l'operazione modulo della dimensione dell'array.
<?php $arraySize = 10; $index = $hash % $arraySize; - Accesso al cestino: Si accede al cestino corrispondente nell'array usando l'indice calcolato.
- Risoluzione delle collisioni: Poiché chiavi diverse possono avere lo stesso hash (collisione), il cestino può contenere più coppie "chiave-valore". Per risolvere le collisioni, si usano metodi diversi:
- Metodo di chaining (separate chaining): Ogni cestino memorizza una lista (ad esempio, una lista collegata) di coppie "chiave-valore" i cui hash coincidono.
- Metodo di indirizzamento aperto (open addressing): In caso di collisione, si effettua una ricerca ripetuta di una cella libera nell'array secondo una regola determinata (sondaggio lineare, quadratico, doppio hashing).
Operazioni:
- Inserimento: Si calcola l'hash della chiave, si determina l'indice, e la coppia "chiave-valore" viene inserita nel cestino corrispondente. In caso di collisione, si aggiunge alla lista (chaining) o si cerca un posto libero (indirizzamento aperto).
- Ricerca: Si calcola l'hash della chiave, si determina l'indice. Nel cestino corrispondente, si cerca il valore tramite la chiave. Nel metodo di chaining, si percorrono gli elementi della lista; nell'indirizzamento aperto, si effettua una ricerca sequenziale.
- Cancellazione: Si calcola l'hash della chiave, si determina l'indice. Nel cestino corrispondente, si trova e si elimina la coppia tramite la chiave.
Vantaggi:
- Accesso rapido agli elementi (in media O(1)).
- Uso efficiente della memoria.
Svantaggi:
- La performance può peggiorare con un grande numero di collisioni.
- La dimensione della tabella può richiedere una regolazione (rehashing) per mantenere l'efficienza.