堆中的二级订单::简单

时间:2010-06-30 04:28:58

标签: perl heap

如何在Perl中为Heap :: Simple接口定义二级排序?

2 个答案:

答案 0 :(得分:3)

The documentation表示构造函数采用代码引用来定义 订单,所以你可以指定你喜欢的任何排序方法:

my $heap = Heap::Simple->new(order => \&sort_method);
  

每次需要比较两个键时,将调用给定的代码引用,如:       $ less = $ code_reference->($ key1,$ key2);

     

如果$ key1小于$ key2且为false,则应返回true值   另有价值。 $ code_reference应该意味着总订单关系,所以它   需要传递。

通过“二级排序”我假设你的意思是如果使用第二次比较 第一个显示值相等。让我们说第一个比较是 通过“method1”方法找到的值,第二个比较是 来自“method2”的值。因此,如果通过method1值不同,则返回 结果,否则回到方法2:

sub sort_method
{
    my ($val1, $val2) = @_;

    my $result = ($val1->method1 <=> $val2->method1)
                          ||
                 ($val1->method2 <=> $val2->method2);

    return 1 if $result == -1;
}

如果method1和method2返回字符串而不是数值,则只需使用 cmp运算符代替<=>。你可以使用任何你喜欢的东西 当操作员返回正确的值时。大多数排序功能就像使用 值-1,0和1表示value1是否小于,等于或 大于value2,但该模块喜欢1表示val1&lt; val2,所以之后 收集-1,0,1结果,如果结果为-1,则返回1(其中 value1小于value2)。

答案 1 :(得分:0)

首先,你编写一个函数,它接受你想要放入堆中的两个对象,如果第一个小于第二个,则返回true值,否则返回false。

然后将其作为coderef提供给Heap :: Simple。

Heap :: Simple文档中的示例如下:

use Heap::Simple;

sub more { return $_[0] > $_[1] }

my $heap = Heap::Simple->new(order => \&more);
$heap->insert(8, 3, 14, -1, 3);
print $heap->extract_top, " " for 1..$heap->count;
print "\n";
# Will print: 14 8 3 3 -1