关于Java的IndexOf
老师就是学了KMP算法后,回看JDK8中的String使用的暴力的循环去匹配传入的值,在实际工作中,KMP是用在什么地方呢,还有为啥有的API不使用更高效的匹配方式而要采用粗暴的方式解决了
正在回答
在这一周的 1-3 小节,我想强调的恰恰就是这件事情!https://class.imooc.com/course/1591 在这一章的最后,我还会再次强调这一点。
对于正常的普通文本来说,暴力匹配是完全可以满足性能需求的。因为正常的普通文本是不会出现在这一章节介绍的 KMP 算法处理的这样的极端情况的。这也就是为什么,对于一般的程序语言标准库(不仅仅是 Java 语言),字符串匹配算法不会使用 KMP 的原因。
(到底在什么情况下,字符串匹配算法会退化成 O(n *m) 的复杂度?可以再回顾一下。实际上,在很多情况下,了解一个算法的作用范围,和了解一个算法的原理一样重要,甚至是更重要的。毕竟,很多软件工程师的工作并非发明算法,或者改进算法,而是能够在恰当的时候使用合适的算法。)
==========
什么情况下 KMP 变得有意义?答案就是在匹配过程可能出现上述令上述字符串匹配问题退化的场景中。
真实的场景什么时候会产生这种退化?最典型的例子是在生物信息学中,比如对于基因片段的匹配,此时,我们处理的字符串的特点是:1)字符集非常小(只有 4 个字符);2)会有大量相似片段;3)模式串可能不短,当然,源串更长。在这种情况下,字符串匹配问题既有更高的概率退化(字符集过小),且整个字符串匹配的过程对性能的要求也更高(数据规模更大)。
实际上,生物信息学是字符串算法的重灾区,在生物信息学相关领域,会使用非常非常多的字符串算法,在这一章的最后,我也会推荐一些相关书籍。所以,如果不是搞相关领域,字符串算法完全没必要深入。
对于传统的计算机科学来说,对字符串算法使用最多的,是编译领域,然而,在这个领域,“字符串匹配”这个问题并非重点。编译原理处理字符串问题的思路,近乎已经脱离传统的算法和数据结构解决问题的思路了,而是单独建立了一套体系(以状态机为主,背后的一套理论体系被称为是形式语言。)如果感兴趣,可以去系统学习编译原理。
继续加油!:)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星