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 ...
資料結構 嚴蔚敏
最近一直想找一本純資料結構的書來學習,找來找去都沒有找到一本合適的書籍,相比之下國內的書籍之中,嚴蔚敏和吳偉民的還算是經典版了,很多國內其他資料結構教材都參考這本書的。但缺點是很多都是偽 對程式設計初學者來說有一些難度,甚至有些考研的同學來看這本書有很多還看不懂,並且裡面也有些容易迷惑人的地方。出於...
資料結構(嚴蔚敏)
說起為什麼重新拿起這本書,著實非常慚愧。是因為面試的時候,第乙個面試官面試完專案之後。第二面試官說我們就當聊聊天,考考資料結構,演算法就好了。結果以乙個問題就把我難住了,這個問題是 雜湊表是什麼?所以我打算花兩天的時間重新把這本書看一遍,並做下筆記,這次我一定會記住。目前,計算機已深入到社會生活的各...