Was .NET-Wörterbuch unterstützt "finde nächstgelegene Taste" Betrieb?
Ich bin der Konvertierung C++ - code in C# und es ruft std::map::lower_bound(k) zu finden, einen Eintrag in die Karte, dessen Schlüssel gleich oder größer als k sein. Allerdings sehe ich keine Möglichkeit, das zu tun die gleiche Sache mit .NET das SortedDictionary. Ich vermute, ich könnte eine Problemumgehung implementieren, mit der SortedList, aber leider SortedList ist zu langsam (O(n) für einfügen und löschen von Schlüsseln). Was kann ich tun?
Hinweis: ich habe eine Problemumgehung verwenden, nutzt mein Szenario... Speziell, meine keys sind eine Dichte Bevölkerung von ganzen zahlen, beginnend bei knapp über 0, so habe ich eine Liste<TValue> meine Wörterbuch mit der Liste-index dienen als Schlüssel, und die Suche nach einem Schlüssel, der größer oder gleich k kann gemacht werden in nur ein paar schleifendurchläufe. Aber es wäre noch schön zu sehen, dass die ursprüngliche Frage beantwortet.
- Gleichen question, aber ohne Beschränkung auf
SortedList<K, V>
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dauerte es ein paar Monate Arbeit, aber endlich kann ich Ihnen zumindest eine teilweise Lösung für dieses problem... ich nenne es den Compact Patricia Trie, eine sortierte Wörterbuch, das bietet eine "find nächst größeren Schlüssel" Betrieb.
http://www.codeproject.com/KB/recipes/cptrie.aspx
Es ist nur eine teilweise Lösung, da Sie nur bestimmte Arten von Schlüsseln werden unterstützt, nämlich
byte[]
,string
, und alle primitiven integer-Typen (Int8..UInt64). Auch die string-Sortierung groß-und Kleinschreibung.TreeDictionary<K,V>
im C5-Sammlungen das ist ein rot-schwarz-Baum implementation, und hatWeakSuccessor
/TryWeakSuccessor
Methoden, die schon.Das problem ist, dass ein Wörterbuch/hash-Tabelle ist entworfen, um eine einzigartige Position im Speicher basierend auf einer Eingabe-Wert, so müssen Sie eine Daten-Struktur, die entworfen, um Platz für eine Reihe in Verbindung mit jedem Wert, den Sie speichern, und zur gleichen Zeit aktualisieren, jedes Intervall richtig
Ich denke skip-Listen (oder ausgeglichene binäre Bäume) kann Ihnen helfen. Obwohl Sie nicht zum durchführen von suchen in O(n), die Sie tun können, logarithmisch und immer noch schneller als Bäume.
Ich weiß, das ist keine richtige Antwort, da kann ich nicht sagen, dass die .NET BCL enthält bereits eine solche Klasse, Sie haben leider zu implementieren, die eine sich selbst, oder finden Sie eine 3rd-party-assembly, die Sie unterstützen, für Sie. Es scheint ein schönes Beispiel über bei Der CodeProject hier, obwohl.
Können Sie versuchen, den code, den ich schrieb unten. es unter Verwendung der binären Suche, daher vorausgesetzt, die Liste/array vorsortiert.
Erstellte ich drei Daten-Strukturen in Bezug auf B+ - Bäume, die diese Funktionalität bieten, die für einen beliebigen Datentyp:
BList<T>
,BDictionary<K V>
undBMultiMap<K V>
. Jede dieser Datenstrukturen bietenFindLowerBound()
undFindUpperBound()
Methoden wie etwa C++'slower_bound
undupper_bound
.finden, die am nächsten zu K:
oder viel schneller:
Gibt es nicht eine binäre Suchbaum collection Implementierung in der Basis-framework, so werden Sie entweder bauen oder finden eine Implementierung. Wie Sie bemerkt haben, SortedList am nächsten ist, in Bezug auf die Suche aber er ist langsamer (wegen seiner zugrunde liegenden array-Implementierung) für einfügen/löschen.
Ich denke, es ist ein Fehler in der Frage über SortedList Komplexität.
SortedList hat O(log(n)) amortisierten Komplexität für einfügen neues Element. Wenn Sie im Voraus wissen, die Kapazität es kann durchgeführt werden in O(Log(n)) im schlechtesten Fall.
List<T>
hat eineBinarySearch
Methode.) Also Ihre Behauptung, dass "SortedList hat O(log(n)) amortisierten Komplexität" ist schlicht falsch.Können Sie für
SortedSet<T>
mit folgenden extension Methoden: