You can use the heap queue; it can give you the K largest or smallest numbers from a list of size N in O (NlogK).
Python heapq module, heapq.nsmallest() :
import heapq
k_smallest = heapq.nsmallest(k, input_list)
K K , N-K, , . log K time, O (NlogK).
:
- K 1,
min(), O (N). - K >= N, , O (NlogN) O (NlogK).
introselect, O (n). , , - numpy.partition() function:
import numpy
array = numpy.array(input_list)
k_smallest = numpy.partition(array, k)[:k].tolist()
numpy, N ( K heapq), .
, :
heapq.nsmallest(k, range(len(input_list)), key=input_list.__getitem__)
numpy.argpartition(numpy.array(input_list), k)[:k].tolist()