我正在嘗試使用Array::Heap模塊,并希望創建一個以反向順序排序的堆。所以我創建了這段代碼:
#!/usr/bin/perl
使用 utf8。
use strict;
use warnings;
use Array::Heap;
my @heap;
make_heap_cmp {$b <=> $a}。@heap;
push_heap_cmp {$b <=>$a} @heap. @heap, 4;
push_heap_cmp {$b <=> $a} @heap. @heap, 1;
push_heap_cmp {$b <=> $a} @heap. @heap, 5;
push_heap_cmp {$b <=> $a} @heap. @heap, 7;
push_heap_cmp {$b <=> $a} @heap. @heap, 2;
while (my $val = pop_heap_cmp {$b <=> $a}. @heap)
{
print "$val
"。
}
它是正確的,它輸出7、5、4、2、1。
但是代碼看起來很丑。我為每一次的呼叫都重復了比較函式。不幸的是,module docs缺少特殊比較函式的使用案例。誰能告訴我,是否有可能改進這段代碼或建議一個更好的模塊來實作堆?
uj5u.com熱心網友回復:
把你的代碼放在一個回圈中:
my @heap;
for my $i (4, 1, 5, 7, 2) {
push_heap_cmp {$b <=> $a}。@heap, $i;
或者將復雜性隱藏在一個子程式中;
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;
uj5u.com熱心網友回復:
這就是子程式的作用。
這就是子程式的作用。
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, @_) }
然后你可以使用
my @heap = ( 4, 1, 5, 7, 2 )。)
make_heap_rev @heap;
while (my $val = pop_heap_rev @heap) {
say $val。
}
或者
my @heap;
push_heap_rev @heap, 4, 1, 5, 7, 2;
while (my $val = pop_heap_rev @heap) {
say $val。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311320.html
標籤:
