我知道KMP(Knuth-Morris-Pratt)和BM(Boyers-Moore)算法都是很好的字符串搜索操作算法。 我也知道BM比KMP快3-5倍。
根据您的行业软件编程经验,您是否使用过BM或KMP算法? 这个算法真的很重要吗?
答案 0 :(得分:6)
如果您查看Java的String.indexOf函数,它们似乎使用强力方法进行字符串匹配。 你可能想知道为什么会这样。
原因是某些查询预处理是在这些算法中执行的,并且可能成本很高(特别是对于BM,如果您同时使用这两个数组)。因此,在KMP和BM可以使用强力方法之前,您搜索的字符串必须是大尺寸的。
在使用不同的算法时总是存在交易,当处理大字符串时,您可以考虑索引文本而不是查询(例如后缀树)。当您每次处理新文本时,这甚至可能很有用。
在我看来,这些算法相当具有学术性,只在特殊情况下才有用。
答案 1 :(得分:3)
glibc的strstr
函数是线性的。它使用Two-Way Algorithm,我认为它是Boyer-Moore的变体。所以,我想这会让任何在gcc中使用strstr
的人实际上在现实世界中使用快速字符串搜索算法。
关于快速算法是否重要的问题,恕我直言,只有当数据的大小足够大时才重要。我们做的很多显式字符串操作都是在非常小的字符串上(比如少于500个字符)。这并不是说我们不会进行繁重的字符串操作(例如,对数据库进行全文搜索),但在这种情况下,我们通常会让数据库或库为我们做繁重的工作。数据库或库使用快速字符串搜索算法 - 所以我不会说它们无关紧要,只是它的使用对我们来说是不可见的。
答案 2 :(得分:2)
我在硬件上实施了一次KMP。如果硬件是FPGA,您可以使用可重配置性和自修改电路。该电路获取搜索字符串。然后在硬件中进行必要的预先调试,并将其自身重新配置为实际制造KMP的逻辑。但是这里也必须抓取大量数据以加快速度,但有一些事情是如此(例如DNA匹配)。