如何从Perl中的Heap :: Simple中删除元素

时间:2012-02-25 23:23:26

标签: perl heap element

有没有办法使用Heap::Simple模块从堆中删除特定元素?只有一种方法可以删除顶部元素。

2 个答案:

答案 0 :(得分:3)

如果要删除除堆顶部之外的任何内容,则不需要堆结构。如果您正在使用数据图或类似的东西,通常只需要一堆。你在做什么问题?并不是一个简单的哈希做你想要的吗?

答案 1 :(得分:3)

不幸的是,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;

更复杂的堆类型可以更好地删除元素。 Fibonacci heaps具有有效的删除操作。 Binomial heaps可以有效地合并其他堆,这使得“更快地插入它们”部分。在CPAN上有一些更复杂的堆实现,但是在深入优化之前你应该进行分析。

通用算法或从二进制堆中删除任意节点与从二叉树中删除它没有太大区别,因为二进制堆只是二叉树的一种特殊情况。

  1. 从根开始,沿着树向下搜索相关节点。
  2. 将该节点视为其自己的堆的根并正常删除它。
  3. 两者都是O(logn)操作且效率很高。