首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组::使用自定义比较函数的堆

数组::使用自定义比较函数的堆
EN

Stack Overflow用户
提问于 2021-09-09 14:16:06
回答 2查看 59关注 0票数 1

我正在试验Array::Heap模块,并希望创建一个按反向顺序排序的堆。所以我创建了这个代码:

代码语言:javascript
复制
#!/usr/bin/perl

use utf8;
use strict;
use warnings;
use Array::Heap;

my @heap;
make_heap_cmp {$b <=> $a} @heap;
push_heap_cmp {$b <=> $a} @heap, 4;
push_heap_cmp {$b <=> $a} @heap, 1;
push_heap_cmp {$b <=> $a} @heap, 5;
push_heap_cmp {$b <=> $a} @heap, 7;
push_heap_cmp {$b <=> $a} @heap, 2;

while (my $val = pop_heap_cmp {$b <=> $a} @heap)
{
    print "$val\n";
}

是正确的,它输出7,5,4,2,1。

但是代码看起来很难看:我对每个调用都重复了比较函数。不幸的是,模块文档缺乏用于特殊比较功能的用例示例。有人能告诉我,是否有可能改进这段代码或建议一个更好的模块,实现堆吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-09-09 16:59:38

这就是潜艇的用途。

代码语言:javascript
复制
my $rev = sub { $b <=> $a };

sub make_heap_rev(\@)  { &make_heap_cmp($rev, @_) }
sub push_heap_rev(\@@) { &push_heap_cmp($rev, @_) }
sub pop_heap_rev(\@)   { &pop_heap_cmp($rev, @_) }

然后你可以用

代码语言:javascript
复制
my @heap = ( 4, 1, 5, 7, 2 );
make_heap_rev @heap;
while (my $val = pop_heap_rev @heap) {
   say $val;
}

代码语言:javascript
复制
my @heap;
push_heap_rev @heap, 4, 1, 5, 7, 2;
while (my $val = pop_heap_rev @heap) {
   say $val;
}
票数 3
EN

Stack Overflow用户

发布于 2021-09-09 15:29:16

将代码放在一个循环中:

代码语言:javascript
复制
my @heap;

for my $i (4, 1, 5, 7, 2) {
  push_heap_cmp {$b <=> $a} @heap, $i;
}

或者将复杂性隐藏在子程序中;

代码语言:javascript
复制
sub add_to_heap {
   my ($heap, $add) = @_;

   push_heap_cmp { $b <=> $a } @$heap, $add;
}

my @heap;

for my $i (4, 1, 5, 7, 2) {
  add_to_heap \@head, $i;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69119848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档