數(shù)據(jù)結(jié)構(gòu)(自考) 課件 第3、4章 棧和隊列、數(shù)組廣義表和串_第1頁
數(shù)據(jù)結(jié)構(gòu)(自考) 課件 第3、4章 棧和隊列、數(shù)組廣義表和串_第2頁
數(shù)據(jù)結(jié)構(gòu)(自考) 課件 第3、4章 棧和隊列、數(shù)組廣義表和串_第3頁
數(shù)據(jù)結(jié)構(gòu)(自考) 課件 第3、4章 棧和隊列、數(shù)組廣義表和串_第4頁
數(shù)據(jù)結(jié)構(gòu)(自考) 課件 第3、4章 棧和隊列、數(shù)組廣義表和串_第5頁
已閱讀5頁,還剩137頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

全國高等教育自學(xué)考試指定教材

計算機及應(yīng)用專業(yè)(專科段)數(shù)據(jù)結(jié)構(gòu)第三章棧和隊列學(xué)習(xí)目標掌握棧和隊列的邏輯定義、特點及基本操作,了解它們的邏輯表示方法及使用場掌握棧的兩種存儲方式及各自的特點,掌握兩種方式下基本操作的實現(xiàn)及復(fù)雜度分析掌握隊列的兩種存儲方式及各自的特點,掌握兩種方式下基本操作的實現(xiàn),重點掌握循環(huán)隊列的實現(xiàn)及復(fù)雜度分析了解線性表與棧及隊列的關(guān)系靈活運用棧和隊列的基本操作,設(shè)計算法解決與此相關(guān)的實際問題本章主要內(nèi)容棧12棧和隊列的應(yīng)用3隊列棧和隊列是線性表的兩個經(jīng)典特例,它們都是操作受限的線性表,即操作的位置需要滿足各自的條件因為這些條件的特殊性,使得實現(xiàn)各自的操作時過程簡捷,效率更高第一節(jié)

棧棧是一種特殊的線性表,它的特殊性體現(xiàn)在操作的位置上。在含n個元素的線性表中進行插入或刪除時,操作位置可以有n+1個或n個當將操作位置限定在線性表的同一端時,得到的數(shù)據(jù)結(jié)構(gòu)就是棧它是一種受限的線性表棧的定義及其基本操作定義3.1棧(stack)是限定僅在一端進行插入和刪除的線性表能進行插入和刪除的這一端稱為棧頂,線性表的另一端稱為棧底在棧頂插入一個元素稱為入棧(push)、進?;驂簵#瑥臈m攧h除一個元素稱為出棧(pop)或退棧棧的表示將棧S表示為:S=(a0,a1,…,an-1)

通常指定an-1一端為棧頂,a0一端是棧底棧中元素個數(shù)n稱為棧的長度,當n=0時,稱為空棧棧具有后進先出(LIFO,LastInFirstOut)的特性只要棧不空,就允許出棧只要棧不滿,就允許入棧當沒有其他的特殊限制時,對于同一個入棧序列,可能會得到很多個合理正確的出棧序列示例例3.1設(shè)有5個元素1,2,3,4,5依次入棧,以push(x)表示x入棧,pop(x)表示x出棧,試寫出得到出棧序列2,1,4,3,5的操作過程操作過程為push(1),push(2),pop(2),pop(1),push(3),

push(4),pop(4),pop(3),push(5),pop(5)棧的基本操作示例例3.2依次讀入數(shù)據(jù)元素序列a,b,c,d,e,f,g并入棧。下列選項中,不可能是出棧序列的是A.d,e,c,f,b,g,aB.c,d,b,e,f,a,gC.e,f,d,g,c,b,aD.f,e,g,d,a,c,b答案為D示例例3.3元素a,b,c,d,e依次進入初始為空的棧中,在所有可能的出棧序列中,以元素d開頭的序列個數(shù)是A.3 B.4 C.5 D.6

