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.

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/03/05 14:55:51
  • 終了:2008/03/05 19:01:56

ベストアンサー

id:pigment No.2

pigment回答回数95ベストアンサー獲得回数22008/03/05 16:50:43

ポイント35pt

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

id:kazumichi

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

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

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

2008/03/05 19:01:05

その他の回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/03/05 15:19:51

ポイント35pt

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

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

参考サイト

id:kazumichi

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

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

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

2008/03/05 19:00:45
id:pigment No.2

pigment回答回数95ベストアンサー獲得回数22008/03/05 16:50:43ここでベストアンサー

ポイント35pt

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

id:kazumichi

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

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

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

2008/03/05 19:01:05

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません