2016-12-18 11 views
12

Ich verwende Linq und Lambda Operations in meinen Projekten und ich musste eine Liste nach zwei Eigenschaften einer Klasse sortieren. Deshalb habe ich SortiertNach() ThenBy() Methoden wie folgt:.Was ist die zeitliche Komplexität von Linq OrderBy(). ThenBy() Methodenfolge?

class ValueWithIndex{ 
    public long Value; 
    public int Index; 
} 
... 

List<ValueWithIndex> valuesWithIndex = new List<ValueWithIndex>(); 

for (int i = 0; i < A.Length; i++){ 
    ValueWithIndex vi = new ValueWithIndex(); 
    vi.Value = A[i]; 
    vi.Index = i; 
    valuesWithIndex.Add(vi); 
} 
var orderedValues = valuesWithIndex.OrderBy(v => v.Value).ThenBy(v => v.Index); 

... 

In This Antwort wird erklärt, dass, OrderBy() verwendet Quicksort, also auch wenn es O (N * log N) durchschnittliche Zeit hat Im schlimmsten Fall beträgt die Komplexität der Komplexität etwa 0 (N). Wenn auch die ThenBy() - Methode eine ungünstigste Komplexität von O hat (N), wäre es sinnlos, diese Methoden zu verwenden.

Verwendet ThenBy() auch Quicksort? Wenn ja, bedeutet das, dass für denselben "v.Value" s "v.Index" mit der höchsten Komplexität der Zeit() sortiert wird?

+1

Es ist 'O (1)' weil nur in Construct Abfrage, nicht ausführen. Außerdem führt 'ThenBy' nicht zu einer zusätzlichen Reihenfolge, wenn die Abfrage ausgeführt wird, ändert sie nur die bereits eingereihte Bestellbedingung. – PetSerAl

+0

kann man nicht sagen, dass es "O (1)" ist, weil die Ausführung anders ist. Wenn Sie es brauchen, ist es die Zeit, die Sie es verwenden und seine 'O (nlogn)' –

+0

@ M.kazemAkhgary Ich glaube nicht, es ist eine schlechte Antwort (O (1) zu sagen) in Anbetracht dessen, dass OP nicht gezeigt hat, was er tut mit 'orderedValues'. – Phil1970

Antwort

17

Verfahren Kette LINQ OrderBy(...).ThenBy(...)...ThenBy(...) eine von mehreren Sortierschlüsseln (unter Verwendung von Multi Schlüsselvergleich) einzige Sortieroperation bilden.

So, unabhängig davon, wie viele ThenBy(Descending) Methoden tun sind Sie in der Kette, die typisch die Zeitkomplexität des Sortiervorgang bleibt für QuickSort O (N * log N) Durchschnitt/O (N) im schlechtesten Fall. Natürlich werden mehr Schlüssel, die Sie hinzufügen, wenn Sie zwei Objekte vergleichen, mehr Zeit benötigen, aber die Komplexität der Sortieroperation würde sich nicht ändern.

+1

Also, was ich verstehe, ist '.OrderBy (...). ThenBy (...)' Methode Kette sortiert die Liste nur einmal in einer einzigen Operation und es erhöht die Zeit der Sortierung, aber Zeit Komplexität bleibt gleich wie eine einzige '.OrderBy (...)'. Danke für die Antwort. –

+4

Sie haben es richtig gemacht:) Eigentlich erhöht es nicht unbedingt die Sortierzeit, denn wie bei den Multi-Key-Vergleichern üblich, wird der zweite, dritte usw. Comparer nur aufgerufen, wenn die vorherigen Vergleiche gleich zurückkommen, dh davon abhängen wie viele doppelte Schlüssel haben Sie auf der ersten, zweiten usw. Ebene. In Ihrem Beispiel wird "Index" nur für Objekte mit gleichem "Wert" verglichen. –

Verwandte Themen