部分排序算法

时间:2013-02-24 11:05:05

标签: algorithm perl

我对perl很新。所以,如果有明显的答案,我很抱歉。 我的问题:在Perl中是否存在用于C ++中std :: partial_sort的内置替代方法。或者至少你能推荐一个实现这种算法的CPAN模块吗? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

看起来你想要的是Sort::Key::Top

我已经按照我的描述编写了一个Perl选择排序,虽然结果比在整个列表中使用sort并选择前十名,top要快四倍来自Sort::Key::Top的函数再次快两倍。

这是我的代码和结果。它使用AAAAZZZZ的四个字符模式列表进行测试 - 近五十万个。

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,但可能还有其他选择。