Что ж, ваша интуиция была права, что нам нужна дополнительная структура данных для достижения O (klogk), потому что если мы просто выполняем операции с исходной кучей, термин logn останется в результирующей сложности.
Догадываясь по целевой сложности O (klogk), мне хочется создать и поддерживать кучу размера k, чтобы помочь мне достичь цели. Как вы, наверное, знаете, построение кучи размера k сверху вниз требует O (klogk), что действительно напоминает мне о нашей цели.
Вот моя попытка (не обязательно элегантная или эффективная) в попытке достичь O (klogk):
Мы создаем новую минимальную кучу, инициализируя ее корень корнем исходной кучи.
Мы обновляем новую минимальную кучу, удаляя текущий корень и вставляя двух дочерних элементов текущего корня в исходную кучу. Мы повторяем этот процесс k раз.
Результирующая куча будет состоять из k узлов, корень которых является k-м наименьшим элементом в исходной куче.
Примечания. Узлы в новой куче должны хранить индексы соответствующих им узлов в исходной куче, а не сами значения узлов. На каждой итерации шага 2 мы действительно добавляем сеть из еще одного узла в новую кучу (одна удалена, две вставлены), k итераций которой приведут к нашей новой куче размера k. Во время i-й итерации удаляемый узел является i-м наименьшим элементом в исходной куче.
Сложность времени: в каждой итерации требуется O (3logk) времени, чтобы удалить один элемент и вставить два в новую кучу. После k итераций это O (3klogk) = O (klogk).
Надеюсь, это решение вас немного вдохновит.