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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值