kmp算法核心精髓的一些簡(jiǎn)化實(shí)現(xiàn)

? ? ? ? 早上起來刷微信,看到前同事分享了一個(gè)搜索算法的科普文章,一看遍入迷,叫做kmp算法。kmp算法可以百度一下,挺多講的,我這里記錄一下我在學(xué)習(xí)理解過程中的一些小發(fā)現(xiàn),有助于簡(jiǎn)化對(duì)于該算法的程序?qū)崿F(xiàn)過程,或者說是對(duì)理解該算法核心精髓的幫助。

? ? ? ? kmp的核心精髓是那個(gè)匹配表的計(jì)算

? ? ? ? 原計(jì)算方式如下兩個(gè)圖:


? ? ? ? kmp匹配表官方計(jì)算方式:

? ? ? ? 官方這種方式,匹配表比較簡(jiǎn)單,但是需要根據(jù)匹配失敗的前綴情況對(duì)位置來查找獲取匹配值。我這里想出了一個(gè)簡(jiǎn)化版的匹配表,簡(jiǎn)單來講就是ABCABD這個(gè)字符串,匹配失敗的情況下,有這么幾種前綴是可能匹配成功的,都列出來:

A? ?AB? ?ABC? ?ABCA? ?ABCAB

? ? ????用kmp的前后綴思路計(jì)算每種情況的匹配值,結(jié)果:

A? ? ? ? ? ? ? ? ? ? ? ?沒有相同,長(zhǎng)度0,得出匹配值0

AB? ? ? ? ? ? ? ? ? ? 沒有相同,長(zhǎng)度0,得出匹配值0

ABC? ? ? ? ? ? ? ? ?沒有相同,長(zhǎng)度0,得出匹配值0

ABCA? ? ? ? ? ? ? ? 相同的為A,長(zhǎng)度1,得出匹配值1

ABCAB? ? ? ? ? ? ?相同的為AB,長(zhǎng)度2,得出匹配值2

????? ? 把上表保存到一個(gè)map中,key為前綴,值為匹配值。計(jì)算過程中,用匹配失敗出現(xiàn)的情況對(duì)應(yīng)的前綴類型,直接到這個(gè)map中找對(duì)應(yīng)的匹配值即可,然后用前綴字符串長(zhǎng)度減去匹配值即可獲取下次的偏移量(和kmp算法后續(xù)算偏移量的方法一樣)。這樣程序?qū)崿F(xiàn)起來會(huì)邏輯會(huì)簡(jiǎn)單明了一些,畢竟我認(rèn)為不影響多少時(shí)效性的情況下,代碼邏輯越簡(jiǎn)單越好。

? ? ? ? 其實(shí)kmp算法的核心思想就是考慮:匹配失敗的情況下,成功的前綴部分中是否有重復(fù)內(nèi)容,從而判斷下次檢索需要前進(jìn)多少位,而不需要一位一位的檢索,避免了一些無意義的動(dòng)作,從而提升檢索效率。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符串匹配KMP算法詳解 1. 引言 以前看過很多次KMP算法,一直覺得很有用,但都沒有搞明白,一方面是網(wǎng)上很少有...
    張晨輝Allen閱讀 2,644評(píng)論 0 3
  • 姓名:趙應(yīng)鵬 學(xué)號(hào)19011210552 【嵌牛導(dǎo)讀】:在給定一個(gè)文本字符串和一個(gè)模式字符串的時(shí)候,在文本字符串中...
    小白110閱讀 1,028評(píng)論 0 0
  • KMP的由來 在KMP算法之前,對(duì)文本進(jìn)行匹配時(shí)使用的是樸素模式匹配算法,也就是最簡(jiǎn)單匹配算法.當(dāng)然運(yùn)行效率也是讓...
    圣光懺悔閱讀 1,882評(píng)論 2 13
  • 前言 動(dòng)態(tài)規(guī)劃(dynamic programming)是運(yùn)籌學(xué)的一個(gè)分支,是求解決策過程(decision pr...
    tianyl閱讀 2,886評(píng)論 0 1
  • 作者題記: 世上的靈魂都沿著獨(dú)一無二的軌跡尋覓愛,那些能合二為一的霓虹就是宇宙存在的意義。 這不是關(guān)于仙...
    桃源婕妤閱讀 273評(píng)論 0 0

友情鏈接更多精彩內(nèi)容