Ein Sparse-Array in C # implementieren / schnellste Methode zum Zuordnen einer Ganzzahl zu einer bestimmten Bucket- / Bereichsnummer

8

Mein erstes Problem ist, dass ich ein sehr schnelles, spärliches Array in C # implementieren muss. Ursprüngliche Idee war, ein normales Dictionary<uint, TValue> zu verwenden und es in meine eigene Klasse zu legen, um nur den TValue type Parameter freizulegen. Stellt sich heraus, das ist ziemlich langsam.

Meine nächste Idee bestand also darin, jede ganze Zahl im benötigten Bereich ( UInt32.MinValue bis UInt32.MaxValue ) einem Bucket von einiger Größe zuzuordnen und zu verwenden. Ich suche also nach einer guten Möglichkeit, eine vorzeichenlose Ganzzahl X einem Bucket Y zuzuordnen, zum Beispiel:

Ordnen Sie die Zahlen 0-1023 auf 8 verschiedene Buckets zu, die jeweils 128 Zahlen enthalten, 0-127, 128-255.

Aber wenn jemand eine schnellere Möglichkeit hat, ein schnelles Sparse-Array in C # zu implementieren, würde das auch am meisten geschätzt werden.

    
thr 26.09.2010, 14:17
quelle

2 Antworten

4

Ich habe auch festgestellt, dass Dictionary<K,V> langsam ist, wenn der Schlüssel eine ganze Zahl ist. Ich weiß nicht genau, warum das so ist, aber ich habe eine schnellere Implementierung der Hashtabelle für uint und ulong keys geschrieben:

Vorbehalte / Nachteile:

  • Der 64-Bit-Schlüssel (Schlüssel ist ulong ) ist generisch, aber der andere (Schlüssel ist uint ) nimmt int -Werte an, weil das alles ist, was ich zu der Zeit brauchte; Ich bin sicher, dass Sie dies leicht generisch machen können.

  • Gegenwärtig bestimmt die Kapazität die Größe der Hashtabelle für immer (d. h. sie wächst nicht).

Timwi 26.09.2010 14:53
quelle
2

Es gibt 101 verschiedene Möglichkeiten, Sparse Arrays zu implementieren, abhängig von Faktoren wie:

  • Wie viele Elemente werden im Array enthalten sein
  • Wie sind die Objekte zusammen gruppiert?
  • Raum / Geschwindigkeit von
  • usw.

Die meisten Lehrbücher haben einen Abschnitt mit spärlichem Array, bei dem Google einfach viele Treffer erzielt. Sie müssen dann den Code in C # übersetzen, oder einfach den Code verwenden, den jemand anderes geschrieben hat, ich habe zwei ohne viel Aufwand gefunden (ich weiß nicht, wie gut das ist)

Ian Ringrose 26.09.2010 14:28
quelle

Tags und Links