Двуродительские кучи

В обычных двоичных и dd-арных кучах мы научились быстро вставлять элементы и извлекать минимум. Кроме таких операций нам может понадобится искать элементы. В бинарных и dd-арных кучах нельзя реализовать эффективный поиск.

Двуродительская куча

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

Такую пирамидку можно хранить в массиве, записывая уровни один за другим по порядку, от верхнего к нижнему. Элементы на уровне hh будут хранится по индексам с h(h1)/2h \, (h-1) / 2 по h(h+1)/21h \, (h+1) / 2 - 1.

Гораздо удобнее представлять элементы кучи не по реальным индексам, а по парам (h,k)(h, k), где hh — уровень вершины, а kk — номер вершины в ряду. Тогда индекс вершины будет вычисляться как h(h1)/2+k1h \, (h - 1) / 2 + k - 1.

У вершины с индексом (h,k)(h, k) родители имеют индексы (h1,k1)(h-1, k-1) и (h1,k)(h-1, k), а дети имеют индексы (h+1,k)(h+1, k) и (h+1,k+1)(h+1, k+1). Если при вычислении индексов родителей индекс выходит за границы уровня, то это значит, что соответствующего родителя у элемента нет. Также, если при вычислении индексов детей индекс выходит за границы массива, то это значит, что соответствующего ребёнка у элемента нет.