С функциями переключения вверх / вниз

Когда дело доходит до кучи, некоторые из вас могут подумать о структуре двоичного дерева, в которой родительский узел всегда больше или меньше дочерних узлов.

Собственно куча представлена ​​массивом. Просто у него есть специальная схема для манипулирования элементами, чтобы уменьшить временную сложность.

Куча имеет свои основные операции, такие как add (), delete (), size () и т. Д. В этой статье мы представляем новый способ понимания кучи с ее функциями сдвига вверх и вниз.

Вставить новый элемент и сдвинуть вверх

Предположим, у нас есть максимальная куча, и нам нужно добавить новый элемент. Если куча представляет собой массив, мы добавляем его в конец. После этого мы должны выполнить функцию сдвига вверх.

Сформируйте изображения ниже, главный шаг -

сравнивая дочерний элемент с его родительским элементом, если дочерний элемент больше, чем родительский элемент, мы их обмениваем.

Поскольку куча представляет собой древовидную структуру, мы можем легко найти родительский элемент, которым является int (k / 2), где k - текущий дочерний элемент. Остальное можно сделать таким же образом.

Сложность времени: O (logn)

Один совет: не забудьте проверить, входит ли k.

Удалить элемент и сдвинуть вниз

Когда дело доходит до сдвига вниз, у кучи есть особый способ удалить элемент. Мы не можем удалить ни один элемент, который хотим. Как упоминалось в изображениях,

заменяем первый элемент нижним и сдвигаем вниз

Когда мы выполняем сдвиг вниз, мы можем найти его дочерний узел: 2k (слева) и 2k + 1 (справа). Затем мы сравниваем родительский элемент с левым и правым элементом, чтобы найти самый большой элемент для обмена. Если родительский элемент имеет наибольшее значение, мы остаемся на месте.

Сложность времени: O (logn)

Совет: не забудьте убедиться, что k входящий.

Резюме и полный код:

В этой конструкции кучи смещение вверх и смещение вниз является основной частью. Мы можем легко переместить их, потому что легко найти родительские и дочерние элементы.

Если вы изучали кучу раньше, Heapify - популярная концепция. Мы могли бы найти очень сложную функцию heapify, такую ​​как эта:

В этой статье мы упрощаем heapify, определяя местонахождение первого нелистового узла (k / 2) и вызывая shiftDown () в обратном порядке.

Здесь я прикрепил полный код. Надеюсь, вы что-нибудь узнаете из этой статьи. Если вам интересно прочитать какие-либо другие мои статьи, вы можете проверить их в моем профиле. С наилучшими пожеланиями на собеседовании по кодированию!