學習 嚴蔚敏講資料結構筆記09

2021-06-14 13:28:43 字數 3033 閱讀 4255

1.2

串的表示和實現

如果在程式語言中,串只是作為輸入或輸出的常量出現,則只需儲存此串的串值,即字串行即可。但在多數非數值處理的程式中,串也以變數的形式出現。

一、串的定長順序儲存表示

二、串的堆分配儲存表示

三、串的塊鏈儲存表示

一、串的定長順序儲存表示

#define maxstrlen 255 //使用者可在255以內定義最大串長

typedef unsigned char sstring[maxstrlen+1];//0號單元存放串的長度

串的實際長度可在這個預定義長度的範圍內隨意設定,超過預定義長度的串值則被捨去,稱之為「截斷」。

例如:串的聯接演算法中需要三種情況處理:

10_002

status concat(sstring s1, sstring s2,  sstring &t)

else  if(s1[0] < maxstrlen)

else

return  uncut; }

按這種串的表示方法實現的串的運算時,其基本操作為「字串行的複製」。

二、串的堆分配儲存表示

typedef struct

hstring;

通常,c語言中提供的串型別就是以這種儲存方式實現的。系統利用函式malloc()和free()進行串值空間的動態管理,為每乙個新產生的串分配乙個儲存區,稱串值共享的儲存空間為「堆」c語言中的串以乙個空字元為結束符,串長是乙個隱含值。

這類串操作的實現演算法為:先為新生成的串分配乙個儲存空間,然後進行串值的複製。

三、串的塊鏈儲存表示

11_001

#define chunksize 80 //可由使用者定義塊大小

typedef struct chunk

chunk;

typedef struct

lstring;

資料域為字元佔1位元組,指標域為4位元組。儲存結構的儲存密度為1/5。

串值也可用鍊錶來儲存,由於串的資料元素是乙個字元,它只有8位二進位制數,因此用鍊錶儲存時,通常乙個結點中存放的不是乙個字元,而是乙個子串,例如:在編輯器系統中,整個文字編輯區可以看成是乙個串,每一行是乙個子串,構成乙個結點。即:同一行的串定長結構(80個字元),行和行之間用指標相聯接。

4.3串的模式匹配演算法

這是串的一種重要操作,很多軟體,若有「編輯」選單選項的話,則其中必有「查詢」子選單項。

首先,回憶一下串匹配(查詢)的定義:

index(s,t,pos)

初始條件:串s和t存在,t是非空串,1<=pos<=strlength(s)。

操作結果:若主串s中存在和串t值相同的子串返回它在主串s中第pos個字元之後第一次出現的位置;否則函式值為0。

下面討論以定長順序結構表示串時的幾種演算法。這裡有三種演算法: 1.

簡單演算法 2.

首尾匹配演算法 3.

kmp(d.e.knuth,v.r.pratt,j.h.morris)演算法 1.

簡單演算法

11_002

int index(sstring s, sstring t, int pos)

else

if(i  > t[0])

return  i - t[0];

else

return  0;

} }

二、首尾匹配演算法

先比較模式串的第乙個字元,在比較模式串中的最後乙個字元,最後比較模式串中從第二個到第n-1個字元。

11_003

int index_fl(sstring s, sstring t, int  pos)

else 

if(s[i  + tlength - 1] != patendchar)

else

if(j  == tlength)

else }

} return  0; }

四、kmp(d.e.knuth,v.r.pratt, j.h.morris)演算法

kmp演算法的時間複雜度可以達到o(m+n)

當s[i]<>t[j]時,

已經得到的結果:s[i-j+1…i-1] == t[1…j-1]

若已知t[1…k-1] == t[j-k+1 … j-1]

則有s[i-k+1…i-1] == t[1…k-1]

定義模式串next函式

12_001

int index_kmp(sstring s, sstring t, int  pos)

//繼續比較後繼字元

else }

if(j  > t[0])

else

}//index_kmp

求next函式值的過程是乙個遞推過程,分析如下:

已知:next[1]=0;

假設:next[j]=k;又t[j]=t[k];則next[j+1]=k+1;

若:t[j] <> t[k] 則需往前回朔,檢查t[j]==t[?]

這實際上也是乙個匹配的過程,不同在於:主串和模式串是一同乙個串。

10_002

void get_next(sstring &t, int  &next)

else }

}//get_next

還有一種特殊情況需要考慮:

例如:s=』aaabaaabaaabaaabaaab』

t=』aaaab』

next[j]=01234

nextval[j]=00004

12_003

void get_nextval(sstring &t, int  &nextval)

else }

}//get_nextval

1.熟悉串的七種基本操作的定義,並能利用這些基本操作來實現串的其它各種操作方法。 2.

熟練掌握在串的定長順序儲存結構上實現串的各種操作方法。 3.

掌握串的堆儲存結構以及在其上實現串的基本方法。 4.

理解串匹配的kmp演算法,熟悉next函式的定義,學會手工計算給定模式串的next函式值和改進的next函式值。 5.

了解串操作的例子

學習 嚴蔚敏講資料結構筆記25

10.5 歸併排序 歸併排序的基本思想是 將兩個或兩個以上的有序子串行 歸併 為乙個有序序列。在內部排序中,通常採用的是2 路歸併排序。即 將兩個位置相鄰的有序子串行 43 001 void merge elem sr,elem tr,int i,int m,int n if i m tr k,n ...

資料結構 嚴蔚敏

最近一直想找一本純資料結構的書來學習,找來找去都沒有找到一本合適的書籍,相比之下國內的書籍之中,嚴蔚敏和吳偉民的還算是經典版了,很多國內其他資料結構教材都參考這本書的。但缺點是很多都是偽 對程式設計初學者來說有一些難度,甚至有些考研的同學來看這本書有很多還看不懂,並且裡面也有些容易迷惑人的地方。出於...

資料結構(嚴蔚敏)

說起為什麼重新拿起這本書,著實非常慚愧。是因為面試的時候,第乙個面試官面試完專案之後。第二面試官說我們就當聊聊天,考考資料結構,演算法就好了。結果以乙個問題就把我難住了,這個問題是 雜湊表是什麼?所以我打算花兩天的時間重新把這本書看一遍,並做下筆記,這次我一定會記住。目前,計算機已深入到社會生活的各...