數(shù)據(jù)結(jié)構(gòu)導(dǎo)論_第1頁(yè)
數(shù)據(jù)結(jié)構(gòu)導(dǎo)論_第2頁(yè)
數(shù)據(jù)結(jié)構(gòu)導(dǎo)論_第3頁(yè)
數(shù)據(jù)結(jié)構(gòu)導(dǎo)論_第4頁(yè)
數(shù)據(jù)結(jié)構(gòu)導(dǎo)論_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第一章 概論1 數(shù)據(jù)結(jié)構(gòu)是指一組相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)的組織方式和它們?cè)谟?jì)算機(jī)內(nèi)的存儲(chǔ)方式,以及定義在該組數(shù)據(jù)上的一組操作。2 數(shù)據(jù)的邏輯結(jié)構(gòu)是指數(shù)據(jù)元素之間的邏輯關(guān)系。共分四種:集合結(jié)構(gòu):數(shù)據(jù)之間無(wú)關(guān)聯(lián)線性結(jié)構(gòu):數(shù)據(jù)之間依次鄰接樹(shù)形結(jié)構(gòu):具有分支、層次特性圖結(jié)構(gòu):任何兩個(gè)節(jié)點(diǎn)都可以鄰接3 數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)是指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)上的實(shí)現(xiàn)。一般包括兩部分:1) 數(shù)據(jù)元素 2)數(shù)據(jù)元素之間的關(guān)聯(lián)方式。關(guān)聯(lián)方式主要有兩種:順序存儲(chǔ)方式和鏈?zhǔn)酱鎯?chǔ)方式。4 一種邏輯結(jié)構(gòu)可以表達(dá)為一種或幾種存儲(chǔ)結(jié)構(gòu),相應(yīng)的存儲(chǔ)結(jié)構(gòu)稱為給定邏輯結(jié)構(gòu)的存儲(chǔ)實(shí)現(xiàn)或存儲(chǔ)映像。5 運(yùn)算指在某種邏輯結(jié)構(gòu)上進(jìn)行的操作。

2、6 算法規(guī)定了求解給定問(wèn)題的處理步驟和執(zhí)行順序。評(píng)估算法好壞的幾個(gè)方面:1) 正確性:實(shí)現(xiàn)預(yù)定功能,2) 易讀性:易于閱讀,便于修改和擴(kuò)充3) 健壯性:能對(duì)非法數(shù)據(jù)做出反應(yīng)或進(jìn)行處理4) 時(shí)空性:時(shí)間性能和空間性能7 時(shí)間復(fù)雜度:也就是基本操作的執(zhí)行次數(shù),用于估計(jì)算法的計(jì)算量。常見(jiàn)的有常數(shù)階O(1),對(duì)數(shù)階O(log2n),線性階O(n),多項(xiàng)式階O(nc)c=1,2,指數(shù)階O(cn) c=1,2。通常認(rèn)為,指數(shù)階的算法是不可行的,低于平方階的算法是高效率的。8 空間復(fù)雜度:算法所耗費(fèi)的存儲(chǔ)空間。一般只分析輔助變量所占的空間。第二章 線性表1 線性表基本概念1) 線性表是一種線性結(jié)構(gòu),它是由n

3、(n0)個(gè)數(shù)據(jù)元素組成的有窮序列,數(shù)據(jù)元素又稱結(jié)點(diǎn),結(jié)點(diǎn)個(gè)數(shù)n稱為表長(zhǎng)。當(dāng)n=0時(shí),線性表不含任何數(shù)據(jù)元素,稱為空表。當(dāng)n0時(shí),線性表通常表示成(a1, a2, , an),a1稱為起始結(jié)點(diǎn),an稱為終端結(jié)點(diǎn)。對(duì)任意一對(duì)相鄰結(jié)點(diǎn)ai和ai+1(1in),ai稱為ai+1的直接前驅(qū),ai+1稱為ai的直接后繼。2) 線性表中結(jié)點(diǎn)具有一對(duì)一的關(guān)系,如果結(jié)點(diǎn)數(shù)不為零,則除起始結(jié)點(diǎn)沒(méi)有直接前驅(qū)外,其它每個(gè)結(jié)點(diǎn)有且僅有一個(gè)直接前驅(qū);除終端結(jié)點(diǎn)沒(méi)有直接后繼外,其它每個(gè)結(jié)點(diǎn)有且僅有一個(gè)直接后繼。2 線性表的順序存儲(chǔ)1) 線性表順序存儲(chǔ)的方法:將表中的結(jié)點(diǎn)依次存放在計(jì)算機(jī)內(nèi)存中一組連續(xù)的存儲(chǔ)單元中,數(shù)據(jù)元素在

