Vantaggi dell'uso di un array su una tabella hash?

1

Mi sto interrogando sulla seguente domanda. Per simulare un array tramite una tabella hash, è sufficiente impostare le chiavi della tabella hash come indici della matrice e impostare il valore di ciascuna chiave come valore dell'array in tale indice. In questo modo, sembrerebbe che tutto ciò che può fare un array, può fare anche un hash table. Ciò solleva la domanda, c'è qualche inconveniente, forse in termini di tempo o complessità dello spazio, di farlo? Mi piacerebbe sentire le tue opinioni su questa domanda.

    
posta Emmanuel Tsukerman 08.05.2018 - 17:54
fonte

2 risposte

3

Se non ci sono collisioni e ignoriamo il costo della CPU per l'hashing della chiave e non memorizziamo nessuno dei codici hash, l'hashtable consumerebbe la stessa quantità di spazio.

Tuttavia, in pratica, abbiamo collisioni, quindi abbiamo bisogno di un sistema per affrontarlo, che richiede più spazio. La maggior parte delle tabelle hash per la gestione della collisione dell'elenco collegato utilizza indici interi in array, anziché puntatori, per ridurre lo spazio e aumentare la località di memoria. Avrai bisogno di almeno un altro array, per il pool di strutture di elenchi collegati. Esistono molti algoritmi di gestione delle collisioni, ma richiedono tutti ulteriore spazio di archiviazione.

Se gli hash sono costosi da calcolare e le chiavi non memorizzano gli hash stessi, è necessario disporre di memoria aggiuntiva per memorizzare i codici hash.

Infine, devi occuparti di distribuzioni scadenti e funzioni di hash potenzialmente scadenti, se non hai il controllo sulle funzioni di hash. Le funzioni di hash in .net tendono ad essere particolarmente povere, e immagino che siano anche in Java, dal momento che le persone che scrivono la struttura chiave tipicamente devono scrivere la funzione hash e Internet abbonda di scarsi consigli in quest'area. Pertanto, puoi guardare avanti a distribuzioni scadenti, che comportano un numero elevato di collisioni e spazio aggiuntivo necessario per ridurre tali collisioni.

    
risposta data 10.05.2018 - 20:02
fonte
0

Il primo svantaggio è che stai memorizzando più cose in memoria. Invece di archiviare solo un mucchio di oggetti, stai memorizzando un mucchio di oggetti e indici. Questo solo spreca spazio e potrebbe rallentare il programma (specialmente se i dati diventano troppo grandi per la cache del processore).

Il secondo svantaggio è che rende più complicato (e quindi più lento) fare le cose a cui gli array sono bravi.

Iterare attraverso gli array è banale. Dovresti già conoscere l'indirizzo del primo elemento. Trovare l'indirizzo del prossimo elemento richiede semplicemente l'aggiunta della dimensione di un oggetto all'indirizzo. Questa è solo una istruzione "add".

Trovare l'elemento n in un array è quasi banale. Inizia con l'indirizzo del primo elemento e aggiungi ( n volte la dimensione di un oggetto). Quindi uno "moltiplica" e uno "aggiungi".

    
risposta data 11.05.2018 - 11:17
fonte

Leggi altre domande sui tag