如何有效地在十亿个字母的长字符串中找到字符串完全匹配的位置

问题描述

我有数百万个字符串,我想检查另一个数十亿个字符串集合中每个字符串的精确匹配位置。在 Python 中执行此操作的最有效方法是什么?

解决方法

这个问题有多种答案。

  1. 您可以使用散列函数并遍历整个人类基因组,尝试将序列长度的子序列的散列与序列的散列匹配(如果它们匹配您的序列在您的索引中)。 Rabin-Karp algorithm 是 O(n),其中 n 是人类基因组的大小。请特别注意您的序列长度不足以溢出整数。
  2. 您可以使用由 James H. Morris、Vaughan Pratt 和 Donald Knuth 同时发明的强力方法的变体来进行字符串匹配。 Knuth-Morris-Pratt algorithm 开始在每个索引处检查匹配项,每当它失败时,它就会检查表,在该表中开始匹配的下一个索引开始。它也是 O(n),并且具有比 RK 更好的最坏情况复杂度(阅读 this article on wikipedia)。
  3. 您可以使用与之前的算法非常相似的 Boyer-Moore algorithm。它首先计算一些移位,然后尝试在某些索引处匹配,方便地跳过其他索引。它也是 O(n) 并且比 RK 具有更好的最坏情况复杂度(阅读 the same article on wikipedia)。

我建议使用 Rabin-Karp 算法,因为对我来说它似乎更容易掌握(但我可能有偏见:NIH Bias