perlで非常に迅速なソートを行う方法はありますか? おそらく1億個のキーがある非常に大きなハッシュがあるように。foreach my $x (sort {$a cmp $b} keys %myhash){DO SOMETHING}
私がテストするとき、それは非常に非効率的です。最初にすべてのキーを配列にコピーして、クイックソートを使用できるかどうか疑問に思っています。
2 に答える
値をキーでソートしたくないため、ハッシュをリストコンテキストに入れたくありません。代わりに、はい、キーを並べ替えます。
my @ordered_keys = sort { $a cmp $b } keys %hash;
ただし、そのように値を処理したい場合は、次のようにすることができます。
my @ordered_values = @hash{ sort { $a cmp $b } keys %hash };
これは「ハッシュ スライス」を使用します。
しかし、この方法では、次のことができます。
foreach my $value ( @hash{ sort { $a cmp $b } keys %hash } ) {
# key? What key?
do_something_with_hash_value( $value );
}
100 個の文字列を並べ替えるのに 10μs (1000 万分の 1 秒) かかるとします。そんなに速いと思いますか?おそらく。それはおおまかに私のマシンが行うことです。
もしそうなら、100,000,000 ストリングに対して 41 秒の高速を考慮する必要があります!
理由は次のとおりです。
100 個の文字列を並べ替えているわけではありません。1,000,000 倍の文字列を並べ替えています。しかし、並べ替えは直線的ではありません。最適な並べ替えアルゴリズムは O(N log N) です。それがしっかりとバインドされていると仮定すると、つまり
100 個の文字列を並べ替えるには、$overhead + 100 * log2(100) * $time_per_operation がかかります。
100,000,000 個のキーを並べ替えるには、$overhead + 1,000,000 * log2(1,000,000) * $time_per_operation がかかります。
ごくわずかなオーバーヒアリングを想定すると、100,000,000 個の文字列を並べ替えるには、100 個の文字列を並べ替えるよりも 4,100,000 倍の時間がかかることになります。
したがって、100 ストリングで 10μs の高速を考慮する場合、1 億ストリングでは 41 秒の高速を考慮する必要があります。
どのような数値を取得していますか?