Подтвердить что ты не робот

Как я могу реализовать чисто функциональную стандартную двоичную кучу (ocaml или haskell)?

Существуют ли какие-либо реализации чисто функциональной стандартной двоичной кучи? Я знаю, что есть много интересных кучек, например: Binomial, левая куча, все они имеют функциональную реализацию, просто интересно, есть ли способ реализовать стандартную двоичную кучу, или мы должны использовать Array для ее реализации из-за неизменяемого типа? Спасибо!

4b9b3361

Ответ 1

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

data Heap t = Node t (Heap t) (Heap t) | Nil

Недостаток заключается в том, что вы перераспределяете O(log N) узлов для каждой операции кучи, и у вас не будет какой-либо локализации кэша для реализации на основе императивного массива. Некоторые операции будут сложны с этой структурой, но поскольку я не знаю, что вы хотите сделать с кучей, я не могу указать вам в более конкретном направлении.

Причина, по которой у нас есть специальные функциональные структуры, такие как пальцевые деревья, - ускорить определенные операции, которые вы обычно не выполняете на кучах, например, извлечение самого левого листа node. Вы можете использовать многие из тех же структур данных, которые вы изучили для императивных языков в Haskell, только с изменениями в способах обновления.

Ответ 2

Бесстыдный плагин: Браунские деревья являются идеальными кандидатами на чисто функциональную мини-кучу (или приоритетную очередь).