2010-09-26 15 views
8

Il mio problema iniziale è che ho bisogno di implementare un array molto veloce e sparse in C#. L'idea originale era di usare un normale Dictionary<uint, TValue> e inserirlo nella mia classe per esporre solo il parametro di tipo TValue. Risulta che questo è piuttosto lento.Implementazione di un array sparse in C#/modo più rapido per mappare un numero intero di bucket/intervallo specifico

Quindi la mia prossima idea era quella di mappare ogni numero intero nell'intervallo necessario (UInt32.MinValue-UInt32.MaxValue) per un secchio, di una certa dimensione e usare quella. Quindi sto cercando un buon modo per mappare un numero intero senza segno X a un segmento Y, ad esempio:

Mappare i numeri da 0-1023 a 8 diversi contenitori con 128 numeri ciascuno, 0-127, 128-255.

Ma se qualcuno ha un modo migliore di implementare un array sparse veloce in C#, sarebbe anche più apprezzato.

risposta

2

Ci sono 101 modi diversi per implementare le matrici sparse a seconda di fattori come:

  • Quanti articoli saranno nella matrice
  • Come sono gli elementi raggruppati insieme
  • Spazio/commercio velocità
  • ecc

la maggior parte dei libri di testo hanno una sezione sulla matrice sparsa, solo facendo un Google si presenta con un sacco di colpi. Si avrà quindi a tradurre il codice in C#, o semplicemente utilizzare il codice di qualcun altro ha scritto, ho trovato due senza troppa fatica (non so quanto bene queste sono)

+0

Per i nuovi arrivati, si noti che in realtà 101 è in realtà probabilmente sottovalutare esso. – fostandy

4

Anch'io ho notato che Dictionary<K,V> è lento quando la chiave è un numero intero. Non so esattamente perché questo è il caso, ma ho scritto un'implementazione hash-table più veloce per uint e ulong tasti:

Accorgimenti/lati negativi:

  • Quello a 64 bit (la chiave è ulong) è generica, ma l'altra (la chiave è uint) assumeValoriperché è tutto ciò di cui avevo bisogno in quel momento; Sono sicuro che puoi rendere questo generico facilmente.

  • Attualmente la capacità determina la dimensione della tabella hash per sempre (vale a dire che non cresce).

+0

È davvero più efficiente avere 'element' essere una classe invece di una struct? – Gabe

+0

@Gabe: non lo so, non l'ho provato. Sospetto che faccia poca o nessuna differenza però. Se vuoi gestire alcuni benchmark, sentiti libero! – Timwi

+0

Stiamo parlando molto più lentamente di un array? Vale a dire. Quindi per array relativamente piccoli e densi, starei meglio con un array booleano per indicare set/not set? – winwaed

Problemi correlati