基礎資料結構及其基本應用 串

2021-10-22 06:55:42 字數 1931 閱讀 3492

typedef

struct

str;

typedef

struct

str;

int

strassign

(str &str,

char

*ch)

//具體呼叫

strassign

(str,

"hello"

);

對乙個串中某子串的定位操作稱為串的模式匹配

簡單模式匹配演算法的思想為單純地順序推進,每推進乙個位置進行一次比較,若本位字元相等則比較下一位字元是否相等,若不相等則子串整體向後移動乙個單位重新開始進行比較直至子串中所有的字元都完成匹配,否則失敗。

int

index

(str str, str substr)

else}if

(j>substr.length)

//如果j大於子串的長度說明上面的迴圈是因為子串已經匹配完成而退出的

return k;

//用k標記子串在主串中的位置

return0;

}

進步狀態:當匹配受阻時,進步狀態指找到了下乙個能夠完成對當前受阻字元前所有字元的匹配工作的狀態(有點繞)

更加直觀的解釋是:正如我們在前面的普通方法中所了解到的,假設子串的長度為l,在位置k時我們已經完成了對子串的前m個字元的匹配,但是第m+1個字元匹配錯誤;如果按普通方法進行,那麼我們將子串整體向前推進一格,同時重新開始子串的匹配(從第乙個字元開始);而「進步狀態」的思想則是直接將子串推進到下一次有可能進行匹配的狀態,這樣節省了大量的匹配時間,那麼難點就來到了如何構建這樣乙個「跳轉表」。

字元匹配的過程實際上就是一次一次尋找下乙個進步狀態的過程,直到完成全部的串匹配工作

如何求next陣列?

void

getnext

(str substr,

int next)

else

}}

int

kmp(str str, str substr,

int next)

else}if

(j>substr.length)

else

return0;

}

改進思路:在kmp演算法中可能存在大量的重複比較(如字串「aaaaab」,在next陣列中next[5]儲存的是4,next[ 4 ]儲存的是3……,但其實他們都是重複的)

具體改進方法:將next陣列進行改進,判斷各個值是都會造成「浪費比較」,得到nextval陣列

求nextval的一般步驟:

注意:這裡是 推進

的思想,核心有兩點:第一,求nextval的過程是從第乙個字元開始進行確認的;第二,後續比較的記錄,已經被記錄在了nextval陣列中,無需重複;

**實現:

void

getnextval

(str substr,

int nextval)

else

}else

}}

int

kmp(str str, str substr)

else

if(j>str.length)

}return sum;

//返回總匹配次數

}

資料結構 鍊錶的基本應用2

1.刪除排序鍊錶中的重複元素 刪除重複的元素,使每個元素值只出現一次 public listnode deleteduplicates1 listnode head else return head 2.刪除排序鍊錶中的重複元素 刪除所有的重複元素,只保留原始鍊錶中沒有重複出現的數字 public ...

資料結構及其應用

在程式的世界裡,任何問題或技術的落腳點都是資料結構,所以在學習或研究這些問題或技術時,要注重理解底層或實現過程中所採用的資料結構。本系列會將常用的資料結構進行總結,首先看下樹。一 樹常用的樹形資料結構有 搜尋二叉樹 平衡二叉樹 紅黑樹 完全二叉樹 1.搜尋二叉樹 父子節點滿足大小關係,左子樹都小於根...

Numpy基礎及基本應用

資料處理的一般流程 資料收集 資料預處理 資料處理 資料展示 資料收集方法 網路爬蟲 公開資料集 其他途徑收集的資料 預處理方法 歸一化 二值化 維度變換 去重 無效資料過濾 資料處理方法 資料排序 資料查詢 資料統計分析 資料展示方法 列表 圖表 動態互動圖形 安裝numpy windows pi...