算法总结 之 查找字符串

前几天用到了golang strings的LastIndex(s, substrstring) int  ,Index(s, substrstring)int 这两个函数就跳进去看了看发现用了Rabin-Karp 这个算法,之前没有听说过,不久前我们leader还问了kmp 算法,kmp 算法当学生的时候写过,就想把两个算法搞在一起写一下,总结一下

Rabin-Karp  算法

其实原理很简单就是把字符串的变成数字,原来字符串的逐字比较变成了比较两个数字的大小,显然比较数字会快很多,关键是怎样比较数字

golang 的 Rabin-Karp  算法



primeRK 是一个很大的素数,为什么选择这个数我还没有查到,似乎很多(hash)算法用到这个数字,子串转化为

相当于将字符转化为primeRK进制的一个个数(primeRK很大,一般的字符集都可以容纳吧), 一个字符串的转化为primeRK进制数相互比较(数值太大可以比较模,hashStr返回的是uint32位相当于一种取模,超过32位会被截断),如果数值不相等,去掉最左边的字符相当于去掉左边的最高位,原数值扩大原来的primeRK,继续搜寻加上右边的字符,相当于加上一个最低位, 如果两个数值相等不能简单的判定两个字符串相等,需要再做一次比较

对于LastIndex Index 这两个函数来说也做了些优化处理,比如子串和原字符串都比较小的情况下就直接走汇编函数比较(不太懂汇编),在子串比较小而原字符串不小的情况下先寻找子串首字符位置,找到后比较字符

kmp 算法

这个网上有很多文章我感觉写的比较好的还是july,我自己念书的时候感觉数据结构里面写的还是很简单的,但是我家那本《算法》(名字就叫算法)就很难懂,kmp算法的主要思想就是一个模式字符串可能包含这个字符串的前缀,比如说一个模式字符串 fbbfbabbd 和 fbbfbbaisjdfkbabb进行匹配当比较到模式字符安串的第5个字符的时候不匹配,按照暴力搜索,应该在匹配字符串的第二位开始直接比较,但是我们知道两个字符串的前五位已经相等了,那么只需要从匹配字符串的第三位开始比较久可以了

关键就是要找到模式字符串的规律 ,在字符串中找到能够和字符串前缀类似的规律,找到这种规律的方法有很多 ,算法那本书用的是个二位数组,表示这个字符在摸个位置移动的位数,一般就是求得一个移动字符串的数组,这个july的博客写的就很详细

从头到尾彻底理解KMP(2014年8月22日版) - CSDN博客

算法:


获取模式数组


查找

golang 版 :



获取模式数组


查找

BM算法

bm算法诞生的比kmp算法早,而且速度也比较快,bm算法其实和kmp算法差不太多,都是先对模式进行预处理,只不过bm是从模式字符串的后面往前匹配,在不匹配的时候好后缀和坏字符原则选取移动最大的距离,依次比较

好后缀原则就是在之前几个字符都匹配成功的情况下看下在还没有匹配的模式字符串中是否有和他相同后缀的子串,如果有的话就移动就和之前最近的好后缀对齐,没有移动距离就是整个模式字符串的长度

坏字符原则 坏字符就是在当前字符失配的情况下,看下这个字符在字符串中的最右位置,移动并对齐,如果最右位置在失配位置的右边,这种情况下不考虑(此时会有好后缀,移动好后缀算出的距离即可),如果模式字符串中没有这个字符就移动模式字符串的距离,重新开从后往前匹配

由于这个算法我写的有点长就不粘了= ̄ω ̄= (话说简书粘代码也很长)


总结:

总的来说bm 和 kmp 都算是暴力搜索的一种改进,kmp在模式字符串没有重复前缀应该效率不是很高吧,算法那本书说在实际应用中暴力搜索的效率没有很低,因为很多就在首字母过滤掉了,但是如果是二进制文件Rabin-Karp 算法的效率还是更高些,而且对二维数据支持更好


参考:

从头到尾彻底理解KMP(2014年8月22日版) - CSDN博客

Boyer-Moore 字符串匹配算法 - 匠心十年 - 博客园

《算法》java版

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容