高級數(shù)據(jù)結(jié)構(gòu)2_第1頁
高級數(shù)據(jù)結(jié)構(gòu)2_第2頁
高級數(shù)據(jù)結(jié)構(gòu)2_第3頁
高級數(shù)據(jù)結(jié)構(gòu)2_第4頁
高級數(shù)據(jù)結(jié)構(gòu)2_第5頁
已閱讀5頁,還剩151頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、JYP,1,雙連接組件(6.4.2),雙連接組件對連接性的要求比一般的連接組件更高,生成雙連接組件的操作更復(fù)雜。假設(shè)無向圖G是連通的,雙連通分量的形式定義如下。定義:G的頂點V是一個連接點。當且僅當從G中刪除V及其相關(guān)邊時,剩余圖至少有兩個連通分量。例如,JYP,2,在下面的連通圖G6中,頂點1、4和7是連接點。定義:雙連通圖是沒有連接點的連通圖。例如,圖G5是雙連接的:JYP,4,但是圖G6不是雙連接的。在通信網(wǎng)絡(luò)圖中,邊代表通信鏈路,頂點代表通信站,關(guān)節(jié)明顯是弱鏈路。定義:連通圖G的雙連通分量是圖G的最大雙連通子圖,JYP,5,圖G6包含四個雙連通分量,如下所示:JYP,6,不難發(fā)現(xiàn)同一圖

2、的兩個雙連通分量最多有一個公共頂點??梢酝茢?,一條邊不能出現(xiàn)在兩個或更多的雙連通分量中。因此,圖G的二部分被分成E(G)。圖G的雙連通分量可以通過圖G的任何深度最優(yōu)教師樹形成來獲得,JYP,7,以及圖G6,其根是頂點0,如下所示:JYP,8,其中非樹邊緣由虛線表示。頂點旁邊的數(shù)字稱為頂點的深度優(yōu)先數(shù),簡稱為dfn。頂點的dfn表示在深度優(yōu)先搜索中訪問頂點的順序。例如,在前一個G6生成樹中,dfn(0)=1,dfn(1)=2,dfn(7)=5。請注意,在深層最佳教師樹中,如果頂點u是v的祖先,則dfn(u) dfn(v)。JYP,9,與生成樹t相比,當且僅當u是v的祖先或v是u的祖先時,非樹邊(

3、u,v)是后邊。例如,(4,1)和(6,7)是后邊緣。不是后邊緣的非樹邊緣稱為水平邊緣。根據(jù)深度優(yōu)先搜索定律,與任何圖形的任何深度相比,圖形不可能有水平邊。因此,10歲的JYP,如果至少有兩個孩子,那么作為一名優(yōu)秀教師的根就有必要也有足夠的理由成為一個連接點。任何其他頂點u成為連接點的充要條件是u至少有一個子w,這使得通過僅由w、w的后代和返回邊組成的路徑到達u的祖先是不可能的,因為刪除頂點u及其相關(guān)的邊將使w及其后代與u的祖先斷開連接。JYP,11,假設(shè)頂點w的祖先包括w本身。為了表示一個頂點可以通過它的后代和一個后邊緣到達的最高祖先,對于圖G的每個頂點W,low(w)被定義為可以通過它的后

4、代和一個后邊緣從W到達的最高祖先的dfn。很明顯,low(w)是從w通過其子代和后沿可以到達的dfn中最低的,并且可以通過以下公式計算:low(w)=min dfn(w),min low(x)| x是w的子代,min dfn(x)| (w,x)是后沿,JYP,12以下是在G6的以頂點0為根的深度最優(yōu)樹中每個頂點的dfn和低值:JYP,13。通過修改DFS,可以獲得用于計算連通圖的每個頂點的dfn和低值的函數(shù)dfnlow:虛圖:3360 dfnlow(常數(shù)int x)/DFS num=1在頂點x的開始處;/num是類型為int的圖形的數(shù)據(jù)成員dfn=新int n;低=新國際號碼;/dfn和low

