首页 文章

你曾经使用过KMP或BM算法吗?

提问于
浏览
4

我知道KMP(Knuth-Morris-Pratt)和BM(Boyers-Moore)算法都是很好的字符串搜索操作算法 . 我也知道BM比KMP快3-5倍 .

根据您的行业软件编程经验,您是否使用过BM或KMP算法?这个算法真的很重要吗?

3 回答

  • 3

    如果您查看Java的String.indexOf函数,它们似乎使用强力方法进行字符串匹配 . 你可能想知道为什么会这样 .

    原因是某些查询预处理在这些算法中执行,并且可能成本很高(特别是对于BM,如果您同时使用这两个数组) . 因此,在KMP和BM可以使用暴力方法之前,您搜索的字符串必须是大的 .

    总是存在使用不同算法的交易,当处理大字符串时,您可以考虑索引文本而不是查询(例如后缀树) . 当您每次处理新文本时,这甚至可能很有用 .

    在我看来,这些算法相当具有学术性,只有在特殊情况下才有用 .

  • 2

    glibc的 strstr 函数是线性的 . 它使用Two-Way Algorithm,我认为它是Boyer-Moore的变体 . 所以,我想这使得任何在gcc中使用 strstr 的人实际上在现实世界中使用快速字符串搜索算法 .

    至于快速算法是否重要的问题,恕我直言,只有当数据的大小足够大时才重要 . 我们做的很多显式字符串操作都是在非常小的字符串上(比如少于500个字符) . 这并不是说我们不会进行繁重的字符串操作(例如,对数据库进行全文搜索),但在这种情况下,我们通常会让数据库或库为我们做繁重的工作 . 数据库或库使用快速字符串搜索算法 - 所以我不会说它们无关紧要,只是它的使用对我们来说是不可见的 .

  • 6

    我在硬件上实施了一次KMP . 如果硬件是FPGA,您可以使用可重配置性和自修改电路 . 该电路获取搜索字符串 . 然后在硬件中进行必要的预先调试,并将其自身重新配置为实际制造KMP的逻辑 . 但是在这里也必须抓取大量数据以加快速度,但有一些事情是如此(例如DNA匹配) .

相关问题