这是一个 Perl 单行程序,它使用散列来保存来自 file1 的一组想要的键,以便在 file2 的行上每次迭代进行 O(1)(摊销时间)查找。所以它将在 O(m+n) 时间内运行,其中 m 是您的密钥集中的行数,n 是您正在测试的文件中的行数。
perl -ne'BEGIN{open K,shift@ARGV;chomp(@a=<K>);@hash{@a}=()}m/^(\p{alpha}+)\s/&&exists$hash{$1}&&print' tkeys file2
密钥集将保存在内存中,同时针对密钥逐行测试 file2。
使用 Perl 的-a
命令行选项也是一样的:
perl -ane'BEGIN{open G,shift@ARGV;chomp(@a=<G>);@h{@a}=();}exists$h{$F[0]}&&print' tkeys file2
第二个版本可能在眼睛上更容易一些。;)
您必须在这里记住的一件事是,您更有可能受 IO 限制而不是受处理器限制。所以目标应该是尽量减少IO使用。当整个查找键集保存在提供 O(1) 摊销查找的哈希中时。与其他解决方案相比,此解决方案可能具有的优势是某些(较慢的)解决方案必须为 file2 的每一行运行一次您的密钥文件(file1)。这种解决方案将是 O(m*n),其中 m 是密钥文件的大小,n 是 file2 的大小。另一方面,这种散列方法提供了 O(m+n) 时间。这是一个巨大的差异。它通过消除通过键集的线性搜索而受益,并且通过仅通过 IO 读取一次键来进一步受益。