Re: [問題] 多個關鍵字比對

作者: CindyLinz (Cindy Wang)   2014-10-16 00:42:45
※ 引述《DRLai (蘇打)》之銘言:
: 各位板友好
: 最近需要寫個多重比對的程式
: 想請教比較有效率的寫法
: 比對關鍵字 A B C
: 輸入資料(文字檔)
: A:a123 A:a456 B:b111 D:d1234
: B:bbb C:ccc
: 資料共有上千萬筆,關鍵字假設為3個
: 每行資料長度不見得一樣
: 希望能得到的資料為冒號後面的值
: 以上述範例來說
: 得到的是
: a123
: a456
: b111
: bbb
: ccc
: 輸出順序沒關係,只要有取得就好
: 之前想到的方法是用 foreach 每個關鍵字去掃
: 但如果關鍵字有10個(m)
: 資料有一千萬筆(n)
: 那複雜度就是 m * n = 一億
: 另一個方法是把資料變成一筆一筆
: 接著把關鍵字用 join 方式串接
: 不知道有沒有其他更好的方式呢?
我試了這3種寫法...
#!/usr/bin/perl
local $/;
my $data = <STDIN>;
for my $key (qw(A B C D E F G H I J)) {
while( $data =~ /\b$key:(\S+)/g ) {
print "$1\n";
}
}
#real 0m4.502s
#user 0m4.486s
#sys 0m0.016s
#!/usr/bin/perl
local $/;
my $data = <STDIN>;
while( $data =~ /\b[ABCDEFGHIJ]:(\S+)/g ) {
print "$1\n";
}
#real 0m2.751s
#user 0m2.731s
#sys 0m0.020s
# 這一種只適用 key 為一個字的..
#!/usr/bin/perl
local $/;
my $data = <STDIN>;
while( $data =~ /\b(?:A|B|C|D|E|F|G|H|I|J):(\S+)/g ) {
print "$1\n";
}
# real 0m2.993s
# user 0m2.978s
# sys 0m0.016s
以下是我生成測試資料的程式:
#!/usr/bin/perl
for(1..1000_0000) {
my $key = ('A'..'Z')[rand 26];
my $data = join '', map { ('a'..'z','0'..'9')[rand 36] } 1..4;
print "$key:$data\n";
}
# 產生測試資料跑比較久, 16 秒左右.. XD
作者: skenbo0916 (凱凱)   2014-10-16 02:26:00
推實驗!
作者: DRLai (蘇打)   2014-10-18 17:38:00
感謝!我來試試看

Links booklink

Contact Us: admin [ a t ] ucptt.com