答案為B棧的存儲及其實現(xiàn)棧有兩種主要的存儲方式,分別是順序存儲和鏈式存儲順序存儲方式使用數(shù)組保存棧元素,得到的是順序棧鏈式存儲方式使用單鏈表保存棧元素,得到的是鏈式棧順序棧及其實現(xiàn)在順序棧中,棧中的元素保存在一維數(shù)組中,將棧底定義在數(shù)組下標為0的位置同時使用一個變量標記棧頂?shù)奈恢?,即棧頂位置棧頂位置也稱為棧頂指針順序棧的定義typedefintELEMType; //以int類型為例typedefstruct{ ELEMTypeelement[maxSize]; //maxSize是數(shù)組最大容量 //已定義的常量 inttop; //棧頂位置}SeqStack;棧頂位置top的兩種定義方式本書采用(a)的方式相應(yīng)操作的實現(xiàn)入棧入棧時,新元素放在element[top]處,然后top加1第1個元素入棧時放在數(shù)組下標為0的位置因為數(shù)組空間有限,最大容量是maxSize,所以入棧時需要判定棧不能是滿的出棧出棧時,需要先將top值減1,然后將element[top]處的值通過參數(shù)x返回出棧時需要判定棧不是空的效率top的值既是保存下一個入棧元素的位置,也是棧中所含元素個數(shù)的計數(shù)器因為棧的入棧操作及出棧操作都在棧頂進行,所以入棧及出棧時都不需要移動棧中已有的元素,故時間復(fù)雜度都是O(1)判定棧空及棧滿等操作的時間復(fù)雜度也是O(1)對頂棧數(shù)組的兩個端點分別作為兩個棧的棧底左側(cè)棧占用數(shù)組0到k的單元,棧頂在k+1位置右側(cè)棧占用數(shù)組m-1到h的單元,棧頂在h-1位置此時必須滿足k<h,才能保證兩個棧不會重疊棧S1入棧時,棧頂值增大,出棧時棧頂值減小棧S2剛好相反,入棧時棧頂值減小,出棧時棧頂值增大鏈式棧所謂的鏈式棧,可以看作是一個僅在表頭位置進行操作的單鏈表將頭指針所指的這一端作為棧頂,表尾一端作為棧底入棧操作及出棧操作都可以通過頭指針完成。所以,在鏈式棧中,可以只定義頭指針,尾指針及頭結(jié)點都可以不定義鏈式棧的定義typedefintELEMType;typedefstructnode{

ELEMTypedata; structnode*next;}LinkedStackNode;typedefLinkedStackNode*LinkedStack; //鏈式棧初始化棧初始時是個空棧,所以指向棧頂?shù)闹羔樫x值NULL出棧僅當棧不為空時才能執(zhí)行出棧操作,所以pop函數(shù)中要先判斷棧不為空出棧后,將棧頂元素的值通過x返回給調(diào)用者元素所占用的空間要釋放掉清空棧及判棧空入棧入棧時,需要創(chuàng)建一個新結(jié)點,并將新結(jié)點插入在棧頂位置順序棧與鏈式棧的比較實現(xiàn)順序棧和鏈式棧的所有操作都只需要常數(shù)時間,因此棧的兩種實現(xiàn)方式的優(yōu)劣僅體現(xiàn)在它們的存儲效率上順序棧需要預(yù)先申請一個固定長度的一維數(shù)組,并自始至終全部占用,當棧中元素個數(shù)相對較少時,空間浪費較大鏈式棧的長度雖然可變,但是每個元素都需要一個指針域,這又產(chǎn)生了結(jié)構(gòu)性空間開銷棧與函數(shù)調(diào)用棧是保存調(diào)用信息的最佳結(jié)構(gòu)系統(tǒng)內(nèi)部會開辟一個函數(shù)調(diào)用棧用來保存函數(shù)在調(diào)用過程中所需要的一些信息第二節(jié)

