2011-01-15 3 views
3

Я нашел много реализаций MinMax Heap, которые хранят данные в массиве. Это очень просто реализовать, так я ищу что-то другое. Я хочу создать MinMax Heap, используя только элементы кучи с указателями на левый дочерний и правый дочерние элементы (и прикосновение к ключу для сравнения). Таким образом, куча имеет только указатель на корневой объект (минимальный уровень), а корневой объект имеет указатель на его детей (максимальный уровень) и т. Д. Я знаю, как вставить новый объект (найти правильный путь, используя двоичное представление int в зависимости от размера кучи), но я не знаю, как реализовать остальные (push up (down) элемент, найти родителя или дедушку) ,Реализация MinMax Heap без массива

Thx для справки

ответ

-2

Это жесткий диск двоичной кучи без массива. Потому что вы должны держать все родителя во время вставки, а затем выполнять операцию нажатием вверх и вниз. как это [parent_1, parent_2 ... parant_k] and then if parent_(k+1) < parant_k pushUp и изменить их право ребенка и левого ребенка

+1

извините, но это мне совсем не помогает. Мне просто нужно знать, возможно ли это и простое решение (алгоритм). – user1071076

+0

Это не решение проблемы. – briantaurostack7

1

heapq module source code показывает, чтобы выполнить шаги для толкания вверх и вниз. Чтобы перейти от реализации массива к реализации указателя, замените arr[2*n+1] на node.left и arr[2*n+2] на node.right. Для родительских ссылок, таких как arr[(n-1)>>1], каждому узлу нужен указатель на его родительский элемент, node.parent.

В качестве альтернативы вы можете использовать функциональный стиль, который делает все это очень простым в реализации. Я нашел код для treaps implemented in Lisp, чтобы быть источником вдохновения для того, как это сделать.

+0

Одна вещь, которая по крайней мере не очевидна, заключается в том, как перевести heap.append (item) heappush. Чтобы реализовать это, вам нужно сохранить указатель на последний элемент, а затем выполнить некоторое (нетривиальное) пересечение дерева, чтобы найти подходящего родителя для добавления нового элемента в. heappop имеет симметричную задачу, в которой проблема заключается в том, чтобы соответствующим образом обновить «последний» указатель. –

2

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