Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 为什么朴素的字符串搜索算法更快?_String_Algorithm_Search - Fatal编程技术网

String 为什么朴素的字符串搜索算法更快?

String 为什么朴素的字符串搜索算法更快?,string,algorithm,search,String,Algorithm,Search,我正在测试此网站上的字符串搜索算法:。测试文本是1 GB大小的随机DNA碱基序列(ACGT)。测试模式是随机大小(最大1kB)的随机序列列表。测试系统是AMD Phenom II x4 955,频率为3.2 GHz,内存为4 GB,Windows 7 64位。用C编写witten代码,并用带-O3标志的MinGW编译 Naive搜索算法对于短模式需要4秒,对于1kB模式需要8秒。确定性有限状态机对于短模式需要2秒,对于1kB模式需要4秒。对于非常短的模式,Boyer-Moore算法需要4秒,对于

我正在测试此网站上的字符串搜索算法:。测试文本是1 GB大小的随机DNA碱基序列(ACGT)。测试模式是随机大小(最大1kB)的随机序列列表。测试系统是AMD Phenom II x4 955,频率为3.2 GHz,内存为4 GB,Windows 7 64位。用C编写witten代码,并用带-O3标志的MinGW编译

Naive搜索算法对于短模式需要4秒,对于1kB模式需要8秒。确定性有限状态机对于短模式需要2秒,对于1kB模式需要4秒。对于非常短的模式,Boyer-Moore算法需要4秒,对于短模式大约需要1/2秒,对于1kB的模式需要2秒。剩下的算法性能比朴素搜索算法差

朴素的搜索算法怎么能比大多数其他搜索算法更快呢


使用转换表(O(n)执行时间始终)实现的确定性有限状态机如何比Boyer-Moore算法慢2到8倍?是的,BM的最佳情况是O(n/m),但他的平均情况是O(n),最坏情况是O(nm)。

理论上好的算法(较低的时间复杂度)通常具有较高的簿记成本,可以压倒小问题规模的幼稚算法。实施细节也很重要。通过优化实现,您有时可以将运行时间提高2倍或更多。

对于随机输入数据,原始实现实际上具有线性预期运行时间(与BM/KMP等相同)。我不能在这里写一个完整的证明,但可以从算法设计技术和分析中获得

最精确的匹配算法是naive实现的优化版本,以防止被某些模式拖慢。例如,假设我们正在搜索:

   aaaaaaaaaaaaaaaaaaaaaaaab
在一连串的:

   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
它在
b
处多次失败。KMP/BM实现旨在防止重复比较
a
s。然而,如果序列本身是随机的,则几乎不可能出现这种情况,并且由于其簿记开销较低或可能更好的空间/时间局部性,原始实现可能工作得更好


是的,我不确定DNA序列是随机的。或者,重复在它们中很常见。无论如何,如果没有代表性的数据,就无法仔细检查这一点。

没有适合所有情况的完美字符串匹配算法

Boyer Moore(以及Horspool、Sunday等)通过创建跳转表来工作(“当字符不匹配时,我可以将搜索指针移动多远?字符串中的字母越明显,积极影响就越好。您可以想象,一个只有4个不同字母的字符串创建一个跳转表,每个不匹配最多移动3次。而搜索区分大小写的英语单词可能会导致lt在具有(a-Z+a-Z+穿孔)的跳转台中,每个不匹配最多约55个移位

另一方面,对准备(即计算跳转表)和循环本身都有负面影响。因此,这些算法在短字符串(准备会产生开销)和只有几个距离字母的字符串(如前所述)上表现不佳

NaiveSearch算法非常紧凑,循环内的操作非常少,因此循环运行速度很快。由于没有开销,因此在搜索短字符串时,它的性能更好

BM算法的相当复杂的循环操作(与原始搜索相比)在每次循环运行中花费的时间要长得多。这(部分)补偿了跳转表对性能的积极影响


因此,尽管您使用的是长字符串,但小字母(=小跳转表)使BM的性能较差。KMP在循环中的开销较小(跳转表通常较小,但与小字母BM相似)因此KMP的性能非常好。

是的,我不确定DNA序列是随机的。或者说,重复在它们中很常见。总之,没有代表性的数据,就无法仔细检查这一点。所有这些智能字符串匹配算法都比简单的匹配算法性能更好,如果文本(hay)是相当长的,指针不太短,字母表,即不同字符的数量较大。因此,即使是随机字符串也会表现良好,并且获得良好移位值的可能性随着字母表大小和指针长度的增加而增加。