Удаление 2-го наименьшего элемента из двоичной Max-Heap
Этот вопрос похож на этот. Разница в том, что у меня есть бинарная Max-Heap вместо Min-Heap. Что делает вопрос совершенно другим.
Мои мысли:
1) Я прохожу все узлы, чтобы найти второй наименьший элемент, это займет O (n)
2) Когда я нахожу 2-й наименьший элемент, я поднимаю этот элемент вверх, меняя его родительский элемент до тех пор, пока он не достигнет корня, это займет O (logn)
3) Я удаляю элемент из корня и беру крайний правый элемент и сохраняю его в корневом расположении (обычная операция удаления кучи), это займет O (logn)
Всего будет O (n) + O (logn) + O (logn), что составляет O(n).
Отредактировано: добавлено двоичное
Есть ли лучшее решение, чем это?
3 ответа
Почему бы вам не сохранить небольшой массив с двумя элементами, чтобы сохранить копию двух самых маленьких элементов?
Затем все операции изменяются только с O(1) шагами, и вы можете предоставить ответ в постоянное время.
Второй наименьший элемент является либо листом, либо родителем листа, и лист является единственным его потомком.
Как удалить второй самый маленький элемент:
- Найдите это, ища через листья и возможно отца, у которого есть только один ребенок. На)
- Если 2-й наименьший элемент является родителем узла, узел должен быть наименьшим элементом и должен быть самым правым листом. Замените 2-го наименьшего на его ребенка, и он закончен. O (1)
Если вторым наименьшим элементом является лист, замените его на самый правый лист на самом глубоком уровне и пузырьком вверх. O (журнал (п))
Таким образом, O(n)+O(log(n)) - это все еще O (n), но с меньшим количеством сравнений.
Когда дело доходит до большой нотации - нет, это нельзя сделать лучше. Нахождение произвольного элемента в максимальной куче O(n)
,
Однако вы можете уменьшить количество максимальных узлов, к которым нужно перейти 1/2 * n
и, по сути, удвоить скорость алгоритма. [еще O(n)
домен], так как 2-й наименьший элемент в максимальной куче имеет не более одного сына, так что вы можете пройти только по листьям (n/2 из них), и не более одного элемента, который имеет только одного сына. (помните, что двоичная куча - это массив, представляющий полное дерево, поэтому не более одного элемента имеет ровно одного сына).
Можно также немного улучшить шаг удаления, но я сомневаюсь, что это окажет какое-либо существенное влияние), так что я бы не стал прикладывать усилия к этому.