資料結構 字串(BF演算法 KMP演算法)

2021-10-09 04:12:21 字數 3509 閱讀 4132

串的定義:

串(string)是計算機資訊處理中最常見的一種資料結構,是有限的字串行,記作

s = 「a1a2a3…an」

其中s是串名,雙引號之間的字串行為串的值,雙引號是串的分界符,並不是串的成分。其中「ai(1<=i空串、空格串和子串

空串:由零個字元組成的串,通常為兩個相鄰的雙引號來表示空串,例如:s = 「」,這兩個雙引號之間沒有任何字元,故s表示乙個空串,空串的長度為0。

空格串:表示僅由空格字元(asicii編碼為32)組成的串通常在兩個雙引號之間包含一定的空格字元,例如:s = 「 」,這兩個雙引號之間存在有一些空格字元,故表示空格串。

子串:串中任意個連續的字元組成的序列稱為該串的子串。

注:若串中存在空格,空格計算在串的長度中,例如:s = 「i love programming」,則串s的長度為18。

在c語言中,使用雙引號引起來的乙個和單引號引起來的單個字元是存在區別的,例如:s1 = 「a」 和s2 = 'a』兩者是存在區別的,s1表示字串而s2表示單個字元。

串在計算機中的三種儲存方式:

字串模式匹配(pattern matching)又稱為子串定位運算。

在模式匹配中,一般將主串稱為目標串,子串稱為模式串。模式匹配成功是指在目標串中找到模式串;匹配不成功是指目標串中不存在模式串。模式匹配經常應用於各類文字編輯程式中對某一特定字元的查詢,這樣可以大大提高文字編輯程式的響應速度,響應效能。

一、bf演算法(brute force)

即暴力(brute force)演算法,是一種普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串t的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和 t的第二個字元;若不相等,則比較s的第二個字元和t的第乙個字元,依次比較下去,直到得出最後的匹配結果。bf演算法是一種蠻力演算法,bf演算法的時間複雜度為 o(n*m)(n是文字的長度,m是模式字串的長度)。

bf演算法實現

/****************************************

* 函式名稱:bfindex(elemtype *s, elemtype *t)

* 功能描述:bf匹配演算法主體

* 傳入引數:elemtype *s 傳入的主串

* elemtype *t 傳入的模式串

* 返回值:若匹配完成返回模式串在主串的那個位

* 置(主串中模式串首所在的下標位置)

* 若未匹配到則返回-1

*****************************************/

intbfindex

(elemtype *s, elemtype *t)

else}if

(j == tlen)

else

}

bf演算法在主串和子串匹配失敗時,主串進行的回溯操作會影響整體匹配的效率,回溯之後,主串與子串有些部分比較是沒有必要的。這種簡單的丟棄前面的匹配資訊是bf演算法之所以效率低下的乙個重要原因。

二、kmp演算法(knuth-morris-pratt)

knuth-morris-pratt 演算法簡稱為 「kmp 演算法」,常用於在乙個文字串 s 內查詢乙個模式串 p 的出現位置,這個演算法由 donald knuth、vaughan pratt、james h. morris 三人於 1977 年聯合發表,故取這三人的姓氏命名此演算法,kmp演算法的時間複雜度為 o(n+m)(n是文字的長度,m是模式字串的長度)。

其中在kmp演算法中需要認真理解的就是其中的匹配過程到程式編寫的轉化,只有多次試驗以及思考才能知道其中的含義!

下面是kmp演算法的具體實現:

1. 獲取字串長度

/*************************************

* 函式名稱:getstringlen(char *s)

* 功能描述:獲取字串長度

* 傳入引數:待獲取長度的字串

* 返回值:字串長度

*************************************/

intgetstringlen

(char

*s)return len;

}

kmp演算法的next[ ]陣列求取方法:next[ ]陣列的作用:當模式串發生失配時,指導文字串將以哪個字元與模式串進行比較。sd

eded

ddde

下標012

3456

78next[ ]-100

1230

002. next[ ]陣列獲取

/*************************************

* 函式名稱:getkmpnext(elemtype *p, int next)

* 功能描述:求kmp演算法的next

* 傳入引數:elemtype *p 傳入模式字串

* int next kmp演算法的next

* 返回值:空

*************************************/

void

getkmpnext

(elemtype *p,

int next)

else

}}

3. kmp演算法實現

/****************************************

* 函式名稱:kmpindex(elemtype *s, elemtype *t)

* 功能描述:kmp匹配演算法主體

* 傳入引數:elemtype *s 傳入的主串

* elemtype *t 傳入的模式串

* 返回值:若匹配完成返回模式串在主串的那個位

* 置(主串中模式串首所在的下標位置)

* 若未匹配到則返回-1

*****************************************/

intkmpindex

(elemtype *s, elemtype *t)

else}if

(j == tlen)

/*匹配完成*/

else

}

?

o_o …

(⊙o⊙)

?

字元字串模式匹配演算法 BF演算法與KMP演算法

需解決的問題 從主字串s中尋找子字串t出現的第乙個位置?如果出現,返回pos,否則,返回 1 一 bf演算法 bf演算法就是樸素模式匹配演算法,即暴力求解,迴圈遍歷。將子字串的每個字元和主字串的字元按順序比較,如果比較不相等時,兩個字串的索引i和j同時回退,i回退到剛才主字串起始位置的下一位,子字串...

資料結構與演算法 字串匹配 BF演算法

又稱暴力匹配演算法,是一種樸素的模式匹配演算法 給定主串 s bilibili 和子串 t bilididi 1.主串 s 第一位開始與子串 t 第一位匹配,b 與 l 不匹配,匹配失敗 2.主串 s 第二位開始與子串 t 第一位匹配,i 與 l 不匹配,匹配失敗 3.主串 s 第三位開始與子串 t...

字串匹配演算法 BF及KMP

以 absababcef 與 abce 為例,求串2與串1匹配的第乙個位置的下標 這裡即輸出 5 一般的,我們可以從串1的起始位置開始與串2比較,若相同則兩串都向後移,否則,串1回到第二個位置,串2回到起始位置重新比較。本題用此方法會超時 includeint a 10001 b 10001 int...