人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perlの連想配列における検索についての質問です.
以下のようにオーソドックスに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.

●質問者: kazumichi
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Alice BOB CAROL EQ EXIT
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● pahoo
●35ポイント

Perlの連想配列は、そこそこ早いという印象があります。それでも心配ということでしたら、下記の方法を検討してはいかがでしょうか。

  1. 検索しやすいようなデータ構造にする:ツリーやインデックス配列
  2. データ保持と検索処理を外部ツールに任せる:(例)Berkeley DB

参考サイト

◎質問者からの返答

ツリー構造などの優位性の具体例が未熟な私には解かりかねるのですが,メモリの使用量が抑えられそうなので.実装に加えたいと思います.

また,Berkeley DBがオンメモリでも動作するのは知りませんでした.

ありがとうございました.


2 ● pigment
●35ポイント ベストアンサー

URLはダミーです

http://q.hatena.ne.jp/answer

検索を早くしたいのであれば、逆引きの連想配列をつくるといいかも

書くまでもないと思うけど

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";

◎質問者からの返答

逆引きの連想配列,これは速そうですね.

コードがわかりやすかったです.

ありがとうございました.

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