Краткое объяснение!

Максимальная двоичная куча:

  1. Полное двоичное дерево, в котором родительские узлы всегда больше, чем дочерние узлы.
  2. Каждый родитель имеет не более двух дочерних узлов.
  3. Родитель всегда больше, чем его дети, но нет никаких гарантий между родственными узлами.
  4. Поскольку это полное бинарное дерево, оно максимально компактно. Все дочерние элементы каждого узла заполнены настолько, насколько это возможно, а левые дочерние элементы заполняются первыми.

Отношения между родительскими и дочерними узлами:

  1. Если узел находится в индексе - i
  2. Левый дочерний элемент находится в - 2*i + 1
  3. Правильный дочерний элемент - 2*i + 2
  4. Для любого дочернего элемента с индексом 'i'родитель находится на уровне - floor((i-1) / 2)

Примечание.в данном случае мы предполагаем, что начальный индекс равен 0

Максимальный класс двоичной кучи:

  • Мы определяем наш класс MaxBinaryHeap
  • Единственное свойство, которое требуется в конструкторе, — это свойство значений, которое может быть пустым списком/массивом.
class Name:
    MaxBinaryHeap
properties:
    values = []

Вставить в максимальную двоичную кучу

TL;DR — Добавить в конец и поднять вверх.

Псевдокод:

  1. Поместите значение свойства values ​​в кучу.
  2. Поднимите значение до нужного места.
  3. Всплывающие вверх:
  • Создайте новую переменную с именем index, в которой будет храниться индекс последнего элемента массива значений. (values.length-1).
  • Создайте переменную parentIndex для хранения индекса родителя текущей переменной.
  • Продолжайте цикл до тех пор, пока значение элемента в parentIndex меньше значения элемента в дочернем индексе.
  • Поменяйте местами значения элементов в parentIndex и дочернем индексе.
  • Установите индекс как parentIndex и начните сначала.

Извлечение из кучи (extract max)

TL;DR:

  • Удалить корень.
  • Замените последним добавленным узлом.
  • Настройте корень. (утонуть)

Псевдокод:

  1. Замените первое значение свойства values ​​на последнее.
  2. Выталкивайте из свойства values, чтобы вы могли вернуть значение в конце.
  3. Пусть новый корень опустится в нужное место:
  • Родительский индекс начинается с 0 (корень)
  • Найдите индекс левого дочернего элемента:2*index + 1.
  • Найдите индекс правого дочернего элемента:2*index + 2
  • Если левый или правый дочерний элемент больше, чем элемент, то заменяется местами. Если оба дочерних элемента left и right больше, поменяйте местами с >самый крупный ребенок.
  • Дочерний индекс, на который вы переключились, теперь становится новым родительским индексом.
  • Продолжайте зацикливаться и менять местами, пока ни один из дочерних элементов не станет больше, чем элемент.
  • Верните старый корень.

Временная сложность:

  • Вставка:O(log(n))
  • Удаление:O(log(n))
  • Построение кучи:O(n)

Полный код

Также читайте