4、線性表中的鄰接關(guān)系決定它們?cè)诖鎯?chǔ)空間中的存儲(chǔ)位置,即邏輯結(jié)構(gòu)中相鄰的結(jié)點(diǎn)其存儲(chǔ)位置也相鄰。用順序存儲(chǔ)實(shí)現(xiàn)的線性表稱為順序表。一般使用數(shù)組來(lái)表示順序表。結(jié)構(gòu)定義如下:const int maxsize=100;typedef structDataType datamaxsize;int length; SqlList;SqlList L;2) 線性表的基本運(yùn)算在順序表上的實(shí)現(xiàn)(1) 插入void InsertSeqlist(SeqList L, DataType x, int i)if(L.length = maxsize) exit(“表已滿”);if(i L.Length+1) exit(“

5、位置錯(cuò)”);for(j=L.length; j = i; j-) L.dataj = L.dataj-1;L.datai-1 = x;L.length+;(2) 刪除void DeleteSeqlist(SeqList L, int i)if(i L.Length) exit(“位置錯(cuò)”);for(j=i; j L.length; j+) L.dataj-1 = L.dataj;L.length-;(3) 定位int LocateSeqlist(SeqList L, DataType x)int i = 0;while(iL.length & L.datai != x) i+;if(i nex

6、t;while(p!=NULL & p-data != x)i+;p=p-next;if(p != NULL) return i+1;return 0;(2) 插入void Insert(LinkList head, DataType x, int i)Node *p,*q;if(i=1) q=head;else q=GetLinkList(head,i-1);if(q=NULL) exit(“找不到插入位置”);p=malloc(sizeof(Node);p-next = q-next;q-next = p;(3) 刪除void Delete(LinkList head, int i)Nod

7、e *p,*q;if(i=1) q=head;else q=GetLinklist(head, i-1);if(q=NULL) exit(“找不到刪除位置”);p=q-next;p-next = q-next;free(p);3) 其它鏈表(1) 如果讓最后一個(gè)結(jié)點(diǎn)的指針指向第一個(gè)結(jié)點(diǎn)可以構(gòu)成循環(huán)鏈表。在循環(huán)鏈表中,從任意結(jié)點(diǎn)出發(fā)都能掃描整個(gè)鏈表。(2) 在單鏈表的每個(gè)結(jié)點(diǎn)中再添加一個(gè)指向其直接前驅(qū)結(jié)點(diǎn)的指針prior,頭結(jié)點(diǎn)prior指針指向最后一個(gè)結(jié)點(diǎn),最后一個(gè)結(jié)點(diǎn)的next指針指向頭結(jié)點(diǎn),這樣的鏈表被稱為雙向循環(huán)鏈表。第三章 棧、隊(duì)列、數(shù)組1 棧1) 棧的基本概念(1) 棧是運(yùn)算受限的線

8、性表,這種線性表上的插入和刪除運(yùn)算限定在某一端進(jìn)行。允許進(jìn)行插入和刪除的一端稱為棧頂,別一端稱為棧底。不含任何數(shù)據(jù)元素的棧稱為空棧。處于棧頂位置的數(shù)據(jù)元素稱為棧頂元素。(2) 棧的修改原則是后進(jìn)先出(Last In First Out),因此,棧又稱為后進(jìn)先出線性表,簡(jiǎn)稱后進(jìn)先出表。棧的插入和刪除運(yùn)算稱為進(jìn)棧和出棧。2) 棧的順序?qū)崿F(xiàn)(1) 棧的順序存儲(chǔ)結(jié)構(gòu)是用一組連續(xù)的存儲(chǔ)單元依次存放棧中的每個(gè)元素,并用始端作為棧底。棧的順序?qū)崿F(xiàn)稱為順序棧。通常用一個(gè)一維數(shù)組和一個(gè)記錄棧頂位置的變量來(lái)實(shí)現(xiàn)棧的順序存儲(chǔ)。為了防止“下溢”,棧底沒(méi)有元素,棧頂?shù)娜≈捣秶鸀? - (maxsize-1)。定義如下:

