版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第6講
字符串、數(shù)組和特殊矩陣第6講
字符串、數(shù)組和特殊矩陣6.1字符串6.2字符串的模式匹配6.3
數(shù)組
6.4特殊矩陣
6.5
稀疏矩陣
6.1字符串串(或字符串)也是一個(gè)線性表,是由零個(gè)或多個(gè)字符組成的有限序列,一般記為:s=“a0a1…an-1”(n≥0)其中,s稱為串名;用雙引號(hào)括起來(lái)的字符序列稱為串值;每個(gè)ai都是字符。串的長(zhǎng)度:n(≥0)為串的長(zhǎng)度,表示串中字符的個(gè)數(shù),其中表示方式中的""不是成員,是定界符。1、概念空串:當(dāng)n=0時(shí),該串稱為空串,表示為""??崭翊阂粋€(gè)串中有一個(gè)或多個(gè)空格組成,如:"□
"、"□
□"子串:一個(gè)串中任何連續(xù)的字符序列都稱為該串的子串。如:s="abcdef"則:"abc"、"cd"、"def"、"f"
都是s的子串。當(dāng)然,"abcdef"也是s的子串,""空串也是s的子串。主串:s相對(duì)于子串而言稱為主串。串相等:兩個(gè)串的長(zhǎng)度相等且對(duì)應(yīng)位置上的子符都相同。子串在主串中的位置:子串的第一個(gè)字符在主串中首次出現(xiàn)的位置來(lái)表示。求串長(zhǎng)復(fù)制串聯(lián)合兩個(gè)串比較兩個(gè)串的大小插入一個(gè)子串刪除一個(gè)子串模式匹配(檢查一個(gè)串是否是另一個(gè)串的子串)2、基本運(yùn)算3、串的順序存儲(chǔ)結(jié)構(gòu)及運(yùn)算實(shí)現(xiàn)
串的順序存儲(chǔ)——順序串(1)采用數(shù)組方式存儲(chǔ)
str數(shù)組:(2)數(shù)據(jù)類型定義0'a''b''c''d''e''f'…12345…MAX-1用順序表的形式表示:#defineMAX100typedefstruct{charstr[MAX];intlength;/*串長(zhǎng)*/}seqstring;采用C語(yǔ)言的表示形式:#defineMAX100charstr[MAX];用
'\0'
作為串的結(jié)束標(biāo)記,則串的長(zhǎng)度最大為MAX-1。串的基本運(yùn)算(1)求串的長(zhǎng)度intstrlen(chars[]){inti;for(i=0;s[i]!='\0';i++);returni;}0'a''b''c''d''e''\0'…12345…MAX-1intstrlen(chars[]){char*p=s;while(*p!='\0')p++;returnp-s;}(2)復(fù)制一個(gè)串voidstrcpy(chart[],chars[])/*s串到t串*/{inti;for(i=0;s[i];i++)t[i]=s[i];t[i]='\0';}(3)聯(lián)結(jié)兩個(gè)串在某個(gè)串的基礎(chǔ)上作聯(lián)結(jié)設(shè)聯(lián)結(jié)后的串長(zhǎng)不超過(guò)MAX-1,則在s中形成聯(lián)結(jié)串;如超過(guò)MAX-1,則在t中適當(dāng)位置截?cái)唷?'a''b''c''\0'…123…MAX-1s0'x''y''\0'…12…MAX-1tvoidstrcat(chars[],chart[]){inti,j;for(i=0;s[i];i++);/*s串掃描到空字符*/for(j=0;t[j]&&i<MAX-1;j++,i++)s[i]=t[j];s[i]='\0';}(3)聯(lián)結(jié)兩個(gè)串重新申請(qǐng)空間,存放聯(lián)結(jié)之后的串新申請(qǐng)的空間:0'a''b''c''\0'…123…MAX-1s0'x''y''\0'…12…MAX-1tchar*strcat(chars[],chart[]){intns,nt;char*p;ns=strlen(s);nt=strlen(t);p=(char*)malloc(ns+nt+1);strcpy(p,s);strcpy(p+ns,t);returnp;}0…123…strlen(s)+strlen(t)p4(4)串的比較兩個(gè)串相等:長(zhǎng)度相等對(duì)應(yīng)位置上的字符都相等比較算法(s與t串比較):依次比較對(duì)應(yīng)位置上的字符,兩者都未結(jié)束,找到第一個(gè)不相等的字符(s[i]≠t[i])若s[i]>t[i],返回s[i]-t[i](正數(shù)),則稱s>t若s[i]<t[i],返回s[i]-t[i](負(fù)數(shù)),則稱s<t其中一個(gè)字符串比較結(jié)束(s[i]≠t[i])若s[i]=='\0',有s[i]<t[i],返回s[i]-t[i](負(fù)數(shù)),則稱s<t若t[i]=='\0',有t[i]<s[i],返回s[i]-t[i](正數(shù)),則稱s>t兩串字符都比較結(jié)束(s[i]=‘\0’且t[i]='\0')有s[i]=='\0',t[i]=='\0',返回s[i]-t[i]
(0),則稱s==t算法實(shí)現(xiàn)intstrcmp(chars[],chart[]){inti;i=0;while(s[i]&&t[i]&&s[i]==t[i])i++;returns[i]-t[i];}s[i]&&s[i]==t[i]6.2字符串的模式匹配模式匹配:即子串在主串中定位運(yùn)算概念設(shè)有兩個(gè)串s和t,檢查串t是否是s的子串,這種運(yùn)算稱為模式匹配。其中:s串稱為正文(目標(biāo)串),t串稱為模式串。匹配結(jié)果(順序串)匹配成功:返回t子串在s中第一次出現(xiàn)的起始位置(下標(biāo))匹配失?。悍祷?1BF算法(Brute-Froce)
即樸素的模式匹配算法(1)BF算法的基本思想如:目標(biāo)串
s=“abbaba”,模式串t=“aba”。匹配結(jié)果:3設(shè):i指示目標(biāo)串s當(dāng)前待比較的字符位置;j指示模式串t當(dāng)前待比較的字符位置。BF算法的模式匹配過(guò)程示意圖i=0開(kāi)始i=1開(kāi)始i=2開(kāi)始i=3開(kāi)始結(jié)果為3形參:兩個(gè)順序串返回:如出現(xiàn)送出起始位置下標(biāo)如不出現(xiàn)送出-1(2)順序串的BF模式匹配算法實(shí)現(xiàn)intBFindex(chars[],chart[]){inti,j,k;/*i為s串下標(biāo),j為t串下標(biāo),k為s串中比較時(shí)用的下標(biāo)*/for(i=0;s[i];i++)/*掃面s串*/{/*從s串下標(biāo)為i的字符開(kāi)始與t串字符依次比較*/for(j=0,k=i;t[j]&&s[k]==t[j];k++,j++);if(t[j]=='\0')/*若t串被比較到空字符,則匹配成功*/returni;}return-1;}6.3數(shù)組1、概念一維數(shù)組由n(n≥1)個(gè)元素構(gòu)成的有限序列也是一個(gè)線性表,但該線性表不是空表,通常稱為向量。如:(a0,a1,
a2,…an-1)n≥16.3數(shù)組二維數(shù)組也是線性結(jié)構(gòu),是一種線性表的線性表該線性表是由m(m≥1)個(gè)元素構(gòu)成而每個(gè)元素又是有n(n≥1)個(gè)元素構(gòu)成的線性表如:A(a0,a1,a2,…am-1)
其中:ai=(ai0,ai1,ai2,…ain-1)
通常A表示成:A=(aij)m×n()()()()()()()()()其中:數(shù)據(jù)元素類型相同三維數(shù)組
A=(aijk)m×n×p行列2、運(yùn)算對(duì)于二維數(shù)組來(lái)說(shuō),只有對(duì)數(shù)組元素的訪問(wèn)和修改,沒(méi)有刪除與插入運(yùn)算。如:A=(aij)m×nB=(bij)m×nC=A+Bcij=aij+
bij3、數(shù)組的存儲(chǔ)結(jié)構(gòu)——采用順序存儲(chǔ)實(shí)現(xiàn)(1)一維數(shù)組
A=(a0,a1,
a2,…an-1)設(shè)ai為int型地址:1000a0a1a2…a1的地址=1004=a0的地址+(1-0)×4a2的地址=1008=a0的地址+(2-0)×4…………ai的地址=1000+4i=a0的地址+(i-0)×4若:a0的地址=LOC(a0)ai的地址=LOC(ai)元素所占字節(jié):l則:LOC(ai)=LOC(a0)+(i-0)*l3、數(shù)組的存儲(chǔ)結(jié)構(gòu)——采用順序存儲(chǔ)實(shí)現(xiàn)(2)二維數(shù)組
兩種存儲(chǔ)方式:()()()()()()()()()以行為主序(行優(yōu)先)——C采用以列為主序(列優(yōu)先)——FORTRAN采用a00a01…a02a10a11…a12a20a21…a220行1行2行a00a10…a20a01a11…a21a02a12…a220列1列2列問(wèn)題:已知二維數(shù)組datatypea[m][n];若a00
的地址為:LOC(a00)=LOC(a[0][0])每個(gè)元素所占字節(jié):l=sizeof(datatype)如何確定
LOC(aij)=LOC(a[i][j])的值?分析:二維數(shù)組以行為主序存放方法:假設(shè)a00
是第1個(gè)元素,求aij前有k各元素?(1)前面0行~i-1行所有元素的個(gè)數(shù):k1=i*n(2)i行上aij前面有元素?cái)?shù):k2=j(3)aij之前共有元素?cái)?shù):k=k1+k2=i*n+j(4)則:LOC(aij)=LOC(a00)+(i*n+j)*lj列i行思考:若從a11開(kāi)始存放,已知LOC(a11),求LOC(aij)?二維數(shù)組以列為主序存放方法:假設(shè)a00
是第1個(gè)元素,求aij前有k各元素?(1)前面0列~i-1列所有元素的個(gè)數(shù):k1=j*m(2)第j列上aij前面有元素?cái)?shù):k2=i(3)aij之前共有元素?cái)?shù):k=k1+k2=j*m+i(4)則:LOC(aij)=LOC(a00)+(j*m+i)*lj列j行思考:若從a11開(kāi)始存放,已知LOC(a11),求LOC(aij)?例:有一5×4的矩陣A,按行優(yōu)先存儲(chǔ)(1)已知:LOC(a00)=1000,l=sizeof(a00)=3
求:LOC(a42)=?
答:
LOC(a42)=1000+(4*4+2)*3=1054(2)已知:LOC(a00)=1000,LOC(a42)=1054
求:LOC(a33)=?
答:
1054=1000+(4*4+2)*l
∴l(xiāng)=sizeof(a00)=3∴LOC(a33)=1000+(3*4+3)*3=10456.4特殊矩陣的壓縮存儲(chǔ)
矩陣是n×n的方陣,包括:對(duì)稱矩陣、三角矩陣、對(duì)角矩陣等。以主對(duì)角線對(duì)稱1、對(duì)稱矩陣的壓縮存儲(chǔ)
即:
aij=aji采用一維數(shù)組以行為主序存儲(chǔ)下三角部分a00a10a20a11a21a22…0行1行2行1、對(duì)稱矩陣的壓縮存儲(chǔ)如下對(duì)稱矩陣壓縮存儲(chǔ)一維數(shù)組最大元素個(gè)數(shù)至少是多少?下三角元素個(gè)數(shù):1+2+3+…+n=問(wèn)題:
對(duì)于二維數(shù)組A來(lái)講,都是以行號(hào)i(0≤i<n-1),列號(hào)j(0≤j<n-1)來(lái)訪問(wèn)aij的,則:當(dāng)用一維數(shù)組B壓縮存儲(chǔ)A時(shí),如何根據(jù)(i,j)去找aij對(duì)應(yīng)的元素B[k]呢?如何根據(jù)(i,j)判斷元素在二維數(shù)組中的位置?
i=j(luò)對(duì)角線處i<j上三角陣處i>j下三角陣處必須給出:
k=f(i,j)(1)先計(jì)算(i,j)位置上放的是下三角陣中的第幾個(gè)元素?
0行~i-1行共存在B中的元素有:
m1=1+2+3+…i=i(i+1)/2
i行存到B中的元素有:
m2=j+1
由此:aij是存到
B中的第m個(gè)元素:
m=m1+m2=
i(i+1)/2+(j+1)
則:矩陣A中aij在數(shù)組B中的下標(biāo):
k=m-1=
i(i+1)/2+j
推導(dǎo):k=f(i,j)(2)而對(duì)上三角陣中的元素aij
只需存取下三角陣中aji
對(duì)應(yīng)的B[k]
故:對(duì)稱矩陣的壓縮存儲(chǔ)有
k=i(i+1)/2+ji≥jk=j(j+1)/2+ii<j推導(dǎo):k=f(i,j)2、三角矩陣的壓縮存儲(chǔ)三角矩陣:上三角矩陣、下三角矩陣一般情況下,常數(shù)C為0(1)下三角矩陣aij=0i<j時(shí)可能不為0i≥j時(shí)下三角部分以行優(yōu)先壓縮存儲(chǔ)到一維數(shù)組B中,B的最大元素個(gè)數(shù)至少為:n(n+1)/2若aij對(duì)應(yīng)B[k],則:
k=i(i+1)/2+ji≥j若
i<j時(shí),aij=0(2)上三角矩陣aij=0i>j時(shí)可能不為0i≤j時(shí)上三角部分以行優(yōu)先壓縮存儲(chǔ)到一維數(shù)組B中,B的最大元素個(gè)數(shù)至少為:n(n+1)/2若aij對(duì)應(yīng)B[k],則:
k=i.n-i(i-1)/2+j-ii≤j若
i>j時(shí),aij=0推導(dǎo)k=f(i,j)計(jì)算(i,j)位置上放的是上三角陣中的第幾個(gè)元素?
0行~i-1行共存在B中的元素有:
m1=i.n-(1+2+3+…(i-1))=i.n-i(i-1)/2
i行存到B中的元素有:
m2=(j+1)-i=j-i+1由此:aij是存到
B中的第m個(gè)元素:
m=m1+m2=
i.n-i(i-1)/2+j-i+1則:矩陣A中aij在數(shù)組B中的下標(biāo):
k=m-1=
i.n-i(i-1)/2+j-i推導(dǎo):k=f(i,j)6.5稀疏矩陣矩陣Am×n非0元素很少,分布無(wú)規(guī)律,稱為稀疏矩陣。若非0元素的個(gè)數(shù)為t,總元素個(gè)數(shù)為m*n
則當(dāng)
f=t/(m*n)≤5%時(shí)1、三元組順序存儲(chǔ)(1)存儲(chǔ)思想只存非零元素的行號(hào)、列號(hào)和對(duì)應(yīng)元素值,按行優(yōu)先存儲(chǔ)到數(shù)組中去。021
042
105
158
313
351
ijv012345
三元組存儲(chǔ)結(jié)構(gòu):(2)數(shù)據(jù)類型定義假設(shè):矩陣元素類型int
三元組最大元素?cái)?shù)定義
#defineMAX100三元組一個(gè)結(jié)點(diǎn)類型typedefstruct{inti,j;intv;}TripletNode;
其中:i—行號(hào)
j—列號(hào)
v—矩陣元素值三元組順序存儲(chǔ)類型typedefstruct{intmu,nu,tu;TripletNodedata[MAX];}TripletList;
其中:mu—矩陣行數(shù)
nu—矩陣列數(shù)
tu—非0元素的個(gè)數(shù)約定:三元組元素按行優(yōu)先存儲(chǔ)(3)運(yùn)算實(shí)現(xiàn)把一個(gè)稀疏矩陣轉(zhuǎn)化為三元組存儲(chǔ)voidMatoTri(inta[][MAX],intm,intn,TripletList*b){inti,j,k=0;/*k為三元組下標(biāo)*/for(i=0;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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度挖機(jī)操作員任用合同范本大全集8篇
- 2024年體育場(chǎng)館小賣部承包管理與運(yùn)營(yíng)服務(wù)合同3篇
- 2024年信息安全應(yīng)急預(yù)案編制與演練服務(wù)合同3篇
- GB/T 45000-2024表面活性劑蔗糖脂肪酸酯的組成分析液相色譜法
- 2024年度文員企業(yè)創(chuàng)新項(xiàng)目支持合同3篇
- 2024年新材料研發(fā)項(xiàng)目投資咨詢合同模板3篇
- 餐飲管理合同
- 2024年度家居建材代理合作協(xié)議合同范本3篇
- 2024年度紙類包裝制品環(huán)保標(biāo)識(shí)認(rèn)證執(zhí)行合同3篇
- 2024年度城市軌道交通外架工勞務(wù)分包及隧道作業(yè)合同3篇
- 血液系統(tǒng)疾病病人常見(jiàn)癥狀體征護(hù)理
- [北京]輸變電工程標(biāo)準(zhǔn)工藝應(yīng)用圖冊(cè)(圖文并茂)
- 海域使用分類體系(全)
- 魯教版必修一第二單元第二節(jié)大氣運(yùn)動(dòng)——熱力環(huán)流(共28張PPT)
- 解除限制消費(fèi)申請(qǐng)書
- 預(yù)制箱梁常見(jiàn)問(wèn)題以及處理方案
- 《建筑施工現(xiàn)場(chǎng)環(huán)境與衛(wèi)生標(biāo)準(zhǔn)》(JGJ146)
- 安徽省中小型水利工程施工監(jiān)理導(dǎo)則
- 標(biāo)準(zhǔn)鋼號(hào)和中國(guó)鋼號(hào)對(duì)照表.doc
- 汽車整車廠和動(dòng)力總成廠房火災(zāi)危險(xiǎn)性分類
- 7實(shí)用衛(wèi)生統(tǒng)計(jì)學(xué)總-國(guó)家開(kāi)放大學(xué)2022年1月期末考試復(fù)習(xí)資料-護(hù)理本復(fù)習(xí)資料
評(píng)論
0/150
提交評(píng)論