91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

kmp算法如何在python項目中實現

發布時間:2020-12-31 16:10:53 來源:億速云 閱讀:176 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關kmp算法如何在python項目中實現,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

kmp算法

kmp算法用于字符串的模式匹配,也就是找到模式字符串在目標字符串的第一次出現的位置

比如

abababc

那么bab在其位置1處,bc在其位置5處

我們首先想到的最簡單的辦法就是蠻力的一個字符一個字符的匹配,但那樣的時間復雜度會是O(m*n)

kmp算法保證了時間復雜度為O(m+n)

基本原理

舉個例子:

kmp算法如何在python項目中實現

發現x與c不同后,進行移動


kmp算法如何在python項目中實現

a與x不同,再次移動


kmp算法如何在python項目中實現

此時比較到了c與y,
于是下一步移動成了下面這樣


kmp算法如何在python項目中實現

這一次的移動與前兩次的移動不同,之前每次比較到上面長字符串的字符位置后,直接把模式字符串的首字符與它對齊,這次并沒有,原因是這次移動之前,y與c對齊,但是y前邊的ab是與自己的前綴ab一樣,于是ab并不用再比較,直接從第三個位置開始比較,如圖:

kmp算法如何在python項目中實現

所以說kmp算法對于這種情況就直接使用當前比較字符之前的最長相同的前后綴,然后將前綴與上面的長字符串對齊,繼續比

較后面的字符串。
這里kmp算法中的一個重要點就來了,如何找到模式字符串中每位字符之前的最長相同前后綴呢
這里繼續用一個例子舉例:


kmp算法如何在python項目中實現

下面的數字記錄以該字符為結尾的最長前后綴相同子串的長度,先初始化為0,并且第一個字符下的數字確認為0
然后開始比較:


kmp算法如何在python項目中實現

a與b不同,那么b下的數字也為0同理a與c不同,c下的數字也為0,接下來a與a對齊,如下


kmp算法如何在python項目中實現

此時a與a相同,那么a下面的數字為1,也就是第二排字符串中當前比對的字符索引+1
接下來b與b相同,c與a不相同,那么此時上面的字符串不動,下面的字符串移動到當前比對位置即c的前一位的下方的數字的位置,如圖:

移動前


kmp算法如何在python項目中實現

c的前一位是b,b下方的數字是0,所以將下面字符串的第0位與之前的比對位置對其,即:


kmp算法如何在python項目中實現

當前比對位置如箭頭所示,然后繼續向后比較,一直比到c與a:


kmp算法如何在python項目中實現

此時c與a不相同,那么比較下面字符的前一個字符的下方數字的位置,如圖


kmp算法如何在python項目中實現

也就是位置為2的地方與上面比對位置對齊:


kmp算法如何在python項目中實現

此時c與c相同,整個字符串自比對完成:


kmp算法如何在python項目中實現

此時可能會沒有理解為什么匹配不成功的時候要再比對其前一位字符下的數字的位置,那是因為這是要找到前一個字符位置下的最長相同前綴中的最長相同前綴,就舉剛才的例子:


kmp算法如何在python項目中實現

此時a前邊是abcab,所以要找到abcab的最長相同前綴,就是ab,這時


kmp算法如何在python項目中實現

然后再移動到ab與ab對其的位置繼續比較即可

時間復雜度

簡單來講, 找到模式字符串中每位字符之前的最長相同前后綴的這個方法中,如果模式字符串的長度為m,那么上面的字符串的指向是一直向前移動的,下面字符串的整體也是一直向前移動的,最終移動的結果將會是長度為2m,所以比較次數也是最大為2m,時間復雜度為O(m)

kmp算法中,運用了找到模式字符串中每位字符之前的最長相同前后綴的這個方法的結果,然后使用類似的方法進行比較和移動,和上邊的解釋類似,如果這個要匹配的字符串長度為n,那最長的移動舉例也超不過2n,所以總的時間復雜度為O(m+n)

具體代碼

這里沒有進行傳入參數的驗證,使用時還要注意。

def same_start_end(s):
  """最長前后綴相同的字符位數"""
  n = len(s) #整個字符串長度
  j = 0 # 前綴匹配指向
  i = 1 # 后綴匹配指向
  result_list=[0]*n
  while i < n:
    if j == 0 and s[j] != s[i]: # 比較不相等并且此時比較的已經是第一個字符了
      result_list[i] = 0  # 值為0
      i += 1 # 向后移動
    elif s[j] != s[i] and j != 0: #比較不相等,將j值設置為j前一位的result_list中的值,為了在之前匹配到的子串中找到最長相同前后綴
      j = result_list[j-1]
    elif s[j] == s[i]:  #相等則繼續比較
      result_list[i] = j+1
      j = j+1
      i = i+1
  return result_list
def kmp(s,p):
  """kmp算法,s是字符串,p是模式字符串,返回值為匹配到的第一個字符串的第一個字符的索引,沒匹配到返回-1"""
  s_length = len(s)
  p_length = len(p)
  i = 0 # 指向s
  j = 0 # 指向p
  next = same_start_end(p)
  while i < s_length:
    if s[i] == p[j]: # 對應字符相同
      i += 1
      j += 1
      if j >= p_length: # 完全匹配
        return i-p_length
    elif s[i] != p[j]: # 不相同
      if j == 0:  # 與模式比較的是模式的第一個字符
        i += 1
      else:    # 取模式當前字符之前最長相同前后綴的前綴的后一個字符繼續比較
        j = next[j]
  if i == s_length:  # 沒有找到完全匹配的子串
    return -1

上述就是小編為大家分享的kmp算法如何在python項目中實現了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新邵县| 佛坪县| 博野县| 佛冈县| 河曲县| 高唐县| 曲阜市| 龙井市| 霍山县| 板桥市| 昆明市| 郯城县| 吕梁市| 彝良县| 高青县| 昌吉市| 胶州市| 旬邑县| 普陀区| 云龙县| 无极县| 晋江市| 兴仁县| 皋兰县| 闸北区| 嘉荫县| 嘉兴市| 舒城县| 彰武县| 泰兴市| 福鼎市| 德惠市| 绥棱县| 广平县| 阿拉尔市| 宜君县| 陇川县| 雷州市| 临高县| 石棉县| 嘉鱼县|