9、const int maxsize=6;typedef struct seqstackDataType datamaxsize;int top; SeqStk;(2) 進(jìn)棧int Push(SeqStk * stk, DataType x)if(stk-top = maxsize-1)error(“棧已滿”);return 0;stk-top+;stk-datastk-top = x;return 1;(3) 出棧int Pop(SeqStk * stk)if(EmptyStack(stk)error(“空棧”);return 0;stk-top-;return 1;(4) 取棧頂元素Data

10、Type GetTop(SeqStk *stk)if(EmptyStack(stk) return NULL;return stk-datastk-top;3) 棧的鏈?zhǔn)綄?shí)現(xiàn)(1) 棧的鏈?zhǔn)綄?shí)現(xiàn)稱為鏈棧,可以用帶頭的單鏈表實(shí)現(xiàn),首結(jié)點(diǎn)作棧頂,尾結(jié)點(diǎn)作棧底。定義如下typedef struct nodeDataType data;struct node *next; LkStk;(2) 進(jìn)棧void Push(LkStk *LS, DataType x)LkStk* temp = (LkStk*)malloc(sizeof(LkStk);temp-data = x;temp-next = LS-

11、next;LS-next = temp;(3) 出棧int Pop(LkStk *LS)LkStk * temp;if(!EmptyStack(LS)temp = LS-next;LS-next = temp-next;free(temp);return 1;return 0;2 隊(duì)列1) 隊(duì)列是一種先進(jìn)先出(First In First Out)的線性表,新加入的數(shù)據(jù)元素插入隊(duì)列的尾端。2) 隊(duì)列的順序?qū)崿F(xiàn)(1) 順序存儲(chǔ)實(shí)現(xiàn)的隊(duì)列稱為順序隊(duì)列,由一個(gè)一維數(shù)組及兩個(gè)指示隊(duì)首和隊(duì)尾的變量組成。(2) 為了避免元素的移動(dòng),可將存儲(chǔ)元素的數(shù)組首尾相接,形成一個(gè)環(huán)狀,這樣的隊(duì)列稱為循環(huán)隊(duì)列(3) 為

12、了解決循環(huán)隊(duì)列無(wú)法區(qū)分是空隊(duì)列還是滿隊(duì)列的情況,采用少用一個(gè)元素空間的辦法解決3) 隊(duì)列的鏈?zhǔn)綄?shí)現(xiàn)(1) 使用一個(gè)單鏈表外加兩個(gè)指向頭尾結(jié)點(diǎn)的指針實(shí)現(xiàn),稱為鏈隊(duì)列。3 數(shù)組1) 數(shù)組可以看作線性表的一種推廣,一維數(shù)組又稱向量,數(shù)組通常只有讀和寫(xiě)兩種操作2) 二維數(shù)組有兩種存儲(chǔ)方式,一種是行序存儲(chǔ)(橫著存),一種是列序存儲(chǔ)(豎著存)3) 為了節(jié)省存儲(chǔ)空間,對(duì)矩陣中多個(gè)值相同的元素只分配一個(gè)存儲(chǔ)空間,零元素不存儲(chǔ)的方法被稱為矩陣的壓縮存儲(chǔ)4) 如果值相同的元素或零元素在矩陣中的分布有一定規(guī)律,稱此類(lèi)矩陣為特殊矩陣。常見(jiàn)的特殊矩陣有對(duì)稱矩陣和三角矩陣5) 矩陣中非零元素個(gè)數(shù)很少的矩陣稱為稀疏矩陣。對(duì)

13、稀疏矩陣的壓縮存儲(chǔ)可以采用三元組表示法,即用行號(hào),列號(hào),元素值表示矩陣中的非零元素第四章 樹(shù)1 樹(shù)的基本概念1) 節(jié)點(diǎn)的度:節(jié)點(diǎn)所擁有的子樹(shù)的數(shù)目2) 葉子:度為0的節(jié)點(diǎn),也叫終端節(jié)點(diǎn)3) 樹(shù)的度:樹(shù)中所有節(jié)點(diǎn)的度的最大值4) 節(jié)點(diǎn)的層次:根的層次為1,其余的為其父節(jié)點(diǎn)加15) 樹(shù)的高深度:樹(shù)中所有節(jié)點(diǎn)層次的最大值6) 有序樹(shù):節(jié)點(diǎn)的子樹(shù)是有次序的,不能互換7) 無(wú)序樹(shù):節(jié)點(diǎn)的子樹(shù)沒(méi)有次序,可以互換2 二叉樹(shù)的基本概念1) 有左右兩個(gè)節(jié)點(diǎn),且節(jié)點(diǎn)次序不能互換,即互換后為兩個(gè)不同的二叉樹(shù)2) 二叉樹(shù)第i層上最多有2i-1個(gè)節(jié)點(diǎn)3) 深度為k的二叉樹(shù)最多有2k-1個(gè)節(jié)點(diǎn)4) 對(duì)任意二叉樹(shù)而言,若n

