我正在测试此网站的字符串搜索算法:EXACT STRING MATCHING ALGORITHMS. Christian Charras, Thierry Lecroq。测试文本是1GB大小的DNA碱基(ACGT)的随机序列。测试模式是随机大小(最大1kB)的随机序列列表。测试系统是3.2 Phen GHz的AMD Phenom II x4 955,4 RAM和Windows 7 64位。代码用C语言表示,用MinGW编译,带-O3标志。
对于1kB模式,朴素搜索算法对于短模式需要4秒到8秒。对于1kB模式,确定性有限状态机对于短模式需要2秒到4秒。 Boyer-Moore算法对于非常短的模式需要4秒,对于短pattherns需要大约1/2秒,对于1kB模式需要2秒。剩下的算法性能比天真的搜索算法差。
天真的搜索算法搜索算法如何比大多数其他算法更快?
使用转换表(总是执行O(n)执行时间)实现的确定性有限状态机如何比Boyer-Moore算法慢2到8倍?是的,BM最佳情况是O(n / m),但他的平均情况是O(n),最坏情况是O(nm)。
答案 0 :(得分:4)
没有完美的字符串匹配算法,最适合所有情况。
Boyer-Moore(和Horspool,周日等)通过创建跳转表来工作(当字符不匹配时,我可以移动搜索指针多远?字符串中的字母越清晰你可以想象,只有4个不同字母的字符串会创建一个每个不匹配最多3个移位的跳转表。而搜索具有区分大小写的英文单词可能会导致跳转(AZ + az) + punctiation)每次不匹配最多约55个班次。
另一方面,对准备(即计算跳转表)和循环本身都有负面影响。因此,这些算法在短字符串上表现不佳(准备工作会产生开销),而字符串只有几个不正确的字母(如前所述)
天真的搜索算法非常紧凑,循环内部的操作非常少,因此循环运行速度很快。由于没有开销,因此在搜索短字符串时效果会更好。
(与初始搜索相比)BM算法相当复杂的循环操作每个循环运行需要更长的时间。这(部分)补偿了跳转表的积极性能影响。
因此,尽管您使用长字符串,但小字母表(=小跳转表)会使BM表现不佳。 KMP在循环中的开销较小(跳转表通常较小,但与具有小字母的BM类似),因此KMP表现良好。
答案 1 :(得分:2)
理论上良好的算法(较低的时间复杂度)通常具有较高的簿记成本,这可能会超过小问题规模的天真算法。实施细节也很重要。通过优化实现,您有时可以通过2或更多的因子来提高运行时间。
答案 2 :(得分:2)
对于随机输入数据,天真实现实际上具有线性预期运行时间(与BM / KMP等相同)。我无法在此处编写完整的证据,但可以从算法设计技巧和分析中访问。
大多数精确匹配算法都是天真实现的优化版本,以防止某些模式减慢速度。例如,假设我们正在搜索:
aaaaaaaaaaaaaaaaaaaaaaaab
在以下流程中:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
很多次b
失败了。设计KMP / BM是为了防止反复比较a
。但是,如果序列本身是随机的,那么这些条件几乎不可能出现,并且由于书记管理的开销较低或者可能更好的空间/时间局部性,天真的实现可能会更好。
而且,是的,我不确定DNA序列是否随机。或者也可以是它们中常见的重复。无论如何,没有代表性的数据,没有办法仔细检查。