以下のようにオーソドックスにforeachで総当たりでマッチングさせる以外に,要素を高速に検索できる方法はありませんか.
総当たりですから,要素数が莫大になると,検索に時間がかかることが懸念されるのですが.
my %hash=( 'Alice' => {'right'=>'knife', 'left'=>'carrot'},
'Bob' => {'right'=>'ball', 'left'=>'glab'},
'Carol' => {'right'=>'mouse', 'left'=>'keyboard'},
'Dave' => {'right'=>'pencil', 'left'=>'notebook'});
my $object = 'keyboard';
foreach my $key1 (keys %hash){
foreach my $key2 (keys %{$hash{$key1}}){
if($hash{$key1}{$key2} eq $object){
print "$key1 has a $object on his/her $key2 hand.\n";
exit;
}
}
}
# 出力結果
# Carol has a keyboard on his/her left hand.
URLはダミーです
検索を早くしたいのであれば、逆引きの連想配列をつくるといいかも
書くまでもないと思うけど
my %hash_usd = ();
foreach $name (keys (%hash)){
foreach $hand (keys (%{$hash{$name}})){
$hash_usd{$hash{$name}{$hand}}{'Name'} = $name;
$hash_usd{$hash{$name}{$hand}}{'Hand'} = $hand;
}
}
print "$hash_usd{$object}{'Name'} has $object in his/her $hash_usd{$object}{'Hand'} hand\n";
Perlの連想配列は、そこそこ早いという印象があります。それでも心配ということでしたら、下記の方法を検討してはいかがでしょうか。
ツリー構造などの優位性の具体例が未熟な私には解かりかねるのですが,メモリの使用量が抑えられそうなので.実装に加えたいと思います.
また,Berkeley DBがオンメモリでも動作するのは知りませんでした.
ありがとうございました.
URLはダミーです
検索を早くしたいのであれば、逆引きの連想配列をつくるといいかも
書くまでもないと思うけど
my %hash_usd = ();
foreach $name (keys (%hash)){
foreach $hand (keys (%{$hash{$name}})){
$hash_usd{$hash{$name}{$hand}}{'Name'} = $name;
$hash_usd{$hash{$name}{$hand}}{'Hand'} = $hand;
}
}
print "$hash_usd{$object}{'Name'} has $object in his/her $hash_usd{$object}{'Hand'} hand\n";
逆引きの連想配列,これは速そうですね.
コードがわかりやすかったです.
ありがとうございました.
逆引きの連想配列,これは速そうですね.
コードがわかりやすかったです.
ありがとうございました.