Binäre Suche auf den Tasten der SortedList<K V>
Muss ich schreiben einige code für die lineare interpolation und ich bin versucht, herauszufinden, die effizienteste Weg, um die Schlüssel zu suchen der ein SortedList<K, V>
für die Obere und untere Tasten, die um mein Ziel-Schlüssel.
SortedList<int, double> xyTable = new SortedList<int, double>()
{
{1, 10}, {2, 20}, {3, 30}, {4,40}
};
double targetX = 3.5;
Was ist der effizienteste Weg, um in der Liste suchen und bestimmen, die 3.5 ist zwischen 3 und 4? Ich habe eine Methode /cheat, der funktioniert für ganze zahlen (vorübergehend legen Sie die Ziel-Taste in der Liste suchen Sie dann den index), aber ich dachte, ich würde bitten, die Profis, also könnte ich die Erzeugung von hochwertigen code.
Dank.
- sortiert, perfekt für die binäre Suche
- Ein Beispiel von log(n) lowerbound Suche
Du musst angemeldet sein, um einen Kommentar abzugeben.
Binäre Suche gibt Ihnen anständige Leistung auf eine Liste. Jedoch die Schlüssel-Eigenschaft auf
SortedList
ist der TypIList
, in der Erwägung, dassBinarySearch
definiert istList
. Glücklicherweise finden Sie eine Implementierung der binären Suche fürIList
in diesem Zusammenhang Frage:Wie zum ausführen einer binären Suche auf IList<T>?
-1
im Falle von nicht vorhandenen Elementen.In meinem Fall die Quelle
SortedList
ändert sich nicht viel, da deren Einsatz als lookup-Tabelle. So in diesem Fall macht es Sinn, konvertieren Sie dieSortedList
zu einemList<T>
einmal. Danach ist es Recht einfach zu bedienen built-in binarysearch-Methode Methode derList<T>
...ToList
jedoch ist eine überflüssige und langsame O(n) - operation, und es ist besser für die Leistung (CPU und Arbeitsspeicher Verbrauch) nach der Arbeit direkt auf dieIList<K> Keys
wie angegeben durch ColinE Antwort, die auch links eine Frage mit einer kopieren-und-pasteable Antwort.MSDN,
Die Elemente der SortedList-Objekt sortiert werden, indem Sie die Tasten entweder nach einer bestimmten IComparer-Implementierung angegeben, wenn die SortedList erstellt wird, oder nach der IComparable-Implementierung zur Verfügung gestellt, indem die Tasten selbst.
Die index-Sequenz basierend auf der Sortierreihenfolge. Wenn ein element Hinzugefügt wird, wird es eingefügt in SortedList in der richtigen Reihenfolge Sortieren lassen, und die Indizierung passt sich entsprechend an. Wenn ein element entfernt wird, wird die Indizierung passt sich auch entsprechend an. Daher wird der index von einem bestimmten Schlüssel/Wert-paar kann geändert werden, wenn Elemente Hinzugefügt oder entfernt werden aus der SortedList.
*****Diese Methode nutzt einen binären such-Algorithmus; daher diese Methode ist eine O(log n) - operation, wobei n für die Anzahl.*****
Beginnend mit dem .NET Framework 2.0 wird diese Methode verwendet die collection-Objekte' Equals und CompareTo-Methoden auf einen Gegenstand, um zu bestimmen, ob das Element vorhanden ist. In den früheren Versionen des .NET Framework, diese Bestimmung wurde vorgenommen, indem die Equals und CompareTo Methoden der item-parameter auf die Objekte in der Sammlung.
In anderen Worten, die Methode IndexOfKey in SortedList ist eigentlich mit binarysearch-Methode der Algorithmus bereits, so gibt es keine Notwendigkeit, zu konvertieren form SortedList Liste in Ihrem Fall.
Hoffe es hilft..
Dies funktionieren könnte..ich habe nicht testen Sie es aus. Wenn nicht, hoffentlich ist es dicht genug, dass Sie können es verwenden, mit geringfügigen Verbesserungen. Das ist ein komisches problem, also ich behandelt alle von der "boundary cases", damit ich nicht darüber nachdenken, was der Algorithmus tun würde, wenn der Bereich wurde bis auf 2 Elemente oder weniger.
List<T>.BinarySearch()
?List<T>
, aber er hat nurIList<T>
, so dass Ihre Lösung ist tatsächlich ein guter Vorschlag.