2009-04-08

Re: Perl配列Aから配列Bにある要素を取り除くには?

http://anond.hatelabo.jp/20090408034449

リスト内の有無を複数回調べるときの定石は、事前にハッシュに突っ込んでおく方法です。

元のコードgrep内でリニアサーチをやっているわけですから、ここにハッシュテーブルを使うわけです。

my %key = map { $_ => 1 } @key;
my @update = grep { not exists $key{$_} } @items;

ベンチは取っていないですが、多分早いです。

ただ、その分メモリを食いますし、@itemsに対し@keyの方が長大だと、あまり効率が良くないかも知れません。

その場合、ソート済みならバイナリサーチでやってみるとか、そもそもkeyハッシュ管理するとか、GDBMやsqlite等を使って永続化するとか、keyの入手段階から検討したほうが良いかもしれません。

また、cpanを探せば色々な配列操作を行うモジュールがあるかもしれません。

記事への反応 -
  • @itemsから@keyにある要素を除いたリストを@updateとして欲しいのですが、 下記のコードよりも、より高速な記述があれば是非ご教授くださいませ。 my @update = grep { my $a = 1; foreach my $b (@key) { ...

    • http://anond.hatelabo.jp/20090408034449 リスト内の有無を複数回調べるときの定石は、事前にハッシュに突っ込んでおく方法です。 元のコードはgrep内でリニアサーチをやっているわけですから、...

      • ありがとうございます。ベンチを取ってみると、ハッシュの方が速かったです。 UPSERT処理SQLの汎用化に使用中なのですが、プロファイルすると結構時間をくっていたので、key設定時まで...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん