Ich dachte über die Leistung des Anrufs List<T>.Indexof(item)
nach. Ich bin nicht sicher, ob es eine O (n) Leistung für einen sequentiellen Algorithmus oder O (log (n)) Leistung für einen binären Baum ist.Wie wird die Liste <T> .IndexOf() in C# implementiert?
Antwort
Mit Reflektor für .NET können wir sehen:
public int IndexOf(T item)
{
return Array.IndexOf<T>(this._items, item, 0, this._size);
}
public static int IndexOf<T>(T[] array, T value, int startIndex, int count)
{
return EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count);
}
internal virtual int IndexOf(T[] array, T value, int startIndex, int count)
{
int num = startIndex + count;
for (int i = startIndex; i < num; i++)
{
if (this.Equals(array[i], value))
return i;
}
return -1;
}
Hinter den Kulissen wird ein normaler array
verwendet, tatsächlich ruft die IndexOf
Methode einfach Array.IndexOf
auf. Da Arrays keine Elemente sortieren, ist die Leistung O (n).
Es ist O(n)
nach MSDN.
Diese Methode führt eine lineare Suche aus; Daher ist diese Methode eine O (n) -Operation, wobei n die Anzahl ist.
List<T>
wird durch ein flaches Array unterstützt, so list.IndexOf(item)
ist O (n).
Wenn Sie eine schnellere Leistung benötigen, betrachten Sie HashSet<T>
. Es ist ein Kompromiss zwischen Geschwindigkeit und Speicher, aber es ist es wert, wenn Sie Ersteres gegenüber Letzterem bewerten.
(es ist nicht genau das gleiche wie ein List<T>
, es wie eine einzige Spalte Wörterbuch verhält, sondern auch für Fälle, in denen Sie eine einzigartige Liste gehen zu müssen, ist es eine Möglichkeit, es zu tun.)
List<T>.IndexOf
ist O (n) was tatsächlich optimal für einen ungeordneten Satz von n Elementen ist.
List<T>.BinarySearch
ist O (log n) aber funktioniert nur korrekt, wenn die Liste sortiert ist.
Dies ist eine alte Frage, aber ich dachte, dieser Link interessant wäre: Zugang zu Ihnen, dass heute Experiment: List internals and performance when adding new elements
Meine verstorbenen Antwort, aber ich denke, es ist erwähnenswert, können direkt die Quellen MS: http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs
Kein Nachdenken mehr nötig, da der .NET BCL-Code jetzt online verfügbar ist.
Implementiert eine Liste variabler Größe, die ein Array von Objekten zum Speichern der Elemente verwendet. Eine Liste hat eine Kapazität, die dem internen Array zugewiesen ist. Wenn Elemente zu einer Liste hinzugefügt werden, wird die Kapazität von die Liste automatisch nach Bedarf erhöht, indem das interne Array erneut zugewiesen wird.
Wie als Array implementiert und man lineare Suche, ausführung kann leicht ableiten, dass die algorithmische Komplexität des Verfahrens IndexOf
O (n) ist.
Wie von anderen die genannten Informationen sind auf der Msdn öffentlich zugänglich: https://msdn.microsoft.com/en-us/library/e4w08k17(v=vs.110).aspx
Dieses Verfahren eine lineare Suche durchführt; Daher ist diese Methode eine O (n) -Operation, wobei n Count ist.
Auch hier können Sie die Quellen überprüfen und seing am Ende, dass die statische Hilfsmethode IndexOf
der Array-Klasse tatsächlich hinter den Kulissen genannt wird:
http://referencesource.microsoft.com/#mscorlib/system/array.cs
Wenn die Liste/Array bereits sortiert vorher kann man dann eher eine binäre Suche verwenden: https://msdn.microsoft.com/en-us/library/w4e7fxsh(v=vs.110).aspx
Diese Methode ist eine O-Operation (n log), Dabei steht n für die Anzahl der Elemente im Bereich.
Super! Vielen Dank dafür. Es ist mir egal, was die Leute sagen, manchmal muss man sich nur den Quellcode ansehen. –
- 1. Liste <string> Objekt IndexOf zurückgeben -1. Wie?
- 2. Wie benutze ich CMake Generator Ausdruck $ <TARGET_FILE: tgt>?
- 3. Wie konvertiert man die Liste <char> in die Liste <string> in C#?
- 4. Substring IndexOf in C#
- 5. Liste <T> implementiert SyncRoot nicht!
- 6. Wie wird Live-Videoübertragung in C# implementiert?
- 7. Effizienz der Liste <T> .IndexOf() im Vergleich zu Liste <T> .FindIndex()
- 8. Wie wird die @ encode Compiler Direktive in Objective-C implementiert?
- 9. Wie wird die Abhängigkeitseigenschaft implementiert?
- 10. Wie wird die Laufzeitlizenzierung implementiert?
- 11. Wie wird die Großschreibung in nHibernate implementiert?
- 12. Wie kann ich IEnumerable <T> in C# in die Liste <T> konvertieren?
- 13. NSString indexOf in Objective-C
- 14. Kann in C# eine Liste <Child> in die Liste <Parent> umgewandelt werden?
- 15. Wie wird @private implementiert?
- 16. DART: indexOf() in einer Liste von Instanzen
- 17. So verwenden Sie die IndexOf() -Methode der Liste <object>
- 18. Wie konvertiert man die Liste <String[]> in die Liste <MyObject>?
- 19. Wie wird std :: is_constructible <T, Args> implementiert?
- 20. Wie wird Serializable implementiert?
- 21. Wie wird die 'NSTableview Delegate' Methode implementiert?
- 22. Wie wird OpenID implementiert?
- 23. Wie wird set() implementiert?
- 24. Wie wird die http-Post-Methode implementiert?
- 25. Wie wird die Koppelnavigation beim Drehen implementiert?
- 26. Wie wird die Save/Load-Funktionalität implementiert?
- 27. Wie wird pthread_join implementiert?
- 28. Wie wird __RTC_CheckEsp implementiert?
- 29. Wie wird die Java # intern() Methode implementiert?
- 30. Wie wird die feste Seitenleiste korrekt implementiert?
Schauen Sie sich den Code nie an, wenn detaillierte Dokumentation vorhanden ist. Manchmal ist der Code nur ein Implementierungsdetail und es gibt keine Garantien. –
@Ken Bloom: MSDN Artikel sind manchmal sehr gut, manchmal sind schrecklich. Also, wenn Sie eine Frage über die Implementierung einer bestimmten Methode haben, denke ich, der beste Weg - gehen und sehen, wie es wirklich umgesetzt wird. – abatishchev
Wenn der Code und die Kommentare nicht übereinstimmen, sind beide wahrscheinlich falsch. – Malfist