我对perl很新。所以,如果有明显的答案,我很抱歉。 我的问题:在Perl中是否存在用于C ++中std :: partial_sort的内置替代方法。或者至少你能推荐一个实现这种算法的CPAN模块吗? 提前谢谢。
答案 0 :(得分:3)
看起来你想要的是Sort::Key::Top
。
我已经按照我的描述编写了一个Perl选择排序,虽然结果比在整个列表中使用sort
并选择前十名,top
要快四倍来自Sort::Key::Top
的函数再次快两倍。
这是我的代码和结果。它使用AAAA
到ZZZZ
的四个字符模式列表进行测试 - 近五十万个。
use strict;
use warnings;
use List::Util 'shuffle';
use Sort::Key::Top 'top';
use Benchmark 'timethese';
srand(0);
my @list = shuffle 'AAAA' .. 'ZZZZ';
timethese(100, {
'Sort::Key::Top' => sub {
my @topten = top 10 => @list;
},
'Pure Perl' => sub {
my @topten;
for my $item (@list) {
if (@topten and $item lt $topten[-1]) {
my $i = $#topten-1;
--$i while $i >= 0 and $topten[$i] gt $item;
splice @topten, $i+1, 0, $item;
pop @topten if @topten > 10;
}
elsif (@topten < 10) {
push @topten, $item;
}
}
},
'Perl sort' => sub {
my @topten = (sort @list)[0..9];
},
});
<强>输出强>
Benchmark: timing 100 iterations of Perl sort, Pure Perl, Sort::Key::Top...
Perl sort: 46 wallclock secs (45.76 usr + 0.11 sys = 45.86 CPU) @ 2.18/s (n=100)
Pure Perl: 11 wallclock secs (10.84 usr + 0.00 sys = 10.84 CPU) @ 9.22/s (n=100)
Sort::Key::Top: 4 wallclock secs ( 3.99 usr + 0.13 sys = 4.12 CPU) @ 24.28/s (n=100)
答案 1 :(得分:1)
快速搜索会出现Sort::Key::Top
,但可能还有其他选择。