Я могу сделать это в O(klogk)
и при условии, что k<<n
- это будет довольно эффективно по сравнению с альтернативами.
Идея состоит в том, чтобы поддерживать минимальную кучу, начинать с головы (id == 0), которая является самым низким элементом, и итеративно добавлять все «новые кандидаты» (которые для данного текущего наименьшего i
- «кандидаты» - 2i
и 2i+1
).
Создайте новый пустой мин-кучу, в которой каждый элемент содержит tupple (х, я) - х ключ в массиве, и я это индекс
set i = 0, currIdx = 0
heap.add((i,0))
while currIdx < k:
currIdx = currIdx + 1
(x,i) = heap.popLowest()
if i != 2i: //for i=2i=0, don't add it twice:
heap.add((arr[2i],2i))
heap.add((arr[2i+1],2i+1))
return heap.getTop()
Время сложность O(klogk)
, каждый работа на куче принимает O(logN)
(где N
- его текущий размер), а куча растет до максимального размера N=k
, поэтому все операции на куче log(1) + log(2) + ... + log(k) = log((k)!)
, что находится в O(klogk)
.
Вы уверены это не должно быть A [i] <= A [2i + 1] и A [i] <= A [2i + 2] '? Если это так, это двоичная куча, и вы можете найти k'th наименьший элемент в O (k) – amit
То, что я пишу, именно то, что он задает –
Это ваша домашняя работа? (репирический вопрос) – ale64bit