筆記 串及其應用

2021-08-09 05:41:53 字數 2688 閱讀 1198

二串的表示

三串的實現

四串的模式匹配演算法

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

a1a2

……an

" 其中s是串名,用雙引號括起來的字串行是串值;雙引號是定界符,不是串的成分;ai

(1小於等於i小於等於n)是程式語言的字符集中的字元,稱為串元素;n是串的長度,且n大於等於0。當n=0時,稱為空串,記作s=「 」(一對雙引號之間沒有任何字元),而s=「 」(一對雙引號之間有乙個空白字元)稱為空白串

串中任意個連續的字元組成的子串行稱為該串的子串。相應地,包含子串的串稱為主串。通常將字元在串中的序號稱為該字元在串中的位置。子串在主串的位置以子串的第乙個字元在主串中的位置來表示。

當且僅當兩個串的值相等時,兩個串是相等的。即只有兩個串的長度相等,且串中各個對應位置的字元均相等,兩個串才是相等的。

串是線性表的一種特殊情形,即當線性表的元素為字元型的情形。

串的操作通常不是以單個元素作為操作物件,往往是一連串的字元作為操作物件。串的基本操作集合:

如何表示串,既要考慮在其上的定義的操作集易於實現和執行效率的提高,又要考慮儲存管理的方便和儲存器的使用效率。常見的表示法有以下3種:順序表示、堆分配表示和塊鏈式表示。

把串存放在一片連續的儲存空間,即用順序式線性表儲存串,以串s=

「x1x

2…xn

」 為例,將其中的字元順序地放到陣列c[1…n](字元型)中的連續位置。

在串的順序儲存結構中,確定串的長度有兩種方法, 一種是在串的末尾加上乙個結束標記,如在c語言中定義串時,系統會在串值的最後自動加上『\0』作為結束標記。另一種表示方法是用乙個變數length存放串的長度,通常這種方法更為常用。

在採用靜態順序儲存表示的順序串中,在串的插入、連線、替換操作中,如果串的長度超過了maxlen,串會被截掉一部分。為了克服靜態分配的缺點,可以使用動態儲存分配表示串並實現串的基本操作。

採用堆分配儲存表示的串稱為堆串。堆串仍然採用一組位址連續的儲存單元,存放串中的字元,但堆串中的儲存空間是程式的執行過程中動態分配的。

用鏈結表來表示串,每個結點的結構為

其中,link域為指向下個結點的指標,而data域的最簡單情形就是單個字元。

訪問串中的乙個子串,可以從頭沿著鏈向後掃瞄,找到所希望的子串的開始元素,然後進一步沿著鏈得到子串的各後繼元素。顯然,這樣訪問子串的效率要比順序表示法低。

對於data域為單個字元的鏈結表示法, 儲存空間的利用率很低。如果link占用兩個字元位置,則每個節點中,只有13

的空間是用來儲存資料的,因此這種儲存法實際上很少被採用。為了提高空間利用率,可令data域存放串中的m個連續字元,即把串中每m個連續的字元分成一組,這樣即可把串分成多組,每組字串存放在一塊連續的空間中,並通過鏈與下一組相連。

方式一:

串的刪除操作:只要把被刪除的串全部變成「無用」符即可, 實現起來十分容易。但這樣做顯然要造成空間的浪費,而且降低訪問效率。此時的補救辦法是,每處理完乙個塊上的字元之後,檢查該塊是否已變成全「無用」的字元,若是,則將該塊從鍊錶中刪除;在刪除時,應找到被刪除塊的前導塊的鏈域,若能在處理過程中保留前導塊的位址,則刪除過程會變得容易。

串的插入操作:按照插入子串在乙個儲存塊中的位置及插入的字元個數,可有如下3種情形:

插入子串的元素個數小於或等於串中相應位置的「無用」符個數,此時可直接以插入的子串取代「無用」符,無須做任何修改工作。

若插入的子串在乙個塊中最後的乙個字元之後,則申請新塊裝入子串,鏈入插入點之後即可。

若插入的子串在乙個塊中首字元之後,最後乙個字元之前,則需要先申請乙個新塊,將插入點所在塊上的字元以插入點為界,將其後的字元裝入新塊,而將原來塊上的插入點之後的字元換成「無用」符;然後,申請新的塊,裝入要插入的字元,鏈入上述兩塊之間。

這種儲存方式,若串中沒有「無用符」,則儲存器利用率最大可達2/3。若經過若干次插入、刪除之後,儲存利用率會降低,最低可能降到1/6。

方式二:

將塊鏈式串轉換為普通字串,完成相應的操作後再轉換為塊鏈式串。

詳情請檢視【練習】順序串的實現及應用

詳情請檢視【練習】串的堆分配實現

詳情請檢視【練習】塊鏈串的實現

串的模式匹配也稱為子串的定位操作,即查詢子串在主串中出現的位置。設有主串s和子串t,如果在主串s中找到乙個與子串t相相等的串,則返回串t的第乙個字元在串s中的位置。其中,主串s又稱為目標串,子串t又稱為模式串。

主要包括兩種常用的模式匹配演算法,即樸素模式匹配演算法——bf演算法和改進演算法——kmp演算法

詳情請檢視【筆記】串的模式匹配演算法

線性代數及其應用 《線性代數及其應用》概念筆記

矩陣 乙個陣列。它的核心作用是它是線性方程組的一種判斷解和求解的方法。係數矩陣 線性方程的所有係數構成的乙個陣列。增廣矩陣 係數和引數共同構成的陣列。階梯型矩陣 每一行的第乙個不為零的元素的左邊及其所在列以下全為零。約束變元與自由變元 非零行的首個非零元為約束變元 基本變數 其他的都是自由變元 自由...

線性代數及其應用筆記

因為工作原因,重新複習線性代數,現做 線性代數及其應用 筆記,以備個人整理及複習所用。每個矩陣行等價於唯一的簡化階梯型矩陣 線性方程組相容的充要條件是增廣矩陣的最右列不是主元列。若方程組相容,則沒有自由變數,有唯一解。有自由變數,有無窮多解。向量方程和矩陣方程等價。重要的定理,見原書 矩陣和向量的運...

庫及其應用

庫及其應用 danny kalev發表於2004 12 27 16 11 06 1 何為 tuple?tuple 是乙個大小固定的異構物件集合。tuple 型別有很多有用的應用,比如封裝乙個函式的多個返回值以及模擬多個物件的同時賦值和比較。tuple 的大小是指它所包含的元素的個數。目前的 tupl...