14、0表示葉子,n2表示有左右兩個(gè)子樹(shù)的節(jié)點(diǎn),則n0=n2+15) 滿二叉樹(shù):深度為k且有2k-1個(gè)節(jié)點(diǎn)6) 完全二叉樹(shù):滿二叉樹(shù)刪除編號(hào)最大的節(jié)點(diǎn)后的二叉樹(shù)7) 含有n個(gè)節(jié)點(diǎn)的完全二叉樹(shù)的深度為1 + log2n8) 對(duì)第i個(gè)節(jié)點(diǎn)的完全二叉樹(shù)而言,左節(jié)點(diǎn)為2*i,右節(jié)點(diǎn)為2*i+1;對(duì)含有n個(gè)節(jié)點(diǎn)的完全二叉樹(shù)而言,最后一個(gè)非終端節(jié)點(diǎn)編號(hào)為n/23 二叉樹(shù)的存儲(chǔ)結(jié)構(gòu)1) 順序存儲(chǔ):由于完全二叉樹(shù)的節(jié)點(diǎn)編號(hào)能準(zhǔn)確反映節(jié)點(diǎn)的邏輯關(guān)系,所以可直接用數(shù)組表示二叉樹(shù);對(duì)于非完全節(jié)點(diǎn),則需增加虛擬節(jié)點(diǎn)構(gòu)成完全二叉樹(shù),然后再將節(jié)點(diǎn)的值存入數(shù)組,虛擬節(jié)點(diǎn)的值用null表示2) 鏈?zhǔn)酱鎯?chǔ):(1) 二叉鏈表:lchi

15、ld, data, rchild (2) 三叉鏈表:lchild, data, parent, rchild4 二叉樹(shù)的遍歷1) 先序遍歷void Preorder(BinTree bt)if(bt != null)visit(bt);preorder(bt-lchild);preorder(bt-rchild);2) 中序遍歷void inorder(BinTree bt)if(bt != null)inorder (bt-lchild);visit(bt);inorder (bt-rchild);3) 后序遍歷void postorder(BinTree bt)if(bt != null)

16、postorder (bt-lchild);postorder (bt-rchild);visit(bt);4) 以下面的二叉樹(shù)為例,遍歷如果如下:先序遍歷結(jié)果:ABDEGCF中序遍歷結(jié)果:DBGEACF后序遍歷結(jié)果:DGEBFCA5) 二叉樹(shù)的層次遍歷void levelorder(BinTree bt)Queue q;BinTree nd;if(bt != null)EnQueue(bt);while(!EmptyQueue(Q)nd = OutQueue(Q);visit(nd);if(nd-lchild != null) EnQueue(q, nd-lchild);if(nd-rchi

17、ld != null) EnQueue(q, nd-rchild);6) 二叉樹(shù)遍歷的非遞歸實(shí)現(xiàn),以先序遍歷為例void preorder(BinTree bt)Stack s;BinTree nd;if(bt = null) return;nd = bt;while(node != null | !EmptyStack(s)if(nd != null)Visit(nd);Push(nd,s);nd = nd-lchild;elsend=Pop(s);nd=nd-rchild;5 樹(shù)、森林與二叉樹(shù)1) 樹(shù)的存儲(chǔ)結(jié)構(gòu),以下圖為例(1) 孩子鏈表示法帶雙親節(jié)點(diǎn)的孩子鏈 (2) 孩子兄弟鏈表示法(3

18、) 雙親表示法2) 樹(shù)、森林與二叉樹(shù)的相互轉(zhuǎn)換1) 樹(shù)轉(zhuǎn)換為二叉樹(shù):將兄弟節(jié)點(diǎn)連接起來(lái),只保留第一個(gè)兄弟與父節(jié)點(diǎn)的連接2) 森林轉(zhuǎn)換為二叉樹(shù):將每棵樹(shù)轉(zhuǎn)換為相應(yīng)的二叉樹(shù),將所有二叉樹(shù)作為兄弟連接3) 二叉樹(shù)轉(zhuǎn)換為樹(shù)或森林:上述2種轉(zhuǎn)換的逆轉(zhuǎn)換6 哈夫曼樹(shù)與哈夫曼算法1) 哈夫曼樹(shù)是平均比較次數(shù)最少的判定樹(shù)2) 哈夫曼算法基本思想:每次選取兩個(gè)最小的權(quán)值進(jìn)行迭代。哈夫曼算法構(gòu)造的哈夫曼樹(shù)不是唯一的。3) 給定權(quán)值7,18,3,32,5,26,12,8,構(gòu)造哈夫曼樹(shù)并計(jì)算其帶權(quán)路徑長(zhǎng)度帶權(quán)路徑長(zhǎng)度=298第五章 圖1 基本概念1) 上圖中,圓圈稱為頂點(diǎn),連線稱為邊,連線附帶的值稱為邊的權(quán)2) 上圖

