for i in range(k+1):
klargest=heapq.nlargest(i,lists)
Временная сложность каждой наибольшей операции составляет O (k * log n)), где n - количество элементов в куче. В приведенном выше фрагменте кода эта операция выполняется k + 1 раз для значений [0, k].
Расчет времени для l oop:
итерации значение (Время)
i == 0 (0 * log (n))
i == 1 (1 * log (n))
i == 2 (2 * журнал (n))
....
i == k-1 ((k-1) * log (n))
i == k ((k) * log (n))
Общее время будет суммой времени, затраченного на каждую операцию = (0.log (n)) + (1 * log (n) ) + .... + ((k-1) * log (n)) + ((k) * log (n))
Общее время = (0 + 1 + 2 ... + ( k-1) + k) журнал (n) = ((k (k + 1)) / 2) * журнал (n)
Общее время ~~ O (k ^ 2 * (log (n)))
Вот почему приведенный выше код приводит к TLE.
ОПТИМИЗИРОВАННЫЙ ПОДХОД:
import heapq
for _ in range(int(input())):
n,k=map(int,input().split())
lists=list(map(int,input().split()))
heapq.heapify(lists)
for i in range(n-k):
heapq.heappop(lists)
klargest = list(lists) # converting heap to list
print(*klargest)
Поскольку встроенная куча в python является минимальной кучей. Таким образом, приведенный выше код выводит минимум nk элементов из списков. На вывод каждой операции потребуется log (n) раз. Таким образом, общее время будет ~~ (nk) * logn. Оставшиеся k элементов в куче - это самые большие элементы, которые мы хотим найти.
Таким образом, временная сложность для приведенного выше решения составляет O ((nk) * log (n)) == O (nlog (n)) , что является оптимизированной временной сложностью.