Qual é a complexidade de tempo do seguinte código em C#?
array.Order().Take(k).ToArray();
O LINQ tratará isso como QuickSelect? Ou realizará uma ordenação completa de arrays com complexidade O(n log n) ?
Qual é a complexidade de tempo do seguinte código em C#?
array.Order().Take(k).ToArray();
O LINQ tratará isso como QuickSelect? Ou realizará uma ordenação completa de arrays com complexidade O(n log n) ?
Este comportamento não é garantido pela documentação. No entanto, a implementação atual usa um QuickSort parcial para
.OrderBy().Skip/Take
, e um QuickSelect para.OrderBy().First/Last/ElementAt
.Isso significa que a complexidade de tempo
.OrderBy().Take(k)
éO(n + k log k)
Média eO(n²)
Pior.Isso foi implementado neste pull request em 2016 (ou seja, no .NET Core 1.0). Foi uma otimização deliberada, adicionada há algum tempo, o que significa que há pouquíssimas chances de ser removida na prática.
.Order()
classifica todo oarray
, que é O(n log n) de complexidade de tempo..Take(k)
e.ToArray()
são operações O(k) .No total, a complexidade de tempo deste código é: O(n log n)
Ele executará a classificação completa O(n log n), não a Seleção rápida O(n).