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