我知道KMP(Knuth-Morris-Pratt)和BM(Boyer-Moore)算法都是很好的字符串搜索操作算法。 我也知道BM比KMP快3-5倍。
在您编写工业软件的经验中,您是否曾使用过BM或KMP算法? 这里算法真的很重要吗?
我知道KMP(Knuth-Morris-Pratt)和BM(Boyer-Moore)算法都是很好的字符串搜索操作算法。 我也知道BM比KMP快3-5倍。
在您编写工业软件的经验中,您是否曾使用过BM或KMP算法? 这里算法真的很重要吗?
strstr()
实现(相当于String.indexOf()
)使用了一种非常酷的算法,只需要线性时间,并且与BM和KMP不同,它具有恒定空间。这基本上消除了在库函数中使用天真的O(n^2)方法的任何理由,因为它更快的情况只有在极短的字符串上,而这两种算法已经非常(即足够)快了。(从MAK的答案中得到的。) - j_random_hackerString
的 真正 indexOf
方法通常不是您在 JDK 源中看到的那个,而是由 JDK 插入的内部版本,至少在 Java 6 和 7 中的 Sun 热点中是如此。事实上,该版本确实使用了 BM 的简化变体。它仅在检查的字符根本不存在于字符串中的情况下起作用,在这种情况下,它通常(请参见注释)跳过 N 个字符,其中 N 是搜索字符串的长度。注意:通常 是因为该算法使用一个 32 个条目的哈希表来确定字符是否出现在字符串中,因此可能会发生冲突。 - BeeOnRopeiptables
中,你只能选择 BM 和 KMP... - Alexis Wilkeglibc的strstr
函数是线性的。它使用双向算法,我认为这是Boyer-Moore算法的一种变体。因此,我想这意味着任何在gcc中使用strstr
的人实际上都在使用现实世界中的快速字符串搜索算法。
至于快速算法是否重要,我个人认为只有当数据大小足够大时才重要。我们所做的许多显式字符串操作都是在非常小的字符串上进行的(例如少于500个字符)。这并不是说我们不会进行繁重的字符串操作(例如对数据库进行全文搜索),但在这种情况下,我们通常让数据库或库为我们进行繁重的工作。数据库或库使用快速字符串搜索算法-因此我不会说它们不重要,只是它们的使用对我们不是直接可见的。
我曾在硬件上实现过KMP算法。如果硬件是FPGA,你可以利用可重构性来拥有一个自修改电路。这个电路获取搜索字符串,然后在硬件中进行必要的预处理,并重新配置为实际执行KMP的逻辑。但同样需要遍历大量数据才能加速处理,但也有一些情况下可以做到(例如DNA匹配)。