К сожалению, Heap :: Simple не поддерживает извлечение чего-либо, кроме верхнего узла.Вы должны удалить все, вплоть до того, который хотите удалить, а затем положить все остальное обратно.
#!/usr/bin/env perl
use v5.10.0;
use strict;
use warnings;
use Heap::Simple;
my $heap = Heap::Simple->new;
$heap->insert(1,2,3,4,5);
# Remove 1, 2 and 3
my $item_to_remove = 3;
my @items = $heap->extract_upto($item_to_remove);
pop @items;
# Put 1 and 2 back
$heap->insert(@items);
# 1, 2, 4, 5
say join ", ", $heap->keys;
Более сложные типы кучи лучше справляются с удалением элементов. Кучи Фибоначчи имеют эффективную операцию удаления. Биномиальные кучи может эффективно объединять другие кучи, что ускоряет процесс "вставки их назад".Есть несколько реализаций более сложных куч в CPAN, но вам следует профилировать, прежде чем вы слишком углубитесь в оптимизацию.
Общий алгоритм или удаление произвольного узла из двоичной кучи мало чем отличается от удаления его избинарное дерево, поскольку бинарные кучи - это просто особый случай бинарного дерева.
- Начиная с корня, идите по дереву в поисках рассматриваемого узла.узел в качестве корня своей собственной кучи и обычно удаляет его.
Оба являются операциями O (logn) и довольно эффективны.