5 Stimmen

Was ist der effizienteste Weg, um Look-up-Tabelle in C # zu tun

Was ist der effizienteste Weg, um Look-up-Tabelle in C # zu tun

Ich habe eine Nachschlagetabelle. So ähnlich wie

0 "Thing 1"
1 "Thing 2"
2 "Reserved"
3 "Reserved"
4 "Reserved"
5 "Not a Thing"

Wenn also jemand "Ding 1" oder "Ding 2" will, gibt er 0 oder 1 ein. Aber er kann auch etwas anderes eingeben. Ich habe 256 solcher Dinge und vielleicht 200 davon sind reserviert.

Wie lässt sich dies am effizientesten bewerkstelligen?

  • Eine String-Array- oder Wörterbuchvariable, die alle Werte enthält. Und dann nehmen Sie die ganze Zahl und geben den Wert an dieser Stelle zurück.

Ein Problem, das ich mit dieser Lösung habe, sind die vielen "reservierten" Werte. Ich möchte diese redundanten "reservierten" Werte nicht erstellen. Oder ich kann eine if-Anweisung für alle verschiedenen "reservierten" Stellen haben, aber es könnten jetzt nur 2-3 sein, vielleicht 2-3, 40-55 und alle verschiedenen Stellen im Byte. Diese if-Anweisung würde schnell unübersichtlich werden

  • Die andere Möglichkeit, an die ich gedacht habe, war eine Switch-Anweisung. Und ich würde alle 50ish bekannte Werte haben und würde durch und Standard für die reservierten Werte fallen.

Ich frage mich, ob dies eine Menge mehr Verarbeitung als Erstellen eines String-Arrays oder Wörterbuchs und nur den entsprechenden Wert zurückgeben ist.

  • Etwas anderes? Gibt es noch einen anderen Weg, den man in Betracht ziehen könnte?

0voto

Serge Wautier Punkte 20814

Ich bin mir nicht ganz sicher, ob ich Ihr Problem richtig verstehe. Sie haben eine Sammlung von Zeichenketten. Jede Zeichenfolge ist mit einem Index verknüpft. Der Verbraucher fordert einen Index an, und Sie geben die entsprechende Zeichenfolge zurück, es sei denn, der Index ist reserviert . Oder?

Können Sie nicht einfach reservierte Elemente als Null im Array setzen.

Wenn nicht, scheint die Verwendung eines Wörterbuchs, das die reservierten Einträge nicht enthält, eine vernünftige Lösung zu sein.

Wie auch immer, Sie werden wahrscheinlich bessere Antworten erhalten, wenn Sie Ihr Problem klären.

0voto

Manu Punkte 28059

Laden Sie alle Ihre Werte in

var dic = new Dictionary<int, string>();

Und verwenden Sie dies für den Abruf:

string GetDescription(int val)
{
     if(0 <= val && val < 256)
        if(!dic.Contains(val))
           return "Reserved";
        return dic[val];
    throw new ApplicationException("Value must be between 0 and 255");
}

0voto

AutomatedTester Punkte 21864

Ich würde ein Wörterbuch verwenden, um die Suchvorgänge durchzuführen. Dies ist bei weitem der effizienteste Weg, um Nachschlagen zu tun. Mit einer Zeichenfolge wird irgendwo in der Region von O(n) laufen, um das Objekt zu finden.

Es könnte nützlich sein, ein 2. Wörterbuch zu haben, um bei Bedarf einen Reverse Lookup durchzuführen.

0voto

Mike Dunlavey Punkte 39339

Ihre Frage scheint zu implizieren, dass der Abfrageschlüssel eine ganze Zahl ist. Da Sie höchstens 256 Elemente haben, liegt der Abfrageschlüssel im Bereich 0 255, richtig? Wenn ja, haben Sie einfach ein String-Array mit 256 Strings und verwenden den Schlüssel als Index im Array.

Wenn Ihr Abfrageschlüssel ein Zeichenfolgenwert ist, dann ist es eher wie eine echte Nachschlagetabelle. Die Verwendung eines Dictionary-Objekts ist einfach, aber wenn es Ihnen bei einer Menge von nur etwa 50 tatsächlichen Antworten auf Geschwindigkeit ankommt, könnte ein Do-it-yourself-Ansatz wie die binäre Suche oder ein Trie schneller sein. Wenn Sie die binäre Suche verwenden, können Sie, da die Anzahl der Elemente so gering ist, diese abrollen.

Wie oft ändert sich die Liste der Punkte? Wenn sie sich nur sehr selten ändert, können Sie die Geschwindigkeit noch erhöhen, indem Sie Code für die Suche generieren, den Sie dann kompilieren und für jede Abfrage ausführen können.

Andererseits nehme ich an, dass Sie nachgewiesen haben, dass dieser Lookup Ihr Engpass ist, entweder durch Profiling oder Stackshot-Aufnahmen . Wenn weniger als 10 % der Zeit mit dieser Abfrage verbracht werden, dann ist sie no Ihr Engpass, also können Sie auch das tun, was am einfachsten zu programmieren ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X