5、都是Graph的數(shù)據(jù)成員,其/類型為int * for(int I=0;I n;I)dfni=lowi=0;DfnLow (x,-1);/x是根,其父是偽頂點-1刪除dfn刪除low,jyp,14,void graph :dfnlow (int u,int v)/搜索深度首先從u和/計算dfn和low。v是u dfnu=lowu=num的父級;對于(與u相鄰的每個頂點w)/如果(dfnw=0) /w是未訪問的頂點DfnLow (w,u),則特定代碼與圖的表示有關(guān);lowu=min2 (lowu,loww);/min2(x,y)返回x和y/else if (w!=v) lowu=min2 (lo

6、wu,dfnw);/回到邊緣。注/這意味著(v,u)不是后沿,JYP,15歲。請注意,如果v是u的父代,則(u,v)不能是后沿。函數(shù)DfnLow(u,v)的參數(shù)v旨在區(qū)分這種情況。深度優(yōu)先搜索的第一個頂點x沒有父頂點,因此它的調(diào)用形式是DfnLow(x,1)。函數(shù)DfnLow(u,v)使用的另一個函數(shù)min2返回兩個參數(shù)中較小的一個。JYP,16,在DfnLow的基礎(chǔ)上進一步處理后,連通圖的邊可以分成雙連通分量。請注意,當DfnLow(w,u)返回時,loww已被計算。如果為lowwdfnu,則可以確定新的雙連接組件。雙連通分量的所有邊都可以通過在堆棧中存儲第一個遇到的邊來獲得。JYP,17,