19、中,a圖稱為有向圖,記作G=(V,E),b圖稱為無(wú)向圖,記作G=3) 有向圖的邊稱為弧,箭頭起點(diǎn)稱為始點(diǎn)或弧尾,終點(diǎn)稱為終點(diǎn)或弧頭4) 任何兩點(diǎn)之間都有邊的無(wú)向圖稱為無(wú)向完全圖,一個(gè)具有n個(gè)頂點(diǎn)的無(wú)向完全圖共有n(n-1)/2條連;任何兩點(diǎn)間都有弧的有向圖稱為有向完全圖,一個(gè)具有n個(gè)頂點(diǎn)的有向完全圖共有n(n-1)條邊5) 無(wú)向圖中頂點(diǎn)v的度是與該頂點(diǎn)相關(guān)聯(lián)的邊的數(shù)目;有向圖中以頂點(diǎn)v為終點(diǎn)的弧的數(shù)目稱為v的入度,以頂點(diǎn)v為始點(diǎn)的弧的數(shù)目稱為v的出度7) 圖中兩點(diǎn)之間所經(jīng)過(guò)的邊(或弧)的數(shù)目稱為路徑長(zhǎng)度8) 頂點(diǎn)不重復(fù)出現(xiàn)的路徑稱為簡(jiǎn)單路徑,如a圖中的A-B-E-H-I;第一個(gè)頂點(diǎn)和最后一個(gè)頂

20、點(diǎn)相同的路徑稱為回路或環(huán),除第一個(gè)頂點(diǎn)和最后一個(gè)頂點(diǎn)外,其余頂點(diǎn)不重復(fù)的回路稱為簡(jiǎn)單回路,如b圖中的A-B-C-F-A9) 如果圖中任意兩個(gè)頂點(diǎn)都是連通的,則稱圖為連通圖2 存儲(chǔ)結(jié)構(gòu)1) 鄰接矩陣0 1 0 1 11 0 1 0 00 1 0 1 11 0 1 0 01 0 1 0 0 50 40 2050 10 10 20 3040 20 20 30 0 1 1 00 0 1 10 0 0 00 0 1 0 30 10 50 10 60 (1) 無(wú)權(quán)圖中Aij代表邊(i, j)或弧是否存在,有權(quán)圖中Aij代表邊(i, j)或弧的權(quán)值(2) 無(wú)向圖的鄰接矩陣是個(gè)對(duì)稱矩陣(3) 無(wú)向圖中,頂點(diǎn)V

21、i的度是第i行或列的和;有向圖中,出度為第i行之和,入度為第i列之和2) 鄰接表(1) 無(wú)向圖a1和a2的鄰接表(2) 有向圖b1和b2的鄰接表(3) 有向圖b1和b2的逆鄰接表(4) 無(wú)向圖中,頂點(diǎn)Vi的度為第i個(gè)單鏈表的節(jié)點(diǎn)數(shù)(5) 有向圖中,第i個(gè)單鏈表的節(jié)點(diǎn)數(shù)只是頂點(diǎn)Vi的出度(6) 有時(shí)需要建立逆鄰接表,也即以Vi為弧頭的鄰接表,這時(shí)第i個(gè)單鏈表的節(jié)點(diǎn)數(shù)只是頂點(diǎn)Vi的入度3 圖的遍歷 - 深度優(yōu)先算法1) 以圖中某個(gè)頂點(diǎn)Vi為出發(fā)點(diǎn),首先訪問(wèn)Vi,然后選Vi的任意一個(gè)未被訪問(wèn)過(guò)的鄰接點(diǎn)Vj,以Vj為新出發(fā)點(diǎn)繼續(xù)進(jìn)行深度優(yōu)先搜索,依此類(lèi)推,直到圖中所有的頂點(diǎn)都被訪問(wèn)過(guò)。2) 深度優(yōu)先算

