有没有办法在perl中快速排序?就像我有一个非常大的哈希,可能有1亿个键。在我测试时执行foreach my $x (sort {$a cmp $b} keys %myhash){DO SOMETHING}
非常低效。想知道我是否可以先将所有键复制到阵列并使用快速排序。
答案 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。
你得到了什么样的数字?