国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(五):經(jīng)典KMP算法

2019-11-02 15:54:11
字體:
供稿:網(wǎng)友

   這篇文章主要介紹了JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(五):經(jīng)典KMP算法,本文詳解了KMP算法的方方面在,需要的朋友可以參考下

  KMP算法和BM算法

  KMP是前綴匹配和BM后綴匹配的經(jīng)典算法,看得出來前綴匹配和后綴匹配的區(qū)別就僅僅在于比較的順序不同

  前綴匹配是指:模式串和母串的比較從左到右,模式串的移動也是從 左到右

  后綴匹配是指:模式串和母串的的比較從右到左,模式串的移動從左到右。

  通過上一章顯而易見BF算法也是屬于前綴的算法,不過就非常霸蠻的逐個匹配的效率自然不用提了O(mn),網(wǎng)上蛋疼的KMP是講解很多,基本都是走的高大上路線看的你也是一頭霧水,我試圖用自己的理解用最接地氣的方式描述

  KMP

  KMP也是一種優(yōu)化版的前綴算法,之所以叫KMP就是Knuth、Morris、Pratt三個人名的縮寫,對比下BF那么KMP的算法的優(yōu)化點就在“每次往后移動的距離”它會動態(tài)的調(diào)整每次模式串的移動距離,BF是每次都+1,

  KMP則不一定

  如圖BF與KMP前置算法的區(qū)別對比

  我通過圖對比我們發(fā)現(xiàn):

  在文本串T中搜索模式串P,在自然匹配第6個字母c的時候發(fā)現(xiàn)二等不一致了,那么BF的方法,就是把整個模式串P移動一位,KMP則是移動二位.

  BF的匹配方法我們是知道的,但是KMP為什么會移動二位,而不是一位或者三位四位呢?

  這就上一張圖我們講解下,模式串P在匹配了ababa的時候都是正確的,當(dāng)?shù)絚的時候才是錯誤,那么KMP算法的想法是:ababa是正確的匹配完成的信息,我們能不能利用這個信息,不要把"搜索位置"移回已經(jīng)比較過的位置,繼續(xù)把它向后移,這樣就提高了效率。

  那么問題來了, 我怎么知道要移動多少個位置?

  這個偏移的算法KMP的作者們就給我們總結(jié)好了:

  代碼如下:

  移動位數(shù) = 已匹配的字符數(shù) - 對應(yīng)的部分匹配值

  偏移算法只跟子串有關(guān)系,沒文本串沒毛線關(guān)系,所以這里需要特別注意了

  那么我們怎么理解子串中已匹配的字符數(shù)與對應(yīng)的部分匹配值?

  已匹配的字符:

   代碼如下:

  T : abababaabab

  p : ababacb

  p中紅色的標(biāo)記就是已經(jīng)匹配的字符,這個很好理解

  部分匹配值:

  這個就是核心的算法了,也是比較難于理解的

  假如:

   代碼如下:

  T:aaronaabbcc

  P:aaronaac

  我們可以觀察這個文本如果我們在匹配c的時候出錯,我們下一個移動的位置就上個的結(jié)構(gòu)來講,移動到那里最合理?

   代碼如下:

  aaronaabbcc

  aaronaac

  那么就是說:在模式文本內(nèi)部,某一段字符頭尾都一樣,那么自然過濾的時候可以跳過這一段內(nèi)容了,這個思路也是合理的

  知道了這個規(guī)律,那么給出來的部分匹配表算法如下:

  首先,要了解兩個概念:"前綴"和"后綴"。 "前綴"指除了最后一個字符以外,一個字符串的全部頭部組合;"后綴"指除了第一個字符以外,一個字符串的全部尾部組合。

  "部分匹配值"就是"前綴"和"后綴"的最長的共有元素的長度”

  我們看看aaronaac的如果是BF匹配的時候劃分是這樣的

  BF的位移: a,aa,aar,aaro,aaron,aarona,aaronaa,aaronaac

  那么KMP的劃分呢?這里就要引入前綴與后綴了

  我們先看看KMP部分匹配表的結(jié)果是這樣的:

  代碼如下:

  a a r o n a a c

  [0, 1, 0, 0, 0, 1, 2, 0]

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 和田市| 黔江区| 靖宇县| 瑞金市| 广州市| 南漳县| 吉水县| 天津市| 泸溪县| 凌源市| 双柏县| 政和县| 雅安市| 靖边县| 敦煌市| 保亭| 武义县| 安阳市| 松阳县| 五峰| 青海省| 株洲县| 辽宁省| 甘谷县| 浠水县| 刚察县| 固安县| 尼木县| 尼勒克县| 金川县| 大关县| 金坛市| 普兰县| 枣强县| 鄂温| 时尚| 来凤县| 宜良县| 临沂市| 陕西省| 洪江市|