DS 0925(第四章 關於串的演算法)

2021-10-09 19:01:53 字數 2209 閱讀 6001

模式匹配

主串:s=『abcdefg』

子串:『abc』 , 『efg』 //子串一定是主串中存在的

模式串:『cde』 ,『ifg』 //模式串是想要在主串中找到的,未必存在

串的模式匹配:在主串中找到與模式串相同的子串,並返回其所在的位置

int

index

(sstring s,sstring t)

else}if

(j>t.length)

return k;

else

return0;

}

演算法效能分析:(若模式串長度為m,主串長度為n)

1.較好的情況:每個子串第乙個字元就不匹配

2.匹配成功的最好情況:o(m)

3.匹配失敗的最好情況:o(n-m+1)=o(n-m)=o(n)

4.最壞情況:n-m+1 匹配m次 ,o(nm)

樸素模式匹配演算法(簡單模式匹配演算法):

1.將主串中和模式串長度相同的串先搞出來,挨個與模式串進行對比

2.當模式串與子串某個字元不匹配時,就立即放棄當前子串,轉而檢索下乙個子串

樸素模式匹配演算法的缺點:用於在主串中記錄當前匹配字元的指標i需要不斷回溯,浪費時間。

kmp演算法特點

1.用於記錄主串位置的i指標不回溯

2.通過對模式串的判斷,當j=k時匹配失敗,說明1~k-1都匹配成功

eg:模式串為 『google』

由此可以建立乙個陣列next ,當j=k且字元不匹配時,令j=next[k];

int

index_kmp

(sstring s,sstring t,

int next)

else

j=next[j]

;//模式串向右移動 }if

(j>t.length)

return i-t.length;

//匹配成功

else

return0;

}

next陣列的快速求法

eg:『abcadb』

eg:『abababcdef』

eg:『aaaabcd』

eg:『abcdefg』

eg:『abcabd』

總結

串的字首:包含第乙個字元,且不包含最後乙個字元的子串

串的字尾:包含最後乙個字元,且不包含第乙個字元的子串

當第 j 個字元匹配失敗時,由1~j-1個字元組成的串記為s,則:next[j]=s的最長相等前字尾長度+1

特別的next[1]=0

練習1:

模式串:『ababaa』

序號j123

456模式串ab

abaa

next[j}01

1234

練習2:

模式串:『aaaab』

序號j123

45模式串aaa

abnext[j]01

234kmp演算法的平均時間複雜度:o(m+n)

//求模式串t的next陣列 o(m)

void

get_next

(sstring t,

int next)

else

j=next[j]

;//迴圈繼續 }}

intindex_kmp

(sstring s,sstring t)

else

j=next[j]

;//模式串向右移動 }if

(j>t.length)

return i-t.length;

//匹配成功

else

return0;

}

kmp演算法的優化:nextval[j]陣列

作用:避免了j指標回溯到前乙個相同的字母,進行一些重複的不必要的比較

nextval[j]陣列的求法

令nextval[0]=0

往後看下乙個字元的next陣列所指向的字元,與其是否相同,相同的話則令其nextval陣列值等於相同字元的nextval陣列值

如果不相同nextval陣列值,則等於next陣列值

ds第四章學習記錄

串 一.定義 子串 主串 空格串 空串 堆式順序儲存結構 二.匹配 1.庫函式 strstr c c 返回字串頭指標 null 乙個乙個向前挪地比較 t o n m 最壞情況 最後乙個字元不同 2.改進 從末尾開始比 幸運 t o n t o n m 最壞情況 第乙個字元不同 3.kmp演算法 t ...

第四章作業 串

1 1 函式strcmp從頭至尾順序地將其對應字元比較,遇到兩個字元不等時,兩個字元相減得到乙個int型值,兩個字串完全相同時,則返回0。1分 t 1 2c 語言中 字串常量最後乙個字元是結束標誌 該結束符是 0 1分 t 1 3char s c language 表示s是乙個指向字串的指標變數,把...

演算法第四章作業

1.我對貪心演算法的理解 貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態...