【问题标题】:Boyer Moore search for small keyBoyer Moore 搜索小钥匙
【发布时间】:2011-09-28 15:26:43
【问题描述】:

首先我对算法知之甚少,请耐心等待。

据我了解,Boyer Moore 算法在长密钥时速度最快。那么,如果我有一个非常短的键(例如 10 个字符)和大量要搜索的文本(超过 10,000 个字符)怎么办。 Boyer Moore 会是这种场景的最佳搜索算法吗?

如果不是,那会是什么?

【问题讨论】:

    标签: string algorithm search boyer-moore


    【解决方案1】:

    根据String searching algorithm,“Boyer–Moore 字符串搜索算法已成为实用字符串搜索文献的标准基准。”它并不总是最快的,但总的来说这是要走的路。

    当您谈论像 10,000 个字符这样的小型文本缓冲区时,Knuth-Morris-Pratt 和 Boyer-Moore 在运行时间上非常接近。在现代计算机上运行时,即使是幼稚的字符串搜索在 10K 缓冲区上也会非常快。我怀疑您会发现 KMP 和 Boyer-Moore 两者在 10,000 个字符的缓冲区中搜索 10 个字符的字符串之间的差异将在纳秒级。

    在这种情况下最好的搜索算法?这将取决于您需要调用它的频率。如果它每秒被调用几次(最多),我可能会写一个幼稚的搜索并将其留在那里。与程序的运行时间相比,Boyer-Moore 和在那个小缓冲区上的朴素搜索之间的差异将是微不足道的,您的优化工作最好花在其他地方。如果我必须每秒调用数百或数千次,我会花时间编写优化的 Boyer-Moore 搜索。

    【讨论】:

    • >我会花时间编写优化的 Boyer-Moore 搜索。 不需要,我已经做到了。说到一个 strstr(或 memmem)函数的延迟/带宽,我的经验表明,超快(关于带宽)函数不一定具有高延迟(即具有繁重的预处理,即启动开销)。我的意思是他们也很聪明,有短图案/键。我的 Gulliver(BMH 订单 2)表现惊人。
    【解决方案2】:

    要回答您的问题,您只需访问一个链接:http://www.codeproject.com/Articles/250566/Fastest-strstr-like-function-in-C

    实际上最快的文本搜索器的主页是这样的: http://www.sanmayce.com/Railgun/index.html

    >如果我有一个非常短的键(例如 10 个字符),并且有很多要搜索的文本(超过 10,000 个字符)。 正是这个关键范围(10-11 个字符)在我的重型(1TB)strstr 摊牌中进行了测试。 30万字里有40万字,ONE-BY-ONE,一个strstr函数的极好负载!

    >Boyer Moore 会是这种场景的最佳搜索算法吗? 根据我的测试,最快的文本搜索器(使用 Microsoft V16 /Ox)是 Railgun_Quadruplet_7Gulliver,但使用 /Ox 和 Intel 12.1 时第二好,您可以自己测试,见下文。 p>

    如果你有一台速度很快的机器,比如 i7 37*,我想看看我最新的控制台基准测试包的结果(测试 Microsoft v16 与 Intel 12.1 编译器):
    http://www.sanmayce.com/Downloads/_KAZE_Benchmark_2013.zip

    在我的 T7500 2200Mhz 笔记本上测试:

    E:\_KAZE_Benchmark_2013>RUNME.bat
    
    E:\_KAZE_Benchmark_2013>SKYFALL_TXT2HTML_MicrosoftV16.exe MIX_Tesla_BABAJI_Castaneda_Poirot_Holmes_Sunnah_Hadith_Quran_Bible_Patanjali_Dao_Simplici
    ssimus.wrd.txt MASAKARI_General-Purpose_Grade_English_Wordlist_r3_316423_words.wrd /Gulliver
    SKYFALL_TXT2HTML, revision 2, written by Kaze.
    Size of 1st input file: 8916987
    Size of 2nd input file: 3869529
    
    Doing Search for each word with Railgun_Quadruplet_7Gulliver ...
    Railgun_Quadruplet_7Gulliver performance: 1944+KB/clock
    Average Pattern Length: 11
    Function Invocations: 420,640
    Function Inner-Loop Iterations: 131,873,881,926
    Function Really Traversed: 1,142,740,439KB
    
    E:\_KAZE_Benchmark_2013>SKYFALL_TXT2HTML_MicrosoftV16.exe MIX_Tesla_BABAJI_Castaneda_Poirot_Holmes_Sunnah_Hadith_Quran_Bible_Patanjali_Dao_Simplici
    ssimus.wrd.txt MASAKARI_General-Purpose_Grade_English_Wordlist_r3_316423_words.wrd
    SKYFALL_TXT2HTML, revision 2, written by Kaze.
    Size of 1st input file: 8916987
    Size of 2nd input file: 3869529
    
    Doing Search for each word with Railgun_Quadruplet_7 ...
    Railgun_Quadruplet_7 performance: 1747+KB/clock
    Average Pattern Length: 11
    Function Invocations: 420,640
    Function Inner-Loop Iterations: 146,826,792,351
    Function Really Traversed: 1,142,740,439KB
    
    E:\_KAZE_Benchmark_2013>SKYFALL_TXT2HTML_MicrosoftV16.exe MIX_Tesla_BABAJI_Castaneda_Poirot_Holmes_Sunnah_Hadith_Quran_Bible_Patanjali_Dao_Simplici
    ssimus.wrd.txt MASAKARI_General-Purpose_Grade_English_Wordlist_r3_316423_words.wrd /Hasherezade
    SKYFALL_TXT2HTML, revision 2, written by Kaze.
    Size of 1st input file: 8916987
    Size of 2nd input file: 3869529
    
    Doing Search for each word with Railgun_Hasherezade ...
    Railgun_Hasherezade performance: 1774+KB/clock
    Average Pattern Length: 11
    Function Invocations: 420,640
    Function Inner-Loop Iterations: 128,900,655,391
    Function Really Traversed: 1,142,740,439KB
    

    在使用 32 位和 64 位代码时存在一些起伏,微软和英特尔之间也有很大的差距。

    格列佛的“引擎”是我调整的订单 2 BM-Horspool

    正如您在我简陋的笔记本电脑上看到的那样 Gulliver1898MB/s 搜索模式(平均模式长度:11),即使是超级漂亮的 BNDM 在这里屈膝。

    【讨论】:

      猜你喜欢
      • 2018-10-18
      • 1970-01-01
      • 2020-10-13
      • 2020-07-17
      • 2012-07-12
      • 2010-10-28
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多