strStr() python

简单思路:暴力循环寻找
暴力字符串匹配是字符串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理。然而它最大的问题就是运行速度太慢,所以在很多场合下暴力字符串匹配算法并不是那么有用。
算法:Rabin-Karp

预备知识

ord()函数主要用来返回对应字符的ascii码,chr()主要用来表示ascii码对应的字符他的输入时数字,可以用十进制,也可以用十六进制。

算法

对模式串进行哈希运算并将其哈希值与文本中子串的哈希值进行比对。总的来说这一想法非常浅显,唯一的问题在于我们需要找到一个哈希函数
,它需要能够对不同的字符串返回不同的哈希值。

算法复杂度
Rabin-Karp算法的复杂度为O(mn),其中n和m分别是文本和模式串的长度。那么它到底比暴力匹配好在哪里呢?暴力匹配法的算法复杂度同样是O(mn),这样看起来Rabin-Karp算法在性能上并没有多大提升。
然而在实际使用过程中,Rabin-Karp的复杂度通常被认为是O(n+m)。

对n-m+1个匹配哈希,实际上是原来判别第一个字符匹配改为判别哈希,判别减少

事实上,由于哈希函数无法保证对不同的字符串产生不同的哈希值,有哈希冲突的现象存在,所以即使模式串的哈希值和文本子串的哈希值相等,也需要对这两个长度为m的字符串进行额外的比对(当然,如果不相等也就不用比对了,其实大部分的时间省在这上面),这时比对的开销是O(m)。最坏情况下,文本中所有长度为m的子串(一共n-m+1个)都和模式串匹配,所以算法复杂度为O((n-m+1)m)。然而实际情况下,需要进一步比对的子串个数总是有限的(假设为c个),那么算法的期望匹配时间就变成O((n-m+1)+cm)=O(n+m)。

优点:它可以用来检测抄袭,因为它能够处理多模式匹配;虽然在理论上并不比暴力匹配法更优,但在实际应用中它的复杂度仅为O(n+m);如果能够选择一个好的哈希函数,它的效率将会很高,而且也易于实现
缺点: (1)有许多字符串匹配算法的复杂度小于O(n+m)
(2)有时候它和暴力匹配法一样慢,并且它需要额外空间

Rabin-Karp算法之所以出众最大的原因就是它可以对多模型进行匹配。这一特性使得它在检测抄袭方面(尤其是大篇幅文字)非常好用。

代码:https://blog.csdn.net/lph188/article/details/94622649

发布了46 篇原创文章 · 获赞 0 · 访问量 1676
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览