python編寫程式實現二元一次方程的求解_python求解next陣列實現KMP演算法
阿新 • • 發佈:2021-02-11
今天在做題的時候遇上好幾道題目都是有關於KMP字串匹配中的next陣列的相關問題的,這是一個自己的盲區,畢竟之前一直沒有看到過,今天就好好研究一下吧,KMP演算法的來源,原理我都不多說了,這個是學習資料結構中的經典。
KMP演算法,是由Knuth,Morris,Pratt共同提出的模式匹配演算法,其對於任何模式和目標序列,都可以線上性時間內完成匹配查詢,而不會發生退化,是一個非常優秀的模式匹配演算法,KMP演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現一個next()函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度O(m+n)
看了上面這些簡單的介紹不難發現,KMP演算法優於簡單字串匹配演算法的根本原因就是:引入了一個next陣列,這個陣列可以儘可能的記錄相關的匹配資訊,使得在不匹配發生的時候移動的步長不再是固定的一位,加快了匹配進行的速度,在失配後,並不簡單地從目標串下一個字元開始新一輪的檢測,而是依據在檢測之前得到的有用資訊即next陣列中記錄的資訊,直接跳過不必要的檢測,從而達到一個較高的檢測效率,關於它的講解、實現和優化網上有很多很多的資料,都可以去看看,這裡只是簡單實現一下,就當做是再學習一次吧,畢竟很久沒有使用過了,很多東西都忘記了
下面是具體的實現:
#!usr/bin/env python#encoding:utf-8 '''__Author__:沂水寒城功能:python實現KMP演算法''' def simple_match_func(one_str, two_str): ''' 最簡單的字串匹配演算法 ''' length1=len(one_str) length2=len(two_str) for i in range(length1-length2+1): if one_str[i:i+length2]==two_str: return True else: return True def get_next_group(one_str): ''' 獲取到next陣列 ''' next_group=[0]*len(one_str) next_group[0]=-1 point=-1 i=0 length=len(one_str) while i
結果如下:
匹配成功!next陣列為: [-1, 0, 0, 0, 0]模式串在源串中起始位置下標為: 12模式串為: ABBBG[[email protected] one]# python next_group.py 匹配成功!next陣列為: [-1, 0, 0, 1, 2, 0, 1, 1, 2]模式串在源串中起始位置下標為: 0模式串為: xyxyyxxyx
next陣列有一個區別就是:有的吧next[0]定義為-1,本文就是這個版本,有的是定義為:0,這個看自己怎麼選取了
推薦幾個講解不錯的文章:
http://www.cnblogs.com/c-cloud/p/3224788.html
http://blog.csdn.net/u010189459/article/details/30067705