скажем, у меня есть коллекция какого-то типа, например
IEnumerable<double> values;
Теперь мне нужно извлечь k наивысших значений из этой коллекции, для некоторого параметра k. Это очень простой способ сделать это:
values.OrderByDescending(x => x).Take(k)
Однако это (если я это правильно понимаю) сначала сортирует весь список, а затем выбирает первые k элементов. Но если список очень большой, а k сравнительно небольшой (меньше, чем log n), это не очень эффективно - список сортируется в O (n * log n), но я считаю, что выбираю k самых высоких значений из списка должно быть больше похоже на O (n * k).
Итак, есть ли у кого-нибудь предложения по улучшению и эффективному способу сделать это?