7、讓深度優(yōu)先搜索中最近訪問的頂點是u,并且頂點w與u相鄰,但不是u的直接父代,那么在以下兩種情況下,(u,w)是第一個遇到的邊:(1)w是未訪問的頂點(2)w是已經(jīng)訪問的頂點和u的祖先,因為未訪問的頂點的dfn值初始化為0,所以祖先的dfn值小于后代的dfn值。JYP,18,注意:如果dfnw為dfnu,則邊(w,u)必須作為后邊(當在w點時)添加到堆棧中,如下所示:u,x,w,2,3,4,JYP,19,雙連接函數(shù)實現(xiàn)上述過程:void dfn=new intn低=新國際號碼;對于(int I=0;一. 1 .dfnu=lowu=num,JYP,20,對于(與u相鄰的每個頂點w)/具體的代碼與圖

8、if (v!=w /后沿/表示結(jié)束,JYP,21,雙連接時間復(fù)雜度為0(n e)。請注意,雙連通函數(shù)假設(shè)輸入連通圖至少有兩個頂點。只有一個頂點的連通圖是無限的,但根據(jù)定義,它們也是雙連通的。這可以特別處理。JYP,22歲,求解最小生成樹的Prim算法(6.5.2),假設(shè)TV是所選頂點的集合,t是最小生成樹的所選邊的集合。Prim算法首先在圖G中選擇一個頂點U,并將U添加到TV中。然后將成本最低的邊(u,v)加到T上,這樣T (u,v)仍然是一棵樹。重復(fù)上述步驟,直到t包含n 1條邊。請注意,與(u,v)相關(guān)的兩個頂點必須一個在電視中,另一個不在電視中。JYP,23歲,普里姆算法的幀:電視=0;

9、/從頂點0開始,假設(shè)g至少有一個頂點(T=;t包含少于n -1條邊;把(u,v)加到(t)上,使(u,v)成為一條滿足電視需求的、電視成本最低的邊;如果(沒有這樣的邊緣)斷裂;給電視添加視頻;如果(T包含少于n-1條邊)結(jié)束“沒有最小生成樹”;JYP,24歲,下圖中用Prim算法構(gòu)造最小生成樹的過程:JYP,25歲,JYP,26歲,JYP,27歲,JYP,28歲,讓它成為不屬于TV的頂點集。對于任何v,將nearv定義為電視中最小化成本的頂點(nearv,v)(如果(v,w)E,讓成本(v,w)=),然后成本(nearv,v)=。下一臺電視的頂點v應(yīng)該滿足:v和成本(近v,v)=。下一個增加t

10、的邊自然是(nearv,v)。JYP,29,設(shè)w為v in的頂點。頂點v加入電視后,如果成本(nearw,w)成本(v,w),則nearw變?yōu)関。如果圖G由鄰接矩陣costij表示,算法的時間復(fù)雜度為0(N2),因為算法總共選擇了n 1個頂點,并且只需要0(n)個時間來選擇每個頂點V并處理V對Nearw(其中W和V是相鄰的)的影響。JYP,30,如果圖g由鄰接表表示并且使用斐波那契堆,算法的性能會更好。對于v,distv=cost(nearv,v)被定義為從頂點v到構(gòu)造的部分最小生成樹的最近距離。每次將頂點添加到電視時,算法需要確定頂點v,以便v和distv=。這對應(yīng)于上的刪除最小元素操作。當

11、v被添加到電視時,與v in相鄰的頂點的距離值可能會減小。這對應(yīng)于上的關(guān)鍵字縮減操作。JYP,31歲,關(guān)鍵字縮減操作的總數(shù)最多是圖形中的邊數(shù)。刪除最小元素的操作總數(shù)是n 1。最初,有n 1個頂點。如果dist被用作關(guān)鍵字,并且組織是Fibonacci堆,則需要n 1個插入操作來初始化Fibonacci堆。然后,需要執(zhí)行n 1次刪除最小元素和最多E次關(guān)鍵詞縮減。所有這些操作的成本是每個操作的分攤成本的總和,即O(n log n e)。因此,該算法的時間復(fù)雜度變成了0。當e比n2小得多時,這顯然是一種改進。斐波那契堆在最短路徑算法中的應(yīng)用,首先回憶經(jīng)典的最短路徑算法:1空圖:3360最短路徑(常數(shù)

12、int n,常數(shù)int v) 2為(int I=0;I n;i ) 3 si=假;disti=lengthvi4 if (i!=v,JYP,33,10表示(int w=0;w n;w ) 11 if(!SW)12 if(distu length uw distw)distw=distu length uw;path w=u;13/(I=0;)結(jié)束14,jyp,34,分析:第2行中的for循環(huán)需要0(n)時間。第7行中的for循環(huán)執(zhí)行n次,每次選擇第8行并更新第10至12行中的dist值需要0(n)個時間。因此,該循環(huán)的總時間為0(N2)。整個算法的時間為0(N2)。即使使用鄰接表,行10到12

13、的總時間也可以減少到0(e)(因為只有與U的頂點相鄰的距離可以改變),并且行8的總時間仍然是0(N2)。JYP,35,算法的時間復(fù)雜度可以通過使用斐波那契堆和鄰接表降低到0(n log n e)。每次迭代,我們需要確定頂點u,以便u和distu=。這對應(yīng)于上的刪除最小元素操作。隨著u被加到s上,與u相鄰的頂點的距離值可能會減小。這對應(yīng)于上的關(guān)鍵字縮減操作。36歲的JYP最初包含n 1個頂點。如果dist被用作關(guān)鍵字,并且組織是Fibonacci堆,則需要n 1個插入操作。然后,需要執(zhí)行n 2次刪除最小元素和最多E次關(guān)鍵詞縮減。所有這些操作的成本是每個操作的分攤成本的總和,即O(n log n

14、e)。因此,該算法的時間復(fù)雜度為0。當e比n2小得多時,這種實現(xiàn)顯然更好。調(diào)查問題:P223 23(每個學生獨立完成并提交一份報告作為本課程的主要成績因素),JYP,37,基于鏈表和映射表的排序結(jié)果排序(7.8)。對于基于鏈表的結(jié)果排序,有時需要在本地重新排列它們,以使它們在物理上是連續(xù)的。讓我們假設(shè)記錄表r0,rn-1的排序結(jié)果是一個按照關(guān)鍵字的非遞減順序鏈接的鏈表,并且首先是鏈表的第一個記錄指針。R0和Rfirst的交換將被記錄。如果第一個值為0,則表中應(yīng)該有一個鏈接字段值為0的記錄Rx。如果Rx的鏈接字段可以被修改為指向最初位于R0中的記錄的第一個新位置,那么剩余的記錄R1、RN-1也以

15、關(guān)鍵字的非遞減順序被鏈接。JYP,38歲,但是在單鏈表中,我們不能快速確定節(jié)點R0的前身Rx。因此,R0的鏈接字段可以設(shè)置為first,表示原來位于R0的記錄已經(jīng)移動到Rfirst。這樣,R0也充當了R1的虛擬節(jié)點,rn-1鏈表。有了這個虛擬節(jié)點,我們可以找到剩余記錄鏈表的第一個節(jié)點。重復(fù)上述過程n1次以完成重排。通常,假設(shè)記錄表r0、Ri-1已經(jīng)以物理順序排列,并且Rfirst是剩余記錄Ri、rn-1的鏈表中的第一個記錄。在記錄ri和Rfirst被交換后,新的ri記錄的鏈接字段被設(shè)置為first,表示最初位于Ri的記錄已經(jīng)移動到Rfirst。39歲的JYP。同時,注意,第一,即剩余記錄的鏈表的第一記錄索引ri,rn-1,總是大于或等于I。我們可以通過虛擬節(jié)點找到剩余記錄的鏈表的第一記錄索引。函數(shù)列表實現(xiàn)上述方法:模板空列表(element * list,const int n,int first)/對鏈表中由first指向的記錄進行重新排序,使list0,list n-1/中的關(guān)鍵字按(int I=0;I n1;/找到應(yīng)該放在位置I的記錄.由于位置0、1和1-1處的記錄已經(jīng)/就位,記錄索引必須為1,同時(第一個1)第一個=列表第一。鏈接;/通過虛擬節(jié)點,JY

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論