資料結構與演算法 4 串

2022-07-31 18:15:18 字數 3183 閱讀 4702

字串簡稱串,是一種特殊的線性表,它的資料元素僅由乙個字元組成。

串(string)是由零個或多個字元組成的有限序列

\[s=' a_1a_2\cdots a_n '

\]因為串是資料元素型別為字元型的線性表,所以用於線性表的儲存方式仍適合與串。但是由於串中的資料元素是單個位元組,其儲存方式又有其特殊之處。

類似於線性表,可以用一組位址連續的儲存單元依次存放串中的各個字串行,利用儲存單元位址的順序表示串中字元的相鄰關係

#define maxlen 10

typedef struct

str;//可用str來定義該型別的結構體變數

特點:

當計算機按位元組(byte)為單位便位址時,乙個儲存單元剛好儲存乙個字元,串中相鄰的字元順序地儲存在位址相鄰的儲存單元中.

當計算機按字(例如1字32位)為單位便位址時,乙個儲存單元可以有4個位元組組成。此時順序儲存結構又有非緊湊格式緊湊格式兩種儲存方式。

1)非緊湊格式

s=「string structure」,計算機字長為32位(4個byte),使用非緊湊格式乙個位址只能儲存乙個字元,如圖5-1所示。優點是運算處理簡單,但缺點是儲存空間十分浪費。

2)緊湊格式

同樣儲存s=「string structure」,使用緊湊格式格式乙個位址能存四個字元,如圖5-2所示。緊湊儲存的優點是空間利用率高,缺點是對串中字元處理的效率低。

對於長度不確定的字串的輸入,若採用定長字串儲存就會產生這樣的問題:儲存空間定的大,而實際輸入字串長度小,則造成記憶體空間的浪費,反之,儲存空間定的小,而實際輸入字串長度大,則儲存空間不夠用。此時可採用鏈結儲存的方法。

用鍊錶儲存字串,每個結點有兩個域:乙個是資料域(data)和乙個指標域(next)。

其中資料域(data)–儲存串中的字元。指標域(next)–存放後繼結點的位址

以儲存s=「string structure」為例,鏈式儲存結構如圖所示。

優缺點:

由於字串的特殊性,用鍊錶存作為字串的儲存方式也不太實用,因此使用較少。

在實際應用中,往往要定義很多字串,並且各字串長度在定義之前又無法確定。在這種情況下,可以採用堆分配儲存(也稱為索引儲存),這是一種動態儲存結構。

開闢一塊位址連續的儲存空間,用於儲存各串的值,該儲存空間稱為"堆"(也稱自由儲存區)

另外建立乙個索引表,用來儲存串的名稱(name),長度(length)和該串在"堆"中儲存的起始位址(start)。

程式執行過程中,每產生乙個串,系統就從"堆"中分配一快大小與串的長度相同的連續的空間,用於儲存該串的值,並且在索引表中增加乙個索引項,用於登記該串的名稱、長度、和該串的起始位址。

設字串:

a=「red」

b=「yellow」

c=「blue」

d=「white」

用指標free指向堆中的未使用空間的首位址。索引表如圖5-5所示

考慮到對字串的插入和刪除操作,可能引起字串的長度變化,在「堆」中為串值的分配空間是,可預留適當的空間。這時,索引表的索引項應增加乙個域,用於儲存該串在「堆」中擁有的實際儲存單元的數量。當字串長度等於該串的實際儲存單元時,就不能對串進行插入操作。

帶長度的索引表的c語言描述:

#define maxlen 10

typedef struct

lnode

通過組成串的字元的編碼進行比較。字元編碼,即字元在對應字符集中的符號。

串相等條件:串長度相等

對應位置的字元相等

子串的定位操作通常稱作串的模式匹配(其中t稱為模式串)

樸素的意思就是最符合咱們樸素思維的演算法,從主串的第乙個字元開始與子串進行比對,如果相等則逐一比對後續字元;如果不等則從主串第二個字元開始匹配子串,直到發現全部相等的子串。

kmp模式匹配演算法詳解

核心思想:

利用已對比的主串&子串的資訊,控制子串j值的變化

從而減少不必要的回溯 字串的比對(i值不回溯,僅回溯j值),從而提高效率

作用:

特點:

應用場景:

概念:字串的字首&字尾

概念定義

例項字首

除了最後1個字元,乙個字串的全部頭部組合

s="abcd" 字首:』a『, 'ab', 'abc'

字尾除了第1個字元外,乙個字串的全部尾部組合

s="abcd" 字尾:'b', 'bc', 'bcd'

具體使用:

計算出子串(t串)各個位置的j值的變化

根據步驟1計算出的next陣列,將子串與主串進行模式匹配

資料結構與演算法(串)

引言 在上次佇列學習後,現在我們再學習串。主要包含kmp演算法,現在就開始資料結構與演算法的 串的學習。定義 串是由零個或者多個字元組成的有限序列,又叫字串。串的大部分操作我們曾經都實現過,這裡重點介紹kmp演算法。樸素模式匹配演算法是我們最容易思考到的一種普通演算法,其時間複雜度可以認為是o n ...

python資料結構與演算法(4)

資料結構 我們如何 python中的型別來儲存 個班的學 資訊?如果想要快速 的通過學 姓名獲取其資訊呢?實際上當我們在思考這個問題的時候,我們已經 到了資料結構。列表和字 典都可以儲存 個班的學 資訊,但是想要在列表中獲取 名同學的資訊 時,就要遍歷這個列表,其時間複雜度為o n 使 字典儲存時,...

資料結構與演算法(4)棧

後進者先出,先進者後出,就是典型的 棧 結構。從棧的操作特性上來看,棧是一種 操作受限 的線性表 只允許在一端插入和刪除資料。從功能上來說,陣列或鍊錶可以替代棧,但特定的資料結構是對特定場景的抽象,陣列或鍊錶暴露了太多的操作介面,操作上的確靈活自由,但使用時就比較不可控,自然也就更容易出錯。當某個資...