Puoi accedere agli elementi solo tramite la loro chiave primaria in una tabella hash. Questo è più veloce che con un algoritmo ad albero ( O(1)
invece dilog(n)
), ma non puoi selezionare intervalli ( tutto ciò che si trova tra x
ey
). Gli algoritmi ad albero lo supportano Log(n)
mentre gli indici hash possono provocare una scansione completa della tabella O(n)
. Anche il sovraccarico costante degli indici hash è solitamente maggiore ( che non è un fattore nella notazione theta, ma esiste ancora ). Anche gli algoritmi ad albero sono generalmente più facili da mantenere, crescere con i dati, scalare, ecc.
Gli indici hash funzionano con dimensioni hash predefinite, quindi si finisce con alcuni "bucket" in cui sono archiviati gli oggetti. Questi oggetti vengono ripetuti in loop per trovare davvero quello giusto all'interno di questa partizione.
Quindi, se si dispone di dimensioni ridotte, si ha molto sovraccarico per elementi piccoli, dimensioni grandi comportano un'ulteriore scansione.
Gli algoritmi delle tabelle hash di oggi di solito vengono ridimensionati, ma il ridimensionamento può essere inefficiente.
Esistono infatti algoritmi di hashing scalabili. Non chiedermi come funziona, è un mistero anche per me. AFAIK si sono evoluti dalla replica scalabile in cui il re-hashing non è facile.
Si chiama RUSH - R eplication U nder S calable H ashing, e quegli algoritmi sono quindi chiamati algoritmi RUSH.
Tuttavia, potrebbe esserci un punto in cui il tuo indice supera una dimensione tollerabile rispetto alle dimensioni hash e l'intero indice deve essere ricostruito. Di solito questo non è un problema, ma per database enormi, enormi, questo può richiedere giorni.
Il compromesso per gli algoritmi ad albero è piccolo e sono adatti per quasi tutti i casi d'uso e quindi sono predefiniti.
Tuttavia, se hai un caso d'uso molto preciso e sai esattamente cosa e solo cosa sarà necessario, puoi sfruttare gli indici di hashing.