隊列隊列也是一種特殊的線性表,其特殊性也體現(xiàn)在操作的位置上它具有優(yōu)先的特性,即先來的先得到服務(wù)這種先來先服務(wù)的特性稱為先進先出(FirstInFirstOut),簡稱FIFO隊列的定義及其基本操作定義3.2隊列(queue)是只能在表的一端插入、在另一端刪除的線性表能進行插入的一端稱為隊列尾,簡稱隊尾;能進行刪除的一端稱為隊列頭,簡稱隊頭在隊尾插入元素稱為入隊(enqueue),從隊頭刪除元素稱為出隊(dequeue)仍然可以沿用線性表的方法來表示隊列,隊列Q可以表示為 Q=(a0,a1,…,an-1)a0稱為隊頭元素,an-1稱為隊尾元素,元素個數(shù)n稱為隊列長度當給定隊列的入隊序列后,僅能得到一個出隊序列,而且是與入隊序列完全相同的序列。這是由隊列先進先出的特性決定的隊列的定義typedefintELEMType;typedefstruct{ ELEMTypeelement[maxSize]; intfront,rear;}Queue;隊列的操作定義隊列的存儲及實現(xiàn)與線性表及棧一樣,隊列也有兩種實現(xiàn)方式,分別得到順序隊列和鏈式隊列順序隊列使用一個一維數(shù)組A(下標從0到n-1)來保存隊列,假定隊列中含有m(m≤n)個元素選擇A[0]作為隊頭,那么A[m-1]就是隊尾當出隊時,隊頭A[0]從數(shù)組中刪除,此時要依次將后面的m-1個元素均前移一個位置這種情況下出隊操作的時間開銷是O(m)存儲結(jié)構(gòu)現(xiàn)在交換隊頭和隊尾的位置,選擇A[m-1]是隊頭,那么A[0]是隊尾入隊時,隊列中原有的m個元素均需后移一個位置,騰出A[0]的位置放置新元素此時入隊操作的時間開銷將為O(m)存儲結(jié)構(gòu)可以使用變量front指示隊頭位置,使用變量rear指示隊尾位置稱front為隊頭指針,rear為隊尾指針表示的是數(shù)組下標通常,front指示的是隊頭元素所在的位置,rear指示的是隊尾元素后面的空位置按照慣例,還是將第一個入隊的元素保存在數(shù)組下標0的位置入隊的新元素放置到所有元素的后面經(jīng)過若干次入隊、出隊操作后,含m個元素的隊列的示意圖如下所示,其中陰影部分表示隊列中的元素實際占用的數(shù)組單元

a0…am-1

↑front

↑rear

當再進行若干次入隊操作后,rear會到達數(shù)組的末尾,即最后一個下標位置。之后再進行入隊操作時,導(dǎo)致數(shù)組下標越界。但數(shù)組的前半段可能會因出隊操作而有空閑的單元

x…y

↑front

↑rear可以重復(fù)利用數(shù)組中前面的空閑單元保存后續(xù)入隊的元素…v

……u…

↑rear

↑front

