在longstr中迴圈查詢shortstr元素
舉例如shortstr m位.longstr,n位.
首先在longstr中匹配shortstr的第乙個字元。匹配後,從longstr中匹配點後一位開始匹配shortstr的第二個字元,迴圈直至匹配到shortstr的最後一位字元,判斷longstr中匹配點前m-1位是否與shortstr前m-1位相等,若是記錄當前位置-m+1.若否重複先前工作.直至longstr的最後一位。
舉例:最壞的情況也只是longstr中每個字元比較兩遍,所以時間複雜度為on
不過在寫的過程中發現了當shortstr末尾存在多個相同字元時會出錯。
針對這種情況,可以先搜尋ac,再判斷是否為acc。
最壞情況時間複雜度為o n * m1
m1為末尾重複字元的個數。
又仔細想了一下,對它進行了改進,先說一下優點和缺點。
優點 1是這個演算法無論是理解起來,還是**實現都非常簡單。
2演算法時間複雜度為o n
缺點1不光是對acc型別的搜尋字元會出現漏查,abcabc型別的也存在類似問題。
目前想到的解決辦法是去掉重複的字串如查acc,就查ac,abcabc變為abc,先搜尋不重複字串,再判斷是否與重複字串匹配。
時間複雜度計算
對於普通的搜尋字串來說,只要將longstr中每個字元比較一次加上shortstr迴圈次數乘上shortstr的長度即可,shortstr迴圈次數小於n/m,
計算次數最多為 n + n/m * m = 2n
則時間複雜度為 o n
對於有重複的搜尋字串來說,如果採取去掉重複字串方法,其執行的次數是longstr中每個字元比較一次加上 修改後shortstr不重複字串 的迴圈次數乘上shortstr的長度即可,修改後shortstr不重複字串的迴圈次數為
n/(m-m1) ,,則修改後shortstr不重複字串的迴圈次數最多為n.例如搜尋ssss字串,m - m1 = 1.
計算次數最多為 n + n * m = n + m * n
則時間複雜度為 o m*n
優化但對於這種情況還有很大的改進空間,從而降低它的時間複雜度。
稱修改後shortstr不重複字串為shortstr1
在shortstr1迴圈查詢一次後先判斷是否匹配,如果不匹配繼續迴圈,如果匹配,再依次對shortstr去掉的重複部分進行匹配,如遇不匹配字元,就從當前位置重新進行shortstr1迴圈查詢。反之則找到匹配字串,返回當前位置。
時間複雜度計算
shortstr1每迴圈一次就要多比較乙個字元(longstr與shortstr去掉的重複部分不匹配的第乙個字元)其執行的次數是longstr中每個字元比較一次加上shortstr1的迴圈次數乘上1即可,
計算次數最多為 n + n * 1 = 2 * n
這樣就可以保證其所有情況時間複雜度都為 o n
舉例:
不過這些證明可能有錯誤,演算法也有不完善的地方,希望大家可以一起完善。
一種字串搜尋方法
在閱讀開源 過程中發現一種字串搜尋方法,仔細分析之後終於搞懂其原理了。雖然不知道這種搜尋方法學術上叫什麼名字,但是對其構造跳轉表,跳躍搜尋的方式很感興趣,所以記錄下來分享一下。先看大致的 define maxchar 256 key 搜尋關鍵字 shift table 跳轉表陣列指標 void re...
一種字串搜尋方法
在閱讀開源 過程中發現一種字串搜尋方法,仔細分析之後終於搞懂其原理了。雖然不知道這種搜尋方法學術上叫什麼名字,但是對其構造跳轉表,跳躍搜尋的方式很感興趣,所以記錄下來分享一下。先看大致的 define maxchar 256 key 搜尋關鍵字 shift table 跳轉表陣列指標 void re...
自己寫的字串函式
include using namespace std define n 50 將字串src複製到desti void mystrcpy char desti,char src desti 0 比較字串大小 int mystrcmp char str1,char str2 return p1 p2 ...