• ベストアンサー

オーバーラップ計算法について

皆様のお知恵を拝借したく投稿しました。 よろしくお願いします。 perlでのデータ処理で2つの入力ファイルがあります list1 ---------------- start end 1 10 12 16 20 30 34 42 ---------------- list2 ----------------- start end 1 5 6 12 14 18 20 28 30 35 37 42 ----------------- この2つのファイルを比較して (1)list1から見たlist2と重複している領域の個数 (2)list2から見たlist1と重複している領域の個数 (3)重複している領域の長さ を算出し、出力できるようにperlでコーディングしたいのですが どのようにしたらよいのでしょうか? ご助言いただけますと幸いです

質問者が選んだベストアンサー

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

とりあえず (1) のみ、作ってみました。 use strict; my @list_1 = ([1, 10], [12, 16], [20, 30], [34, 42]); my @list_2 = ([1, 5], [6, 12], [14, 18], [20, 28], [30, 35], [37, 42]); my @overlap = join(':', sort { $a <=> $b } map { $_->[0] .. $_->[1] } @list_1, @list_2) =~ /\b(\d+):\1/g; my $count; foreach my $ref (@list_1) { foreach my $n ($$ref[0] .. $$ref[1]) { $count++ if grep /^$n$/, @overlap; } print "$ref->[0] $ref->[1]: $count\n"; $count = 0; } foreach の引数の @list_1 を @list_2 に変更すれば、(2) を出力できます。 (3) は、どのような出力にすればよいのかよく分かりません。

now_is_ok
質問者

お礼

ありがとうございます! (3)についてもその後、解決できました ご助言ありがとうございました

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

.... 「2つの領域に対し, 重複している部分の長さ」を求めるサブルーチンを作ってください.

now_is_ok
質問者

お礼

ありがとうございます! 早速試してみます

関連するQ&A