示例設(shè)隊列保存在最大容量為7的數(shù)組A中,從空隊列開始,依次執(zhí)行下列各步操作,分別畫出得到的隊列示意圖依次將5,12,9,37入隊列將5,12依次出隊列,并依次將25,8入隊列將16入隊列,再將9出隊列,再將7,4入隊列循環(huán)隊列順序隊列都實現(xiàn)為循環(huán)隊列在循環(huán)隊列中,入隊操作會涉及到隊尾rear值的變化,rear=(rear+1)%n,出隊操作會涉及到隊頭front值的變化,front=(front+1)%n,其中n是數(shù)組的大小可以把這個數(shù)組想象成一個首尾相接的圓環(huán),A[n-1]的后面是A[0]“循環(huán)”一詞的含義正是如此空與滿數(shù)組滿時,rear==front條件rear==front也代表空隊列解決方法:讓數(shù)組中始終剩余至少一個空位置。當數(shù)組中僅有一個空位置時,就認為已經(jīng)達到隊列的最大長度了,隊列已滿初始時,front=0且rear=0循環(huán)隊列的定義typedefintELEMType;typedefstruct{

ELEMTypeelement[maxSize]; intfront,rear;}SeqQueue;循環(huán)隊列初始化構(gòu)造一個空隊列,隊頭和隊尾指針均賦初值0清空隊列隊列置空也得到一個空隊列,可以將隊頭和隊尾指針均賦值0,和初始化隊列的結(jié)果一樣也可以讓隊頭和隊尾指針的值相等,表示是一個空隊列判空與判滿隊列為空的條件是rear==front隊列為滿的條件是(rear+1)%n==front求隊列長度入隊與出隊鏈式隊列鏈式隊列采用帶頭指針及尾指針的單鏈表作為隊列的存儲結(jié)構(gòu)單鏈表的頭指針可以當作隊頭指針front,尾指針可以當作隊尾指針rear鏈式隊列的定義typedefintELEMType;typedefstructnode{ ELEMTypedata; structnode*next;}LinkedQueueNode;typedefstruct{ LinkedQueueNode*front,*rear; //隊頭、隊尾指針}LinkedQueue;初始化、清空隊列判空循環(huán)隊列中,當隊頭指針和隊尾指針相等時,隊列為空空鏈式隊列中,隊頭指針和隊尾指針都為NULL在內(nèi)存足夠大的情況下,鏈式隊列通常不會滿入隊列出隊第三節(jié)

棧和隊列的應(yīng)用——括號的匹配檢查程序中有很多符號是成對出現(xiàn)的,并且它們的出現(xiàn)次序必須正確,可以嵌套但不能交錯“左”符號稱為“開”符號,“右”符號稱為“閉”符號如果表達式中符號匹配正確,則表達式稱為平衡的表達式可以用棧來實現(xiàn)檢驗符號平衡性的算法檢驗括號匹配算法的思想從左至右掃描給定的符號串,忽略所有非括號的符號當遇到開括號時,保存它當遇到一個閉括號時,看看它是否對應(yīng)于最近遇到的開括號如果是,則丟掉開括號,并繼續(xù)掃描符號串如果能掃描完整個符號串,且沒有遇到不匹配的情況,則給定的符號串代表的表達式是平衡的可以使用棧來保存遇到的開括號表達式不平衡的情況剛掃描到的閉括號與棧頂開括號不匹配,說明括號有交錯已掃描到表達式尾,但棧不空,說明開括號數(shù)多于閉括號數(shù)掃描到閉括號時發(fā)現(xiàn)棧為空,說明缺少與此閉括號對應(yīng)的開括號檢驗括號平衡性算法的實現(xiàn)檢驗括號平衡性算法示例檢查表達式[a+(d+e)]時棧的變化過程檢查表達式{[(])}時棧的變化過程表達式的計算表達式的表示形式及計算次序中綴表達式: <操作數(shù)><運算符><操作數(shù)> c*(a+b)前綴表達式 <運算符><操作數(shù)><操作數(shù)>后綴表達式 <操作數(shù)><操作數(shù)><運算符>將中綴表達式轉(zhuǎn)變?yōu)楹缶Y表達式——手算給中綴表達式中的每個運算符加括號,這樣的表達式稱為帶完全括號的中綴表達式接下來,將每個運算符右移,緊貼在對應(yīng)的閉括號的前面最后,去掉括號得到后綴表達式將中綴表達式轉(zhuǎn)變?yōu)楹缶Y表達式——算法自左至右掃描中綴表達式,當遇到操作數(shù)時,直接輸出它。當遇到運算符時,不能像操作數(shù)那樣直接輸出,而是保存在棧中。當滿足一定的條件時才輸出棧頂?shù)倪\算符當讀到表達式中的一個運算符時,將它與棧內(nèi)運算符進行比較。分以下情況考慮若棧內(nèi)運算符的優(yōu)先級高于棧外運算符的優(yōu)先級,則輸出棧內(nèi)運算符,繼續(xù)比較棧外運算符與棧內(nèi)運算符若棧外運算符的優(yōu)先級高于棧內(nèi)運算符的優(yōu)先級,則棧外運算符入棧,繼續(xù)讀入表達式的下一個符號若已經(jīng)讀到表達式末尾,則依次出棧棧中的全部運算符部分運算符優(yōu)先級表運算符+,-*,/,%()#棧內(nèi)優(yōu)先級351-0棧外優(yōu)先級2481-示例將中綴表達式1+2*3轉(zhuǎn)換為后綴表達式算法——獲取算符優(yōu)先級轉(zhuǎn)換算法將中綴表達式轉(zhuǎn)變?yōu)楹缶Y形式的算法后綴表達式計算從左至右掃描后綴表達式當遇到操作數(shù)時,操作數(shù)進棧當遇到運算符時,從棧中彈出兩個操作數(shù),并進行運算符所代表的運算,結(jié)果仍放到棧中因為棧的后進先出的特性,故從棧中先彈出的操作數(shù)是運算符的右操作數(shù),后彈出的是左操作數(shù)示例計算后綴表達式123*+值的過程計算表達式算法計算后綴表達式算法打印楊輝三角形楊輝三角形的前8行相鄰兩行的對應(yīng)關(guān)系打印算法打印楊輝三角形算法ThankYou!全國高等教育自學(xué)考試指定教材

