perl快速排序

时间:2012-10-18 18:48:55

标签: perl sorting

有没有办法在perl中快速排序?就像我有一个非常大的哈希,可能有1亿个键。在我测试时执行foreach my $x (sort {$a cmp $b} keys %myhash){DO SOMETHING}非常低效。想知道我是否可以先将所有键复制到阵列并使用快速排序。

2 个答案:

答案 0 :(得分:3)

您不希望将哈希值放在列表上下文中,因为您不希望使用键对值进行排序。相反,您想要对键进行排序:

my @ordered_keys = sort { $a cmp $b } keys %hash;

但是,如果你想以这种方式处理,你可以这样做:

my @ordered_values = @hash{ sort { $a cmp $b } keys %hash };

这使用"hash slice"

但是以这种方式,你可以做到以下几点:

foreach my $value ( @hash{ sort { $a cmp $b } keys %hash } ) { 
    # key? What key?
    do_something_with_hash_value( $value );
}

答案 1 :(得分:3)

说排序100个字符串需要10μs(百万分之一秒)。你会考虑那么快吗?大概。这大致就是我的机器所做的事情。

如果是这样,你应该快速考虑41s以获得100,000,000个字符串!

这就是原因。

你没有排序100个字符串;你要排序100万倍以上的字符串。但排序不是线性的。最好的排序算法是O(N log N)。假设紧密绑定,那意味着

  • 对100个字符串进行排序将花费$ overhead + 100 * log2(100)* $ time_per_operation。

  • 排序100,000,000个密钥需要花费$ 1,000,000 * log2(1,000,000)* $ time_per_operation。

假设听到可忽略不计,这意味着排序100,000,000个字符串将比排序100个字符串长4,100,000倍。

因此,如果你考虑100个字符串的10μs快速,那么对于100,000,000个字符串你应该快速考虑41s。

你得到了什么样的数字?