Schneller / effizienter Weg, um den Index des Mindestwerts in ListT zu erhalten?

8

Gibt es eine Möglichkeit, den Mindestwertindex effizienter / schneller zu finden?

%Vor%     
Kamil 01.05.2013, 17:41
quelle

8 Antworten

8

Ja, Sie können den Overhead von List.IndexOf() entfernen, indem Sie eine benutzerdefinierte Erweiterung Min() erstellen. (Tatsächlich sollte Enumerable.Min() eine Erweiterung haben, die das Element original nach Schlüssel auswählt, anstatt eine Umwandlung auszuwählen. Diese Aufsicht ist in Situationen wie dieser besonders schmerzhaft.)

%Vor%     
cdhowie 01.05.2013, 17:47
quelle
4

Nach meiner Erfahrung sind die LINQ-Aggregationsmethoden wie Array.Max () und Array.Min () typischerweise langsamer als eine manuelle for-Schleife. Sie können so etwas als einen alternativen Ansatz betrachten:

%Vor%

Sie können die Geschwindigkeiten beider Ansätze für Ihre Umgebung immer mit System.Diagnostics.StopWatch testen.

    
Prahlad Yeri 01.05.2013 17:47
quelle
2

Es gibt ein Problem mit der Antwort von @cdhowie, da angenommen wird, dass ein IList<T> effizient über den Indexer auf ein bestimmtes Objekt zugreifen kann. Während das für Arrays und List[T] gilt, ist es in nono-Weise garantiert (nimm für ein Beispiel eine einfach verknüpfte Liste, die Ilist<T> implementiert).

Wenn ich das auf generische Weise tun würde, würde ich etwas tun wie:

%Vor%

Oder, vielleicht sauberer, da wir überflüssige Initialisierung und einen fremden Vergleich im Körper der Schleife loswerden:

%Vor%

Sie könnten auch die Aktie Linq Aggregate() overload verwenden, obwohl es nicht sauberer oder einfacher als die Brute-Force-Methode (wahrscheinlich auch weniger effizient, IMHO):

%Vor%     
Nicholas Carey 01.05.2013 19:47
quelle
1

Wenn möglich, behalten Sie den min Wert / Index im Auge, während die Werte in der Liste platziert werden, so dass Sie nicht eine ganze Liste durchlaufen müssen. Wenn neue Werte zur Liste hinzugefügt werden, überprüfen Sie sie anhand des von Ihnen gespeicherten minimalen Werts und ändern Sie den neuen minimalen Wert nach Bedarf.

Natürlich ist das für Ihre Situation nicht geeignet.

    
Colton 01.05.2013 18:07
quelle
1

Ich verbesserte @ cdhowies Beantworte ein wenig, um es mächtiger zu machen. Wenn es mehrere minimale Elemente gibt, gibt diese Methode die erste zurück.

%Vor%     
pengdlzn 14.01.2015 11:02
quelle
0

Sicher. Schreiben Sie einfach Ihre eigene Funktion Min , anstatt LINQ zu verwenden, die den Index des aktuellen Mindestwerts verfolgt. Auf diese Weise können Sie vermeiden, den Index des Elements auf der Grundlage seines minimalen Werts zu finden.

    
Servy 01.05.2013 17:47
quelle
0

Min-Berechnung: Das Finden des Min -Wertes in einer Sammlung kann nicht schneller als O (n) erfolgen, also ist es vielleicht nicht besser, aber nur ein anderer im Codestil.

Finding Step: Abhängig von Ihrem Problem können Sie eine spezielle Datenstruktur (zB Binärbaum, Heap-Baum, ...) verwenden, um den Index schneller zu finden.

  

Wenn Sie so etwas wie einen Min-Heap-Baum verwenden, können Sie den minimalen Wert mit O (1) als Aufwand für einige spezielle Add-, Remove-Funktionen erhalten.

    
Hossein Narimani Rad 01.05.2013 17:43
quelle
-1

Ich bin faul, also würde ich verwenden:

%Vor%     
user3574895 01.12.2015 22:24
quelle

Tags und Links