最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解KMP算法以及python如何實現(xiàn)

 更新時間:2020年09月18日 16:11:20   作者:MrDoghead  
這篇文章主要介紹了KMP算法的相關(guān)知識以及python如何實現(xiàn),幫助大家更好的進行數(shù)據(jù)分析,感興趣的朋友可以了解下

算法思路

Knuth-Morris-Pratt(KMP)算法是解決字符串匹配問題的經(jīng)典算法,下面通過一個例子來演示一下:

給定字符串"BBC ABCDAB ABCDABCDABDE",檢查里面是否包含另一個字符串"ABCDABD"。

1.從頭開始依次匹配字符,如果不匹配就跳到下一個字符

2.直到發(fā)現(xiàn)匹配字符,然后經(jīng)過一個內(nèi)循環(huán)嚴查字符串是否匹配

 

3.發(fā)現(xiàn)最后一個D不匹配,下面就該思考應(yīng)該把字符串向右移動多少個位置呢?傳統(tǒng)做法可能是移動一格,KMP算法就創(chuàng)新在這里。KMP算法通過查詢一個Partial Match Table(表內(nèi)存有字符串信息),然后計算出需要移動的步數(shù),這個表后面會介紹怎么來的。

這里我們看到D前面是B,查表得到第二個B對應(yīng)的是2,所以 移動數(shù) = 已匹配字符數(shù) - 查表所得數(shù) 也就是 6 - 2 = 4, 需要向右移動四格。

下面也是重復(fù)這個步驟

直到發(fā)現(xiàn)匹配或者字符長度超出(未發(fā)現(xiàn)匹配)。

Partial Match Table

那么這個查詢的表是怎么來的呢?仍然以"ABCDABD"為例

- "A"的前綴和后綴都為空集,共有元素的長度為0;

- "AB"的前綴為[A],后綴為[B],共有元素的長度為0;

- "ABC"的前綴為[A, AB],后綴為[BC, C],共有元素的長度0;

- "ABCD"的前綴為[A, AB, ABC],后綴為[BCD, CD, D],共有元素的長度為0;

- "ABCDA"的前綴為[A, AB, ABC, ABCD],后綴為[BCDA, CDA, DA, A],共有元素為"A",長度為1;

- "ABCDAB"的前綴為[A, AB, ABC, ABCD, ABCDA],后綴為[BCDAB, CDAB, DAB, AB, B],共有元素為"AB",長度為2;