22、法類(lèi)似于先序遍歷。4 圖的遍歷 - 廣度優(yōu)先算法1) 以圖中某個(gè)頂點(diǎn)Vi為出發(fā)點(diǎn),在訪問(wèn)了Vi之后依次訪問(wèn)Vj的所有鄰接點(diǎn),然后依次從這些鄰接點(diǎn)出發(fā)按廣度優(yōu)先算法遍歷其它頂點(diǎn),重復(fù)這一過(guò)程,只到所有頂點(diǎn)都被訪問(wèn)到。2) 廣度優(yōu)先算法類(lèi)似于樹(shù)的層次遍歷5 最小生成樹(shù)無(wú)向圖,最低成本連通網(wǎng)絡(luò) - Prim算法1) U=0, V-U=1,2,3,4, 在0和1,2,3,4關(guān)聯(lián)的所有邊中,取權(quán)值最小的邊(0,4),將頂點(diǎn)4加入集合U2) U=0,4, V-U=1,2,3 , 在0,4和1,2,3關(guān)聯(lián)的所有邊中,取權(quán)值最小的邊(2,4),將頂點(diǎn)2加入集合U3) U=0,2,4, V-U=1,3 , 在0

23、,2,4和1,3關(guān)聯(lián)的所有邊中,取權(quán)值最小的邊(1,2),將頂點(diǎn)1加入集合U4) U=0,1,2,4, V-U=3 , 在0,1,2,4和3關(guān)聯(lián)的所有邊中,取權(quán)值最小的邊(2,3),將頂點(diǎn)3加入集合U5) U=0,1,2,3,4, V-U=, 至此求出最小生成樹(shù),E=(0,4), (2,4), (1,2), (2,3)6) 對(duì)于有n個(gè)頂點(diǎn)的無(wú)向圖,最小生成樹(shù)中有且僅有n-1條邊6 最小生成樹(shù)無(wú)向圖,最低成本連通網(wǎng)絡(luò) - Kruskal算法1) 設(shè)G=(V,E),令最小生成樹(shù)T=(V,),即沒(méi)有邊的n個(gè)頂點(diǎn),每個(gè)頂點(diǎn)自成一個(gè)連通分量2) 在E中選權(quán)值最小的邊,若該邊的頂點(diǎn)落在T中不同的連通分量上

24、,則將些邊加入T,否則舍去些邊,選取下一條代價(jià)最小的邊3) 依次類(lèi)推,重復(fù)第二步,直到T中所有的頂點(diǎn)都在一個(gè)連通分量上7 最短路徑有向圖,尋找兩點(diǎn)之間的最短路徑 - Dijkstra算法步驟SuBCDEFGH第1步A-12108第2步A,DD1210817(ADF)第3步A,C,DC1210815(ACE)12(ACF)第4步A,B,C,DB1210815(ACE)12(ACF)第5步A,B,C,D,FF1210815(ACE)12(ACF)16(ACFG)第6步A,B,C,D,E,FE1210815(ACE)12(ACF)16(ACFG)18(ACEH)第7步A,B,C,D,E,F,GG12

25、10815(ACE)12(ACF)16(ACFG)18(ACEH)第8步A,B,C,D,E,F,G,HH1210815(ACE)12(ACF)16(ACFG)18(ACEH)8 拓?fù)渑判蛴邢驁D,確定節(jié)點(diǎn)先后次序1) 選擇一個(gè)入度為0的頂點(diǎn),輸出該頂點(diǎn)2) 刪除該頂點(diǎn)及相關(guān)的弧,并將弧頭所指結(jié)點(diǎn)的入度減13) 重復(fù)1,2直到所有入度為0的頂點(diǎn)均被輸出第六章 查找1 靜態(tài)查找 - 順序表1) 關(guān)鍵字,簡(jiǎn)稱鍵,用來(lái)標(biāo)識(shí)數(shù)據(jù)元素2) 對(duì)于給定的鍵,順序表只能按順序一一查找3) 順序查找實(shí)現(xiàn)如下:int Search(Table t, Key k)T0.key = key;int i=t.n;while

