2009-09-07 12 views
7

Sono stato sconcertante per alcuni giorni ... sentitevi liberi di abbattere qualsiasi mia ipotesi.Hashtables (dizionario ecc.) Con chiavi intere

Stiamo usando un dizionario con chiavi intere. Suppongo che il valore della chiave in questo caso sia usato direttamente come hash. Questo significa (se le chiavi sono raggruppate su un piccolo intervallo) che la distribuzione dell'hash della chiave (come la stessa chiave, giusto?) Sarà in un intervallo simile e quindi una scelta sbagliata per un hashtable?

Sarebbe meglio fornire a IEqualityComparer che ha fatto qualcosa di intelligente con i numeri primi e la matematica del modulo per calcolare un hash meglio distribuito?

+0

dipende dalla distribuzione delle chiavi integer. Le chiavi sono già formate da un numero primo quando si calcola il bucket hash. –

+0

Perché il codice hash è lo stesso del valore intero? Provalo! – SteveD

+1

Il codice hash corrisponde al valore intero. – spender

risposta

7

Non è usato direttamente in quanto il dizionario sarà ancora chiedere la chiave per il suo hash - ma il valore hash di un Int32è solo il valore, in modo dalla spinta della tua domanda è rilevante, sì.

Credo che il modo in cui funziona il dizionario .NET non si basa su valori di hash distribuiti uniformemente. Ci vuole hash % bucketCount dove bucketCount è sempre primo. (Questo viene dalla memoria però - potrei sbagliarmi.)

Si potrebbe ancora finire con un set di chiavi inefficiente, ovviamente se sono distanziati dal numero di bucket. Ma sarà sempre così: un tavolo hash sarà sempre O (1) per tutte le chiavi se hanno valori hash univoci e la tabella ha mantenuto un set di bucket per ogni possibile hash :) In realtà tende a non essere un problema Se ti capita di sapere che è sarà essere un problema, quindi sì, un aiuto personalizzato IEqualityComparer<T> potrebbe aiutare.

+0

Appena controllato con riflettore ... hai ragione con hash% bucketcount. Sapendo che tutto cade a posto. Grazie Jon. – spender

0

Supponendo che si stia utilizzando un'implementazione di tabella hash di libreria standard, è probabile che la chiave sia non l' hash, anche se la chiave è un numero intero, esattamente per la ragione che si fa notare.

Così mentre la logica relativa alle distribuzioni hash è corretta, l'ipotesi iniziale che le chiavi integer significhino che hash = keys non è probabilmente.

Se ho torto re: .NET allora oh beh; questa è più di una risposta generalizzata. :)

+0

Penso che sia abbastanza comune che l'hash di un tipo numerico sia solo il valore, assumendo che si adatti all'intervallo hash. –

+0

Un potenziale problema in cui ci si imbatte è però con pattern in sequenze di numeri: se si ottiene sfortuna con la larghezza del pattern che è un multiplo del bucketCount, si incontrano problemi. – Amber

+0

Esattamente come il mio post cita ... ma * qualsiasi * algoritmo hash può finire con quel problema se sei sfortunato. –

0

Prima di fare qualcosa di intelligente, testerei la sua velocità così com'è, e vedere se è adatto a voi. Se non lo è, prova la cosa intelligente. Ma mi aspetterei che sarebbe meglio lasciar perdere; è più importante che gli hash non entrino in collisione, e finché ciò accade, la vita andrà bene.

Problemi correlati