計算機及應(yīng)用專業(yè)(專科段)數(shù)據(jù)結(jié)構(gòu)第四章數(shù)組、廣義表和串學(xué)習(xí)目標掌握數(shù)組、廣義表和串的基本概念掌握數(shù)組按行主序及按列主序的存儲方式及二維數(shù)組地址計算方法掌握特殊矩陣的存儲方式及相應(yīng)的地址計算方法理解廣義表的概念,掌握廣義表的表示及基本運算了解模式匹配概念,掌握串的模式匹配算法本章主要內(nèi)容數(shù)組及廣義表12串第一節(jié)

數(shù)組及廣義表數(shù)組是程序設(shè)計語言中的重要語法成分,很多語言都定義了數(shù)組類型以C語言為例,它定義了一維數(shù)組,數(shù)組元素還可以是數(shù)組,由此得到數(shù)組的數(shù)組,即多維數(shù)組一般地將n(n≥2)維數(shù)組看作是n-1維數(shù)組的數(shù)組從數(shù)據(jù)結(jié)構(gòu)的角度來理解,一維數(shù)組可以作為線性表的存儲結(jié)構(gòu),數(shù)組中保存的各元素可以組成一個線性表多維數(shù)組在系統(tǒng)內(nèi)部都對應(yīng)一個隱含的一維數(shù)組,所以多維數(shù)組也是一種線性表例如二維數(shù)組就是以一維數(shù)組為元素的線性表數(shù)組的每個元素都是形如(index,value)的二元對,index是數(shù)組下標,也稱為索引,value是對應(yīng)于該下標的數(shù)值任何兩個元素的index值都不相同數(shù)組的基本操作Create(); //創(chuàng)建一個空的數(shù)組Store(index,value);//添加數(shù)據(jù)(index,value)//同時刪除有相同index值的數(shù)據(jù)對(若存在)Retrieve(index);//返回下標為index的value值示例用數(shù)組表示一個星期每天的最高溫度hightem={(星期日,30),(星期一,28),(星期二,29),(星期三,32),(星期四,28),(星期五,30),(星期六,31)}數(shù)組上的操作Store(星期一,29);Retrieve(星期五);也可以約定使用0到6來分別表示星期日到星期六,此時,數(shù)組hightem可表示為hightem={(0,30),(1,28),(2,29),(3,32),(4,28),(5,30),(6,31)}數(shù)組的順序存儲方式數(shù)組的順序存儲有兩種形式。以二維數(shù)組為例,它的元素可以按行排列,也可以按列排列所謂按行排列,就是先排數(shù)組的第一行,緊隨其后排第二行,依此類推所謂按列排列,就是先排數(shù)組的第一列,緊隨其后排第二列,依此類推最終都是將數(shù)組中的全部元素排列成一個序列C語言中多維數(shù)組下標的形式:[i1][i2][i3]…[ik]ij(1≤j≤k)為非負整數(shù)聲明值為整型類型的k維數(shù)組DkArrayintDkArray[u1][u2][u3]…[uk];每一維的下標取值范圍是:0≤ij<uj(1≤j≤k)數(shù)組最多可容納n=u1

u2

u3

uk個整數(shù)所需要的內(nèi)存空間sizeof(DkArray)=n

sizeof(int)個字節(jié)若開始地址為start,則占用的空間將延伸至start+sizeof(DkArray)-1。intD2Array[3][6];對應(yīng)一個3行6列的矩陣通常int占4個字節(jié)數(shù)組D2Array中含有18個元素共占用18

4=76個字節(jié)編號對上述的下標表格按行自上而下、同一行中自左至右進行連續(xù)編號,從0開始按行優(yōu)先把二維數(shù)組中的下標映射到0到n-1之間的某個整數(shù)的方式稱為行主序,也稱為行主映射按列優(yōu)先,對下標表格從第一列開始,從上到下進行連續(xù)編號,直到最后一列映射函數(shù)行主序所對應(yīng)的映射函數(shù)為 map(i1,i2)=i1

u2+i2

其中u2是數(shù)組的列數(shù)列主序所對應(yīng)的映射函數(shù)為 map(i1,i2)=i2

u1+i1

其中u1是數(shù)組的行數(shù)示例例4.2二維數(shù)組A[10][5]采用行主序方式存儲,每個數(shù)據(jù)元素占4個存儲單元,若A[0][4]的存儲地址是1000,則A[8][4]的存儲地址是多少?解:給定的數(shù)組A是10行5列,需要從A[0][4]的存儲地址反推出數(shù)組A的首地址,然后再計算A[8][4]的存儲地址行主序所對應(yīng)的映射函數(shù)為map(i1,i2)=i1