26、(Ti.key != key) i-;return i;2 靜態(tài)查找 - 有序表1) 鍵值按大小排列的順序表稱為有序表,這種情況下可用效率更高的二分查找法實(shí)現(xiàn)查找操作2) 二分查找法是每次和表中間位置的數(shù)據(jù)元素進(jìn)行比較,然后逐步縮小查找區(qū)間3) 二分查找法實(shí)現(xiàn)如下:int Search(Table t, Key k)int mid;int low=1, high=t.n;while(low=high)mid = (low+high)/2;if(key=tmid.key) return mid;if(key tmid.key) high = mid -1;else low=mid+1;retur

27、n -1;3 靜態(tài)查找 - 索引順序表1) 索引順序表是結(jié)合了順序查找和二分查找的優(yōu)點(diǎn)而構(gòu)造的一種存儲(chǔ)結(jié)構(gòu)2) 索引順序表由索引表和順序表兩部分組成,每個(gè)索引項(xiàng)由塊內(nèi)關(guān)鍵字和塊起始位置組成3) 索引順序表上的查找分兩步:(1) 確定元素所在的塊 (2) 在塊內(nèi)順序查找4 動(dòng)態(tài)查找 - 二叉排序樹(shù)1) 二叉排序權(quán)的左節(jié)點(diǎn)小于它的根結(jié)點(diǎn),右節(jié)點(diǎn)大于它的根結(jié)點(diǎn)2) 對(duì)二叉排序樹(shù)進(jìn)行中序遍歷,可得到一個(gè)升序的鍵值序列5 動(dòng)態(tài)查找 - 散列表1) 通過(guò)散列函數(shù)在數(shù)據(jù)元素的鍵值和存儲(chǔ)位置之間建立對(duì)應(yīng)關(guān)系2) 除留余數(shù)法是一種簡(jiǎn)單有效且最常用的散列構(gòu)造方法,具體做法是選擇一個(gè)不大于表長(zhǎng)n的正整數(shù)p,以鍵值除

28、以p所得的余數(shù)作為散列地址,通常選p為小于n的素?cái)?shù)。3) 平方除中法也是比較常用的散列構(gòu)造方法,具體做法是以鍵值平方的中間幾位作為散列地址。4) 用鏈地址法實(shí)現(xiàn)的散列表第七章 排序1 直接接入排序 - 插入排序1) 將記錄插入一個(gè)已排好序的有序表中,得到一個(gè)新的、記錄數(shù)多1的有序表。2) 穩(wěn)定排序,時(shí)間復(fù)雜度O(n2),空間復(fù)雜度O(1)3) 算法描述如下:void StraightInsertSort(List R, int n)int i,j;for(i = 2; i =n; i+)R0 = Ri;/將第i個(gè)記錄復(fù)制到崗哨j = i - 1;/將j設(shè)為有序表的最后位置while(R0.ke

29、y Rj.key) /移動(dòng)有序表的元素Rj+1 = Rj;j-;Rj+1 = R0; /將第i個(gè)記錄插入序列2 冒泡排序 - 交換排序1) 穩(wěn)定排序,時(shí)間復(fù)雜度O(n2)2) 算法描述如下:void BubbleSort(List R, int n)int i,j;for(int i=1; i =n; i+)for(j = i+1; jRj.key) Swap(Ri,Rj);3 快速排序 - 交換排序1) 選擇第一個(gè)記錄作為基準(zhǔn)值,通過(guò)一趟排序?qū)⒋诺挠涗浄譃閮刹糠?小于等于基準(zhǔn)值,大于基準(zhǔn)值),然后對(duì)這兩部分繼續(xù)進(jìn)行快速排序。2) 不穩(wěn)定排序,時(shí)間復(fù)雜度O(nlog2n),最壞情況下(已排好

30、序的序列),時(shí)間復(fù)雜度O(n2)3) 算法描述如下:int QuickPartition(List R, int low, int high)x = Rlow;while(lowhigh)/當(dāng)后面的元素大于x時(shí)while(low = x.key) high-;Rlow = Rhigh;/當(dāng)前面的元素小于x時(shí)while(low high) & (Rlow.key =x.key) low+;Rhigh =Rlow;Rlow = x;return low;void QuickSort(List R, int low, int high)if(low high)temp = QuickPartitio

