0

すべての「マスターキー」を互いに比較する必要がある場合、ハッシュのハッシュがあります(これらは数値です)。そのための私のコードは次のとおりです。

foreach my $masterkey1 (keys %HOH){
foreach my $masterkey2 (keys %HOH){
        if ($masterkey1 > $masterkey2){
            ... do some stuff...
        }
    }
}

ただし、メモリ使用量を減らすために、if ステートメントを 2 番目の foreach ループと組み合わせることができます。

多分何かのような

foreach my $masterkey1 (keys %HOH){
    foreach my $masterkey2 (keys %HOH < $masterkey1){
        ... do some stuff...
    }
}
  • ありがとう :)
4

3 に答える 3

2
foreach my $masterkey1 (keys %HOH){
    foreach my $masterkey2 (grep { $_ < $masterkey1 } keys %HOH){
        ... do some stuff...
    }
}

これがより効率的になるかどうかはわかりません。内側のループは、キーを介して 2 つのパスを実行する必要があります$masterkey1

キーリストを別の変数に保存することをお勧めします。

@keys = keys %HOH;
foreach my $masterkey1 (@keys) {
    foreach my $masterkey2 (@keys) {
        if ($masterkey1 > $masterkey2) {
           # do some stuff
        }
    }
}
于 2013-04-30T08:20:53.670 に答える
1

おそらく、キーのリストをスキャンする 2 つの入れ子になったループは必要ありません。実行にかかる時間は、トップレベル ハッシュのキーの数に応じて指数関数的に増加します。これは、ハッシュが比較的小さい (そして常に維持される) 場合を除き、大きな問題を引き起こす可能性があります。

実際に何を達成したいのかは言いませんでしたが、どちらが大きいかの値を比較しているので、おそらく . から始めたいと思うでしょうsort。投稿されたコードと機能的に同一である私があなたに与えることができる最高のものは次のとおりです。

my @masterkeys = sort { $a <=> $b } keys %HOH;
for my $outer (1 .. $#masterkeys) {
  for my $inner (0 .. $outer - 1) {
    # We already know $masterkeys[$outer] > $masterkeys[$inner],
    # so no need to test that
    ... do some stuff ...
  }
}

これは少なくとも投稿されたコードよりも少し効率的ですが、実際に何を達成しようとしているのかを教えていただければ、まだ多くの改善の可能性があると思います.

編集: この回答に関するOPのコメントによると、「すべてのマスターキーを比較し、共通のキーの数を数える必要があります。

2 つのハッシュで共通キーを見つける方法は次のとおりです。

my %count;
$count{$_}++ for keys %hash1;
$count{$_}++ for keys %hash2;
my @keys_in_common = grep { $count{$_} == 2 } keys %count;

このプロセスに必要な時間は、2 つのハッシュ内のキーの総数に比例して増加するため、非常に大きなデータ セットに対しても効率的です。

于 2013-04-30T10:03:08.807 に答える
1

キーをコピーして並べ替えます。

my @keys = sort { $a <=> $b } keys %HOH;

リストがソートされたので、リストの最後から各キーを取得して、それより前のすべてのキーと比較できます。

while (my $masterkey1 = pop @keys) {
    foreach my $masterkey2 (@keys) {
        # do some stuff with $masterkey1 and $masterkey2
    }
}
于 2013-04-30T09:41:12.207 に答える