u2+i2本題中:u2=5,map(0,4)=4每個元素占4個存儲單元 A[0][0]的存儲地址=1000-4

4=984根據(jù)計算公式,A[8][4]的映射編號是 map(8,4)=8

5+4=44存儲地址為984+44

4=1160換一種計算方法A[0][4]和A[8][4]之間的元素個數(shù)是 8

5=40A[0][4]與A[8][4]之間的偏移量 =40

4A[8][4]的存儲地址 =A[0][4]的存儲地址+ A[0][4]與A[8][4]之間的偏移量 =1000+160=1160示例三維數(shù)組D3Array[3][2][4]按行主序下標排列的形式對于三維數(shù)組ThrDimenArray[u1][u2][u3],其行主序的映射函數(shù)應(yīng)為 map(i1,i2,i3)=i1

u2

u3+i2

u3+i3排列規(guī)律所有第一維值為i1的元素都排在第一維值大于i1的元素之前。第一維值相同的元素數(shù)目為u2

u3。因此第一維值小于i1的元素數(shù)目為i1

u2

u3,第一維值等于i1且第二維值小于i2的元素數(shù)目為i2

u3,第一維值等于i1第二維值等于i2且第三維值小于i3的元素數(shù)目為i3矩陣的壓縮存儲對稱矩陣和三角矩陣從節(jié)省存儲空間的角度考慮,對稱矩陣和上(下)三角矩陣,都可以只保存矩陣中約一半的元素,從而可以節(jié)省差不多一半的存儲空間這樣的存儲形式稱為壓縮存儲壓縮存儲對于對稱矩陣,因為對角線以上及以下的元素對稱相等,所以只需要保存其中的一半及對角線上的元素即可對于上三角矩陣或下三角矩陣,僅保存上三角部分或下三角部分的元素,另外一半的零元素不再保存若矩陣有n行n列,則這三種形式下需要保存的元素個數(shù)為n

(n+1)/2三角部分