- "ABCDABD"的前綴為[A, AB, ABC, ABCD, ABCDA, ABCDAB],后綴為[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的長度為0。

python實現(xiàn)

def partial_table(p):
  '''''partial_table("ABCDABD") -> [0, 0, 0, 0, 1, 2, 0]'''
  prefix = set()
  res = [0]
  for i in range(1, len(p)):
    prefix.add(p[:i])
    postfix = {p[j:i + 1] for j in range(1, i + 1)}
    #print(p[:i+1],prefix,postfix,prefix & postfix or {''})
    res.append(len((prefix & postfix or {''}).pop()))
  return res

def kmp_match(s, p):
  m = len(s);
  n = len(p)
  cur = 0 # 起始指針cur
  table = partial_table(p)
  while cur <= m - n:   #只去匹配前m-n個
    for i in range(n):
      if s[i + cur] != p[i]:
        cur += max(i - table[i - 1], 1) # 有了部分匹配表,我們不只是單純的1位1位往右移,可以一次移動多位
        break
    else:    
      return True # loop從 break 中退出時,else 部分不執(zhí)行。
  return False

print partial_table1("ABCDABD")
print kmp_match("BBC ABCDAB ABCDABCDABDE", "ABCDABD")

以上就是詳解KMP算法以及python如何實現(xiàn)的詳細內(nèi)容,更多關(guān)于python實現(xiàn)KMP算法的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 利用Python中unittest實現(xiàn)簡單的單元測試實例詳解

    利用Python中unittest實現(xiàn)簡單的單元測試實例詳解

    如果項目復(fù)雜,進行單元測試是保證降低出錯率的好方法,Python提供的unittest可以很方便的實現(xiàn)單元測試,從而可以替換掉繁瑣雜亂的main函數(shù)測試的方法,將測試用例、測試方法進行統(tǒng)一的管理和維護。本文主要介紹了利用Python中unittest實現(xiàn)簡單的單元測試。
    2017-01-01
  • Python實現(xiàn)簡單的文件操作合集

    Python實現(xiàn)簡單的文件操作合集

    這篇文章主要為大家詳細介紹了Python實現(xiàn)的一些簡單的文件操作合集,例如:文件的打開,關(guān)閉;文件的寫入等,感興趣的小伙伴可以了解一下
    2022-09-09
  • python networkx 根據(jù)圖的權(quán)重畫圖實現(xiàn)

    python networkx 根據(jù)圖的權(quán)重畫圖實現(xiàn)

    這篇文章主要介紹了python networkx 根據(jù)圖的權(quán)重畫圖實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python中apply函數(shù)的用法實例教程

    Python中apply函數(shù)的用法實例教程

    這篇文章主要介紹了Python中apply函數(shù)的用法,配合實例解說,可加深讀者對apply函數(shù)的理解,需要的朋友可以參考下
    2014-07-07
  • 利用PyWebIO庫10分鐘搭建一個漂亮的Python?Web應(yīng)用

    利用PyWebIO庫10分鐘搭建一個漂亮的Python?Web應(yīng)用

    這篇文章主要介紹了PyWebIO是一個用于在瀏覽器上獲取輸入和進行輸出的Python工具庫,它能讓我們零前端知識,純Python代碼構(gòu)建Web應(yīng)用,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-01-01
  • python 簡單備份文件腳本v1.0的實例

    python 簡單備份文件腳本v1.0的實例

    下面小編就為大家?guī)硪黄猵ython 簡單備份文件腳本v1.0的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望對大家有所幫助
    2017-11-11
  • Python編程使用matplotlib繪制動態(tài)圓錐曲線示例

    Python編程使用matplotlib繪制動態(tài)圓錐曲線示例

    這篇文章主要介紹了Python使用matplotlib繪制動態(tài)的圓錐曲線示例實現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • Python函數(shù)遞歸調(diào)用實現(xiàn)原理實例解析

    Python函數(shù)遞歸調(diào)用實現(xiàn)原理實例解析

    這篇文章主要介紹了Python函數(shù)遞歸調(diào)用實現(xiàn)原理過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-08-08
  • python BeautifulSoup庫的安裝與使用

    python BeautifulSoup庫的安裝與使用

    這篇文章主要介紹了python BeautifulSoup庫的安裝與使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • 單利模式及python實現(xiàn)方式詳解

    單利模式及python實現(xiàn)方式詳解

    單例模式(Singleton Pattern)是一種常用的軟件設(shè)計模式,該模式的主要目的是確保 某一個類只有一個實例存在.這篇文章主要介紹了單利模式及python實現(xiàn)方式及Python單例模式的4種實現(xiàn)方法,需要的朋友可以參考下
    2018-03-03

最新評論

潼关县| 巩留县| 普格县| 安义县| 酉阳| 寻甸| 荆州市| 廊坊市| 慈溪市| 厦门市| 祁门县| 罗甸县| 密山市| 莲花县| 余庆县| 普宁市| 白朗县| 长乐市| 长丰县| 兴义市| 通城县| 肇东市| 容城县| 玛纳斯县| 开原市| 营口市| 咸阳市| 东至县| 湘潭市| 栾城县| 黄陵县| 辉南县| 大关县| 确山县| 武安市| 嘉鱼县| 九寨沟县| 泰兴市| 舟曲县| 宜阳县| 宣武区|