自己寫的一種字串搜尋

2021-07-02 07:48:18 字數 1481 閱讀 8690

在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 ...