31、n(R, low, high);QuickSort(R, low, temp -1);QuickSort(R, temp+1, high);4 直接選擇排序 - 選擇排序1) 每次從n個(gè)記錄中選取最小的一個(gè)進(jìn)行排序2) 不穩(wěn)定排序,時(shí)間復(fù)雜度O(n2)3) 算法描述如下:void SeleceSort(List R, int n)int min,i,j;for(i=1; i = n-1; i+)min = i;for(j = i + 1; j =n; j+) if(Rj.key Rmin.key) min = j;if(min != i) Swap(Rmin,Ri);5 堆排序 - 選擇排序1

32、) 最小堆是一棵完全二叉樹(shù),其中每個(gè)結(jié)點(diǎn)的值不大于它的兩個(gè)孩子的值(如果有的話)。2) 最小堆是一棵完全二叉樹(shù),其中每個(gè)結(jié)點(diǎn)的值不小于它的兩個(gè)孩子的值(如果有的話)。3) 不穩(wěn)定排序,時(shí)間復(fù)雜度O(nlog2n)4) 實(shí)現(xiàn)堆排序的關(guān)鍵需要解決兩個(gè)問(wèn)題:(1) 將初始序列建成一個(gè)堆,將極值(最小值或最小值) 調(diào)整到堆頂(2) 輸出堆頂元素之后,調(diào)整剩余元素成為一個(gè)新堆5) 堆排序的過(guò)程是一個(gè)調(diào)整過(guò)程稱為“篩選”,算法實(shí)現(xiàn)如下,以最小堆為例:void Sift(List R, int k, int m)int i,j,x;i = k; j = 2*i; x=Rk.key;while(j=m)if(

33、j Rj+1.key) j+; /存在右子樹(shù)且右子樹(shù)關(guān)鍵字小,Rj是子樹(shù)中的較小值if(Ri.key =1; i-) Shit(R, i, n); /建堆for(i=n; i=2; i-) Swap(R1,Ri);/ 交換堆頂元素最小值和最后一個(gè)元素Sift(R,1,i-1); /調(diào)整堆6 二路歸并排序 - 歸并排序1) 將n個(gè)記錄看成是n個(gè)有序的子序列,然后進(jìn)行兩兩合并。2) 穩(wěn)定排序,時(shí)間復(fù)雜度O(nlog2n)3) 算法實(shí)現(xiàn)如下:初始關(guān)鍵字 一次歸并后 20 45二次歸并后 20 45三次歸并后四次歸并后6 9 15 18 20 25 45 58 65 78integrated ener

34、gy, chemicals and textile Yibin city, are the three core pillars of the industry. In 2014, the wuliangye brand value to 73.58 billion yuan, the citys liquor industry slip to stabilise. Promoting deep development of integrated energy, advanced equipment manufacturing industry, changning district, sha

35、le gas production capacity reached 277 million cubic metres, built the countrys first independent high-yield wells and pipelines in the first section, the lead in factory production and supply to the population. 2.1-3 GDP growth figure 2.1-4 Yibin, Yibin city, Yibin city, fiscal revenue growth 2.1.4

36、 topography terrain overall is Southwest, North-Eastern State. Low mountains and hills in the city landscape as the main ridge-and-Valley, pingba small fragmented nature picture for water and the second land of the seven hills. 236 meters to 2000 meters above sea level in the city, low mountain, 46.

37、6% hills 45.3%, pingba only 8.1%. 2.1.5 development of Yibin landscapes and distinctive feature in the center of the city, with limitations, and spatial structure of typical zonal group, 2012-cities in building with an area of about 76.2km2. From city-building situation, old town-the South Bank Cent

38、er construction is lagging behind, disintegration of the old city is slow, optimization and upgrading, quality public service resources are still heavily concentrated in the old town together. Southbank Centre has not been formed, functions of the service area space is missing. Meanwhile, peripheral

39、 group centres service was weak and inadequate accounting for city development, suspicious pattern could not be formed. As regards transport, with the outward expansion of cities, cities have been expanding, centripetal city traffic organization has not changed, integrated energy, chemicals and text

40、ile Yibin city, are the three core pillars of the industry. In 2014, the wuliangye brand value to 73.58 billion yuan, the citys liquor industry slip to stabilise. Promoting deep development of integrated energy, advanced equipment manufacturing industry, changning district, shale gas production capacity reached 277 million cubic metres, built the countrys first independent high-yield wells and

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論