版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第四章串
學(xué)時(shí):4學(xué)時(shí)
本章主要內(nèi)容:
1.串的有關(guān)概念及ADT定義;
2.串的三種存儲(chǔ)結(jié)構(gòu)急主要操作算法實(shí)現(xiàn);
3.串的兩種匹配算法。
本章重點(diǎn)難點(diǎn):
1.順序串和堆串兩種存儲(chǔ)結(jié)構(gòu);
2.串的KMP匹配算法;
3.Next[j]和nextval[i]的計(jì)算
4.1串類型的定義
4.2串的表示和實(shí)現(xiàn)
4.3串的模式匹配算法
4.1串類型的定義
串即字符串,是由零個(gè)或多個(gè)字符組成的有限序列,
是數(shù)據(jù)元素為單個(gè)字符的特殊線性表。
記為:a」(n>0)
Tnr
串名串值(用''括起來(lái)
隱含結(jié)束符
‘\0"即
[ASCII碼NUL,
若干術(shù)語(yǔ):
串長(zhǎng):串中字符的個(gè)數(shù)(n>0).n=0時(shí)稱為空串0。
空白串:由一個(gè)或多個(gè)空格符組成的串。
問(wèn):空串和空白串有無(wú)區(qū)別?
答:有區(qū)別。
空串(NullString)是指長(zhǎng)度為零的串;
而空白串(BlankString),是指包含一個(gè)或多個(gè)空白
字符'9(空格鍵)的字符串.
子串:串S中任意個(gè)連續(xù)的字符序列叫S的子串。
子串位置:子串的第一個(gè)字符在主串中的序號(hào)。
字符位置:字符在串中的序號(hào)。
串相等:串長(zhǎng)度相等,且對(duì)應(yīng)位置上字符相等。
“空串是任意串的子串;任意串s都是S本身的子串,
除S本身外,S的其他子串稱為S的真子串?!?/p>
串的抽象數(shù)據(jù)類型定義
ADTString{
Objects:D={ai|ai£CharacterSet,i=l,2V..,n,n>0}
Relations:Rl={<ai-l,ai>|ai-l,aiWD,i=2,??.,n)
functions:
fStrAssign(&T,chars)〃串賦值,生成值為chars的串T
最
小StrCompare(S,T)〃串比較,若S>T,返回值大于。…
操StrLength(S)〃求串長(zhǎng),即返回串S中的元素個(gè)數(shù)
作
子Concat(&T,SI,S2)//串連接,用T返回S1+S2的新串
集SubString(&Sub,S,pos,len)//求S中pos起長(zhǎng)度為len的子串
Index(S,T,pos)//子串定位函數(shù)(模式匹配),返回位置
Replace(&S,T,V)〃用子串V替換子串T
}ADTString
例1:設(shè)s=UAMASTUDENT%t='GOOD',
q='WORKER'。求:
StrLength(s)=14//返回子串T在pos
->U弘Q要
StrLength(t)=4
SubString(&sub,s,8,7)='STUDE
SubString(&sub,t,2,1)=OReplace(&S5T,V)
//用子串V換子串T
Index(s,6A5)=3
Index(s,t)=0(s中沒(méi)有
Replace(&s「STUDENT',q)=qAMAWORKER9
問(wèn)題:當(dāng)sAMASTUDEN「時(shí),
INDEX(s,'A',pos)=3,若想搜索后面那個(gè)N
怎么辦?
解答:INDEX(s,返回的只是“第一次”出現(xiàn)
的位置。
如果還要搜索后面的A,貝》pos變量要跟著變才行。
也就是說(shuō),要把得到的“第一次”位置再代入INDEX
(sJA"pos)函數(shù)中循環(huán)操作才行。
4.2串的表示和實(shí)現(xiàn)
首先強(qiáng)調(diào):串與線性表的運(yùn)算有所不同,是以“串的整體”作
為操作對(duì)象,例如查找某子串,在主串某位置上插入一個(gè)子串
等。串有三種機(jī)內(nèi)表示方法:
?定長(zhǎng)順序存儲(chǔ)表示
順序J——用一組地址連續(xù)的存儲(chǔ)單元存儲(chǔ)串值的字
存儲(chǔ)符序列,屬靜態(tài)存儲(chǔ)方式。
堆分配存儲(chǔ)表示
----用一組地址連續(xù)的存儲(chǔ)單元存儲(chǔ)串值的字
符序列,但存儲(chǔ)空間是在程序執(zhí)行過(guò)程中動(dòng)態(tài)
分配而得。
鏈?zhǔn)健龃膲K鏈存儲(chǔ)表示
存儲(chǔ)——鏈?zhǔn)椒绞酱鎯?chǔ)
定長(zhǎng)順序存儲(chǔ)特點(diǎn):用一組連續(xù)的存儲(chǔ)單元來(lái)存放串,
直接使用定長(zhǎng)的字符數(shù)組來(lái)定義,數(shù)組的上界預(yù)先給出,
故稱為靜態(tài)存儲(chǔ)分配。
例如:
#defineMaxstrlen255//用戶可用的最大串長(zhǎng)
typedefunsignedcharSString[Maxstrlen+1];
SStrings;//s是一個(gè)可容納255個(gè)字符的順序串。
注:
?一般用SString[O]來(lái)存放串長(zhǎng)信息(如pascal語(yǔ)言);
?C語(yǔ)言約定在串尾加結(jié)束符6\0\以利操作加速,但不
計(jì)入串長(zhǎng)
?若字符串超過(guò)Maxstrlen則自動(dòng)截?cái)唷?/p>
例:用順序存儲(chǔ)方式編寫求子串函數(shù)SubString(&Sub,S,pos,len)
poslen
StatusSubString(SString&sub9SStringS,intpos,intlen)
{if(pos<l||pos>S[0]||len<0||len>S[0]-pos+l)returnERROR;
//若pos和len參數(shù)越界,則告警
Sub[l.......len]=S[pos.......pos+len-1];
Sub[01=len:returnOK:
討論:想存放超長(zhǎng)字符串怎么辦?
改用動(dòng)態(tài)分配的一維數(shù)組----
堆分配存儲(chǔ)特點(diǎn):仍用一組連續(xù)的存儲(chǔ)單元來(lái)存放串,
但存儲(chǔ)空間是在程序執(zhí)行過(guò)程中動(dòng)態(tài)分配而得。
思路:利用malloc函數(shù)合理預(yù)設(shè)串長(zhǎng)空間。
特點(diǎn):若在操作中串值改變,還可以利用realloc函數(shù)
按新串長(zhǎng)度增加空間(即動(dòng)態(tài)數(shù)組概念)。
堆T的存儲(chǔ)結(jié)構(gòu)描述:
Typedefstruct{
char*ch;//若非空串,按串長(zhǎng)分配空間;否則ch=NULL
intlength;〃串長(zhǎng)度____________
}HString.T.ch
■T.length
泰山學(xué)院
例1:久建堆函數(shù)
StatusStrAssign(HString&T,char*chars)C是指針變量,可以自增!
事即每次后移一個(gè)數(shù)據(jù)單
{//生成一個(gè)串T,T值一串常量charyGo
if(T.ch)free(T.ch);空間
for(i=0,c=chars;;++k++c);//求chars的串長(zhǎng)度i
if(!i){T.ch=NULL;T.length=0;
else{
if(!(T.ch=(charw)malloc(i*sizeof(char))))
exit(OVERFLOW);
T.ch[0..i-l]=chars[0??i.m此處T.ch[0]沒(méi)有
用來(lái)裝串長(zhǎng),因?yàn)?/p>
T.length=i;另有T.length分
}
returnOK;
例2:?用“堆”方式編寫串插入函數(shù)
StatusStrinsert(HString&S,intpos,HStringT)
{//在串S的第pos個(gè)字符之前(包括尾部)插入串T
if(pos<l||pos>S.length+l)returnERROR;//pos不合法則告警
if(T.length){//只要串T不空,就需要重新分配S空間,以便插入T
if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))
exit(OVERFLOW);//若開(kāi)不了新空間,則退出
for(i=S.length-l;i>=pos-l;—i)S.ch[i+T.length]=S.chfi];
//為插入T而騰出pos之后的位置,即從S的pos位置起全部字符均后移
S.ch[pos-1...pos+T.length-2]=T.ch[O...T.length-l];//插入T,略/0
S.length+=T.length;//刷新S串長(zhǎng)度
}returnOK;
}//Strinsert
泰山學(xué)院
鏈?zhǔn)酱鎯?chǔ)特點(diǎn):用鏈表存儲(chǔ)串值,易插入和刪除。
法L鏈表結(jié)點(diǎn)的數(shù)據(jù)分量長(zhǎng)度取1(個(gè)字符)
A17------'IBI7--------"ICIT-----------HINULL
法2:鏈表結(jié)點(diǎn)(數(shù)據(jù)域)大小取n(例如n二4)
head一^ABCD”-------7FGH?——,I###NULL
討論:法1存儲(chǔ)密度為"2;法2存儲(chǔ)密度為9〃5=3/5,
顯然,若數(shù)據(jù)元素很多,用法2存儲(chǔ)更優(yōu)一稱為塊鏈結(jié)構(gòu)
塊鏈類型的定義
typedefstruct{〃其次定義用鏈?zhǔn)酱鎯?chǔ)的串類型
Chunk*head;//頭指針
Chunk氣ail;//尾指針
intcurLen;//結(jié)點(diǎn)個(gè)數(shù)
}Lstring;//串類型只用一次,前面可以不加Lstring
#defineCHUNKSIZE80〃每塊大小,可由用戶定義
typedefstructChunk{//首先定義結(jié)點(diǎn)類型
charch[CHUNKSIZE];//每個(gè)結(jié)點(diǎn)中的數(shù)據(jù)域
structChunk*next;//每個(gè)結(jié)點(diǎn)中的指針域
}Chunk;
4.3串的模式匹配算法
算法目的:確定主串中所含子串第一次出現(xiàn)的位置(定位)
定位問(wèn)題稱為串的模式匹配(PatternMatching),即子串定位運(yùn)
算,它是串處理系統(tǒng)中最重要的操作之一。
典型函數(shù)為Index(S,T,pos).
算法種類:
?BF算法(又稱古典的、經(jīng)典的、樸素的、窮舉的)
?KMP算?
單回溯,速度慢1
避免回溯,匹配速度快,
BF算法的實(shí)現(xiàn)一即編寫Index(S,T,pos)函數(shù)
例1:S=6ababcabcacbab5,T=6abcac\pos=l,
求:串T在串S中第pos個(gè)字符之后的位置。
BF算法設(shè)計(jì)思想:
?將主串S的第pos個(gè)字符和模式T的第1個(gè)字符比較,
若相等,繼續(xù)逐個(gè)比較后續(xù)字符;
若不等,從主串S的下一字符(pos+1)起,重新與T第一
個(gè)字符比較。
?直到主串S的一個(gè)連續(xù)子串字符序列與模式T相等。返回值
為S中與T匹配的子序列第一個(gè)字符的序號(hào),即匹配成功。
否則,匹配失敗,返回值0.
例2:S=6ababcabcacbab5,T=6abcac\求Index(S,T,5)
Intidt(SStringS,SStringT,intpos){\[pos=5|
i=pos;j=l;S=6ababcabcacbab9
while(i<=S[0]&&j<=T[0]){丁二'斗bca
if(S[i]==T[j]){++i,++j}〃繼續(xù)比較后續(xù)字符J
else{i=i-j+24j=l;}〃指針回溯至U下一首位,重新開(kāi)始匹配
if(j>T[OJ)returni-T[OJ;〃子串結(jié)束,說(shuō)明匹配成功
elsereturnO;
}//Index匹配成功后指針仍要回溯!因?yàn)橐祷氐?/p>
是被匹配的首個(gè)字符位置。
BF算法的時(shí)間復(fù)雜度
討論:
若n為主串長(zhǎng)度,為子串長(zhǎng)度,則串的BF匹配算法最壞的情
況下需要比較字符的總次數(shù)為=O(n*m)
一般的情況是:O(n+m)
推導(dǎo)方法:要從最好到最壞情況統(tǒng)計(jì)總的比較次
數(shù),然后取平均。為了解決這樣的情況,出現(xiàn)了更
加優(yōu)化的算法:
請(qǐng)看KMP算法!
KMP算法(特點(diǎn):速度快)
①KMP算法設(shè)計(jì)思想
②KMP算法的推導(dǎo)過(guò)程
③KMP算法的實(shí)現(xiàn)(關(guān)鍵技術(shù):計(jì)算next[j])
④KMP算法的時(shí)間復(fù)雜度
kMP算法
KMP算法的時(shí)間復(fù)雜度可以達(dá)到O(m+n)。
定義:模式串的next函數(shù)
fo當(dāng)j=1時(shí)〕
Max{k|1<k<j
next[j]二1\
且'P1P2…Pk-l'='Pj-k+l…Pj/}
1其它情況
intIndexKMP(SStringS,SStringT,intpos){
//1<pos<StrLength(S)
i=pos;j=1;
while(i<=S[0]&&jv=T[0]){
if(j=O||S[i]==
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《牛的繁殖技術(shù)》課件
- 污水處理多源數(shù)據(jù)融合-洞察分析
- 虛擬現(xiàn)實(shí)兼容性-洞察分析
- 炭疽疫苗毒株變異分析-洞察分析
- 游戲劇情制作與敘事設(shè)計(jì)-洞察分析
- 醫(yī)保年度工作總結(jié)范文(7篇)
- 托烷司瓊與藥物不良反應(yīng)-洞察分析
- 消費(fèi)升級(jí)與個(gè)性化需求-洞察分析
- 虛擬試戴技術(shù)應(yīng)用分析-洞察分析
- 醫(yī)生個(gè)人工作總結(jié)范文1500字(7篇)
- 三級(jí)醫(yī)院醫(yī)療設(shè)備配置標(biāo)準(zhǔn)
- 合法離婚協(xié)議書(2篇)
- 水輪發(fā)電機(jī)組大修質(zhì)量標(biāo)準(zhǔn)
- 項(xiàng)目主要技術(shù)方案計(jì)劃表
- 汽車零部件開(kāi)發(fā)質(zhì)量管理課件
- 20m29.6m30.4m20m鋼箱梁橋?qū)嵗O(shè)計(jì)內(nèi)容與表達(dá)
- 冀教版四年級(jí)上冊(cè)英語(yǔ)Unit 4單元測(cè)試卷(含聽(tīng)力音頻)
- 【真題】北京市西城區(qū)六年級(jí)語(yǔ)文第一學(xué)期期末試卷 2021-2022學(xué)年(有答案)
- VMWare Horizon7平臺(tái)集成指南
- 口腔??谱o(hù)理知識(shí)考核試題與答案
- 音響工作總結(jié)共3篇(劇院音響工作個(gè)人總結(jié))
評(píng)論
0/150
提交評(píng)論