稀疏矩陣稀疏矩陣該矩陣只有10個非零元素,每個非零元素用一個三元組表示三元組表三元組表應(yīng)是一個有序序列,通常按行主序次序排列,即先按行的大小排列,同一行的三元組再按列的大小排列對應(yīng)前例的三元組表i0012234455j1200521405v891-3121624615-7稀疏矩陣的存儲結(jié)構(gòu)typedefstruct{ inti,j; //存儲非零元素的下標

ELEMTypev; //存儲非零元素的值}triTerm;typedefstruct{ introws,cols; //矩陣的行數(shù)、列數(shù) intterms; //非零元素個數(shù)

triTermtri[maxSize]; //三元組表}SparseMatrix;輸入三元組生成三元組表的程序矩陣轉(zhuǎn)置矩陣轉(zhuǎn)置即是行、列互換,i行的元素放置到i列,這也意味著,j列的元素放置在j行。如果矩陣是n

m的,則轉(zhuǎn)置后得到的矩陣是m

n的很容易想到,將三元組表中的每個三元組項的i與j互換,即可得到轉(zhuǎn)置后矩陣的三元組表但是這樣轉(zhuǎn)換后得到的三元組表不再按行主序排列,不便于后續(xù)操作的實現(xiàn)所以要實現(xiàn)的矩陣轉(zhuǎn)置程序,必須得到一個按行主序排列的三元組表思路可以像readSparseMatrix函數(shù)那樣處理,讀入原矩陣的一個三元組,插入到目標矩陣的三元組表中可以使用一個臨時計數(shù)數(shù)組,記錄原矩陣的每個三元組在目標矩陣的三元組表中的插入位置,以輔助完成轉(zhuǎn)置操作,由此避免了三元組的移動,高效率地實現(xiàn)轉(zhuǎn)置操作不失一般性,設(shè)原矩陣A的行數(shù)是rows,列數(shù)是cols。則轉(zhuǎn)置后矩陣B的行數(shù)是cols,列數(shù)是rows。三元組的個數(shù)沒有改變A中處于0列的元素,將是B中處于0行的元素。所以B的三元組表中的最前面的元素,是A中列值為0的元素。接下來是A中列值為1的元素,依此類推,最后是A中列值為cols-1的元素。使用臨時數(shù)組ColSize來保存統(tǒng)計結(jié)果前例中的矩陣,臨時數(shù)組ColSize內(nèi)容在B的三元組表中,為各行元素預(yù)留位置01234532201201234567890行元素1行元素2行元素4行元素5行元素對于A的三元組(0,1,8)和(4,1,24),轉(zhuǎn)置后分別為(1,0,8)和(1,4,24),它們應(yīng)該保存在上述第二部分,即位置3和位置4中故由ColSize數(shù)組中的元素值,從前向后依次相加,得到RowNext的值012345603577810轉(zhuǎn)置算法數(shù)組的應(yīng)用走迷宮是實驗心理學(xué)中的一個經(jīng)典問題不失一般性,使用一個m行n列的矩陣maze表示迷宮,讓機器人R尋找從maze[0][0](左上角,入口)到maze[m-1][n-1](右下角,迷宮的唯一出口)間的可行路徑任一時刻,R在迷宮中的位置用行、列號[i][j]來表示,這時它有4個方向可以進行試探,即從圖上看是上、下、左、右設(shè)下一位置是[g][h],顯然[g][h]的值與走的方向有關(guān)若從[i][j]向右走一步,則g=i;h=j+1若向上走一步,則g=i-1;h=j當R走到迷宮邊緣時,可以試探的方向不足4個,需要進行邊界的判斷為了避免過多的邊界條件判斷,可以把原來表示迷宮的矩陣maze擴大一圈,變成m+2行n+2列,并且令表示邊緣的這些矩陣元素全為1編寫計算機程序求解迷宮問題,一般采用一步一探查并加回溯的方法。稱R所在的位置為當前位置,當R走到一個位置時,除了進入當前位置的方向外,可以在其他3個方向進行探查,選擇可行并尚未走過的方向走一步,所處的新位置變?yōu)楫斍拔恢?,并再次探查下一個可行位置;當3個方向都走不通時,只能沿來路退到前一個位置再選擇其他方向,這一步驟稱為回溯。回溯后的位置又變?yōu)楫斍拔恢迷谔讲榈倪^程中,因為有回溯,所以可能會走到原來已走過的位置,為避免重復(fù)并找出確定的可行路徑,需要一個棧記錄已走過的每一步的位置及方向,另外還需要設(shè)置一個與原來迷宮矩陣同樣大小的標志矩陣mark,以對走過的位置進行標記mark矩陣的初值全為0,當R走到maze[i][j]位置時,則置mark[i][j]為1R走迷宮的步驟令R處在迷宮入口,此為當前位置在當前位置上,依右、下、左、上的順序探查前進方向向可以進入的方向前進,即目標位置的maze和mark值全為0。前進一步后,目標位置為當前位置,將mark矩陣的當前位置標記為1,并且將前一位置的位置值及進入當前位置的方向入棧重復(fù)步驟②和③若找不到前進通路,則從原路后退一步(退棧),改變探測方向,再重復(fù)步驟②、③,以尋找另一條新的通路重復(fù)步驟②~⑤,直到走出迷宮或宣布迷宮無通路為止走步時相鄰兩個位置之間行、列值的關(guān)系若向右走,則行值不變,列值加1若向下走,則行值加1,列值不變?nèi)粝蜃笞?,則行值不變,列值減1若向上走,則行值減1,列值不變將這4組值定義在move矩陣中列號0、1、2、3分別對應(yīng)著方向右,下,左,上行號0和1分別對應(yīng)著位置坐標i和j走迷宮算法走迷宮算法廣義表廣義表是線性表的推廣,也稱為列表是由n(n≥0)個表元素組成的有限序列 LS=(a0,a1,…,an-1)LS是廣義表的名稱n是表的長度當n=0時稱為空表ai(0≤i≤n-1)的類型可以不完全一致,既可以是單個元素(稱為原子),也可以是廣義表(稱為子表)原子不可再分第一個元素a0稱為LS的表頭(Head),其余元素組成的表(a1,a2,…,an-1)稱為LS的表尾(Tail)廣義表中括號的最大嵌套層數(shù)定義為表的深度空表的深度為1,原子的深度為0其他情況,可以遞歸求解廣義表的深度=max{各子表的深度}+1示例A=()A是空表,長度為0,深度為1B=(())B的長度為1,深度為2C=(6,2)C的長度為2,深度為1,兩個元素都是原子D=('a',(5,3,'x’))D的長度為2,深度為2,含一個原子及一個子表示例E=(C,D,A)E的長度為3,深度為3,含3個子表F=(C)F的長度為1,深度為2,含1個子表G=(4,G)G的長度為2,深度為∞,遞歸表各表的表頭和表尾示例Head(B)=(),Tail(B)=()Head(C)=6,Tail(C)=(2)Head(D)='a',Tail(D)=((5,3,'x'))Head(E)=C,Tail(E)=(D,A)Head(F)=C,Tail(F)=()Head(G)=4,Tail(G)=(G)空表沒有定義表頭和表尾,所以不能求表A的表頭和表尾表E的表頭是表C第二節(jié)

串串(String)也稱為字符串,是由零個或多個字符組成的有限序列記為:s="a0a1…an-1",(n≥0),其中,s是串名,使用雙引號括起來的字符序列是串的值串中的每個符號ai(0≤i≤n-1)可以是字母、數(shù)字或其他字符,其在串中的次序定義為該符號的位置位置從0開始串中字符個數(shù)n稱為串的長度n=0時稱為空串串s中任意個連續(xù)字符組成的子序列稱為串s的子串,相應(yīng)地s稱為主串子串在主串中首次出現(xiàn)時子串首字符對應(yīng)于主串的符號位置,定義為子串在主串中的位置設(shè)有串s1="Thisisastring",s2="is"s1為主串,s2是s1的子串s2在s1中的位置為2空串是任意串的子串任意串是其自身的子串串的模式匹配在主串中尋找子串(第一個字符)在主串中的位置,稱為串的模式匹配子串又稱為模式,主串稱為目標樸素的模式匹配算法(B-F算法)設(shè)主串T="aaaaab",模式串P="aab",采用B-F算法的匹配過程在每趟匹配中,主串與模式串的字符之間的比較次數(shù)有3次,共4趟,所以共進行了12次比較主串a(chǎn)aaaab

模式串a(chǎn)ab

第1趟

aab

第2趟

aab

第3趟

aab第4趟樸素的模式匹配算法簡單,但時間效率不高設(shè)主串長度為n,模式串長度為m。如果每次都是比較到模式串最后一個字符時才出現(xiàn)失配,且主串的最后m個字符與模式串匹配成功,這就出現(xiàn)了最壞情況此時,每一趟都進行了m次比較,共比較了n-m+1趟,故總比較次數(shù)將達到(n-m+1)

m算法的最壞情況時間復(fù)雜度為O(n

m)改進的模式匹配算法(KMP算法)設(shè)主串T="b0b1b2…bm-1…bn-1",模式串P="p0p1p2…pm-1",進行第一趟匹配時,T與P的對應(yīng)字符進行比較主串Tb0b1b2…bm-1…bn-1模式串Pp0p1p2…pm-1匹配過程中,若某一趟比較時出現(xiàn)失配,模式串P需要整體右移,那么P右移的位數(shù)應(yīng)該是多少呢模式串P的首字符p0對應(yīng)于主串的字符bs,且前j(j≥0)對字符都匹配成功,第j+1對字符匹配不成功則有bsbs+1bs+2…bs+j-1=p0p1p2…pj-1如果下一趟比較時模式串P與主串T匹配,也就是P與主串中從bs+1開始的子串匹配,則必須滿足p0p1p2…pj-1…pm-1=bs+1bs+2bs+3…bs+j…bs+m若知道p0p1…pj-2

p1p2…pj-1,則立刻可以斷定p0p1…pj-2

bs+1bs+2…bs+j-1,即下一趟必不匹配同樣地,若p0p1…pj-3

p2p3…pj-1,則再下一趟也不匹配,因為p0p1…pj-3

bs+2bs+3…bs+j-1如果找到一個k值,滿足p0p1…pk+1

pj-k-2pj-k-1…pj-1但p0p1…pk=pj-k-1pj-k…pj-1則有p0p1…pk=bs+j-k-1bs+j-k…bs+j-1那么,下一趟可以直接用pk+1與bs+j進行比較如何確定k值呢對于不同的失配位置j,k的取值是不同的,它僅依賴于模式串P本身前j個字符的構(gòu)成,而與主串無關(guān)設(shè)模式串P=p0p1…pm-2pm-1,定義特征向量next

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論