例如,首先,我已经确定了几个关键词。然后,在另一个文件中,我想找到与这些关键词完全匹配的行。
使用循环,我会遍历每个关键字的文件。所以,如果有10个关键词,我会循环文件10次。但是如果文件很大,这种方法效率会非常低。
我听说正确使用哈希可以缓解这种情况,但从未见过一个例子。那么在使用循环一次时,究竟如何使用hash来实现相同的目标呢?你能提供一个例子吗?
答案 0 :(得分:1)
您有一个解决方案,其时间与文件大小和关键字数量(O(N * K))成正比。您想要一个解决方案,其中所花费的时间不受关键字数量(O(N))的影响。
你确实可以使用哈希来实现这一点。
my @keywords = ...;
my %keywords = map { $_ => 1 } @keywords;
while (<$fh>) {
my @words = split ' '; # To be improved.
if (grep { $keywords{$_} } @words) { # Replace with foreach loop to exit ASAP.
...
}
}
我使用正则表达式匹配。
my @keywords = ...;
my $pat = join '|', map quotemeta, @keywords;
my $re = qr/$pat/;
while (<$fh>) {
if (/(?:^|\s)$re(?:\s|\z)/) { # To be improved.
...
}
}