freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

數(shù)據(jù)結(jié)構(gòu)與算法c語言版第2版下ppt(編輯修改稿)

2024-11-14 15:43 本頁面
 

【文章內(nèi)容簡介】 以采用十字鏈表法進行存儲。此方法將有向圖的鄰接表和逆鄰接表合并。有向圖的十字鏈表的結(jié)點結(jié)構(gòu)如圖 。 圖 十字鏈表結(jié)點示意圖 鄰接多重表 ? 鄰接多重表采用與十字鏈表相似的結(jié)構(gòu)來存儲無向圖,將一條邊的兩個頂點均放在同一個鏈表中,這樣就將尋找同一條邊的兩個頂點的操作變得簡單。 鄰接多重表的結(jié)點結(jié)構(gòu)如圖 。 ? 鄰接多重表有以下兩個特征。 所有依附于同一頂點的邊被串聯(lián)到同一個鏈表中。 由于每個邊有兩個頂點,因此每條邊又被串聯(lián)到兩個鏈表中。 圖 鄰接多重表的結(jié)點示意圖 圖 的 遍 歷 深度優(yōu)先遍歷 廣度優(yōu)先遍歷 深度優(yōu)先遍歷 ? 圖的深度優(yōu)先遍歷算法 (depthfirst search)類似于樹的先序遍歷算法,其基本思想是:初始時,設(shè)圖中的所有頂點均未曾訪問到,首先從圖中某個頂點 v0出發(fā),訪問此頂點,然后依次從 v0的鄰接點出發(fā)深度優(yōu)先遍歷圖,直至圖中所有和 v0有路徑相通的頂點都被訪問到;若此時尚有頂點沒有被訪問到,則從中選取一個頂點作為起始點,重復(fù)上述過程,直至圖中所有頂點均被訪問到為止。 ? 對圖進行深度優(yōu)先遍歷時,有下面兩點需要注意。 圖采用鄰接表進行存儲時,一個圖的深度優(yōu)先序列不唯一。 鄰接矩陣表示的圖確定起始結(jié)點后,其深度優(yōu)先序列唯一。 廣度優(yōu)先遍歷 ? 圖的廣度優(yōu)先遍歷 (breadthfirst search)類似于樹的按層次遍歷的過程。其基本思想是:初始時,圖中的所有頂點均未曾訪問過。首先,從圖的某個頂點 v0出發(fā),訪問了 v0之后,依次訪問的 v0個未曾訪問過的鄰接頂點,然后分別從這些鄰接頂點出發(fā),廣度優(yōu)先遍歷圖,直至圖中所有已被訪問過的頂點的鄰接點都已訪問過。如果圖中仍存在沒有訪問過的頂點,則從中選取一個作為起始點,重復(fù)上述過程,直到圖中不存在未被訪問過的頂點。圖 。 圖 廣度優(yōu)先遍歷過程 圖的連通性 無向圖的連通性 有向圖的連通性 無向圖的連通性 根據(jù)圖的連通性的定義,有這樣的結(jié)論:如果一個圖是連通的,當且僅當從任一結(jié)點出發(fā),進行深度優(yōu)先遍歷均可訪問到每一個結(jié)點。 深度優(yōu)先生成樹的構(gòu)造步驟如下。 (1) 深度優(yōu)先生成樹的樹根是 A,是圖中第一個被訪問到的結(jié)點。 (2) 當遍歷到圖的一條邊 (vi, vj)時,如果 vj是未訪問過的,那么就將樹的結(jié)點 vi建立一條邊來表示圖的這一條邊 (vi, vj)。 (3) 當遍歷到圖的一條邊 (vi, vj)時,如果 vj是已訪問過的,那么就將樹的結(jié)點 vi建立一條虛邊來表示這一條邊。 (4) 重復(fù)步驟 (2)、 (3),直到圖中的所有結(jié)點均訪問完。 有向圖的連通性 如果有向圖 G中,若對于 V(G)中任意兩個不同的頂點 vi和 vj,都存在從 vi到 vj以及從 vj到 vi的路徑,則稱 G是強連通圖。 求強連通分量有 3種算法,分別是 Kosaraju算法、 Gabow算法和Tarjan算法。這里只介紹 Kosaraju算法。 Kosaraju算法的步驟很簡單,只有以下兩步,這里假設(shè)有向圖采用十字鏈表的結(jié)構(gòu)進行存儲。 (1)首先對圖 G進行一次 DFS,并記錄下回溯的順序。 (2)把圖 G的有向邊反向,得到圖 G′ ,并沿回溯順序倒序,再進行一次DFS,所提的深度優(yōu)先樹即為強連通分量的劃分。 最小生成樹 基本概念 Prim算法 Kruskal算法 基本概念 ? 對于連通的帶權(quán)圖 (連通圖 )G,其生成樹也是帶權(quán)的。生成樹 T各邊的權(quán)值總和稱為該樹的權(quán),記作: 這里, TE表示 T的邊集, w(u, v)表示邊 (u, v)的權(quán)。權(quán)最小的生成樹稱為 G的最小生成樹 (Minimum Spannirng Tree, MST)。 ? 最小生成樹有以下性質(zhì): 設(shè) G=(V, E)是一個連通網(wǎng)絡(luò), U是頂點集 V的一個真子集。若 (u, v)是一條具有最小權(quán)值的邊,其中 u∈ U, v∈ VU,則一定存在 G的一棵最小生成樹包括此邊 (u, v)。 E( , )( ) ( , )u v TW J W u v?? ? Prim算法 Prim算法是采用最小生成樹性質(zhì)來構(gòu)造最小生成樹,其算法步驟如下。 設(shè)圖 G =(V, E),其生成樹的頂點集合為 U。 (1)把 v0放入 U。 (2)在所有 u∈ U, v∈ VU的邊 (u, v)∈ E中找一條最小權(quán)值的邊,加入生成樹。 (3)把第 (2)步中找到的邊的 v加入 U集合。如果 U集合已有 n個元素,則結(jié)束;否則繼續(xù)執(zhí)行第 2步。 Kruskal算法 ? Kruskal算法與 Prim算法正好相反,它是連續(xù)地按照最小的權(quán)選擇邊,并且當所選擇的邊不產(chǎn)生環(huán)時,就把它作為取定的邊。其算法步驟如下所示。 ? 設(shè)圖 G =(V, E),其生成樹 T的頂點集合也為 V,邊集合為 TE。 (1)在 E中選擇代價最小的邊,若該邊依附的頂點落在 T中不同的連通分量上,則將此邊加入 TE;否則舍棄,而選擇下一條代價最小的邊。 (2)若 T中有 |V|1條邊,結(jié)束;否則轉(zhuǎn)步驟 (1)。 最 短 路 徑 從某個頂點到其余各頂點的最短路徑 所有點對最短路徑 從某個頂點到其余各頂點的最短路徑 ? 求一個帶權(quán)有向圖 G中,頂點 0到其他頂點的最短路徑。其最直觀的一個算法是先求出所有以 0為起點、 n為終點的路徑,比較它們的長度,長度最短的路徑即為所取最小的路徑。 ? 稱路徑上的第一個頂點為源點 (source),最后一個頂點為終點(destination)。設(shè) S為最短路徑已確定的頂點集, VS是最短距離尚未確定的頂點集。 (1)初始時,將源點 v0添加到頂點集 S中,即 S={v0}。 (2)重復(fù)以下工作,按路徑長度遞增次序產(chǎn)生各頂點的最短路徑。 所有點對最短路徑 ? 有時想要求解所有點對的最短路徑,對于這個問題,最直觀的一個算法就是對每一個頂點采用 Dijkstra算法,這樣整個算法的時間復(fù)雜度將達到 O(n3)。在這里將介紹由 Floyd提出的另一種算法,雖然它的時間復(fù)雜度也是 O(n3),但是它在形式上更簡單些。 ? Floyd算法仍采用帶權(quán)鄰接矩陣表示的圖,它通過一個三重循環(huán),產(chǎn)生一個存儲每個結(jié)點最短距離的矩陣。兩個頂點的最短距離有以下 3種情況。 ? (1) 最短路徑為兩個頂點之間的直達路徑。 ? (2) 最短路徑為兩個頂點之間通過一個中間點相連以后的距離最短。 ? (3) 最短路徑為兩個頂點之間通過兩個以上的中間頂點相連以后而得到的距離最短。 Floyd算法的基本思想如下。 (1)初始化時,用 D[v][w]=G[v][w]。 (2)依次掃描每一個點,查看是否有通過此頂點后,頂點對的 D[v][w]值更小的路徑,如果有則更新 D[v][w]。 (3)所求得的 D[v][w]即為每個點對最小路徑的長度。 有向無環(huán)圖的應(yīng)用 拓撲排序 求解關(guān)鍵路徑 拓撲排序 拓撲排序 (topplogical sort)是一種操作,它從某個集合上的一個偏序求出該集合上的全序。簡單地說,拓撲排序就是將集合上的元素按某種關(guān)系進行排序。拓撲排序的定義中的偏序和全序的定義如下。 若集合 X上的關(guān)系 R是自反的、反對稱的和傳遞的,則稱 R是集合 X上的偏序 (partial order)關(guān)系。 設(shè) R是集合 X上的偏序關(guān)系,如果對于每個 x, y∈ X必有 xRy或 yRx,則稱 R是集合 X上的全序 (total order)關(guān)系。 求解拓撲排序的方法很簡單,其基本思想如下: (1)選擇圖中沒有前驅(qū)的頂點 v開始遍歷。 (2)輸出頂點 v。 (3)刪除頂點 v,若存在以 v為尾的弧,則將其刪除。 (4)重復(fù)步驟 (1)~ (3),直到圖中的頂點均已全部輸出,或者圖中不存在無前驅(qū)的頂點為止。 求解關(guān)鍵路徑 路徑長度最長的路徑叫做關(guān)鍵路徑 (critical path)。 求解關(guān)鍵路徑的算法步驟如下。 (1)輸入 e條弧 j, k,建立 AOE網(wǎng)的存儲結(jié)構(gòu)。 (2)從源點 v1出發(fā),令 ve(1)=0,按拓撲有序求 ve(j) 2≤ j≤n 。如果得到的拓撲有序序列中頂點個數(shù)小于網(wǎng)中的頂點個數(shù),則說明 AOE網(wǎng)存在環(huán),不能求解關(guān)鍵路徑,算法終止。否則執(zhí)行步驟 (3)。 (3)從匯點 vn出發(fā),令 vl(n)=ve(n),按逆拓撲有序求 vl(i), 1≤ j≤ n1。 (4)根據(jù)各頂點的 ve和 vl值,求每條弧 s(活動 )的最早開始時間 e(s)和最晚開始時間 l(s),其中 e(s)=l(s)為關(guān)鍵活動。 第 8章 查 找 本章主要內(nèi)容 線性表上的查找 樹上的查找 哈希表 線性表上的查找 順序表上的查找 有序表上的查找 索引順序表上的查找 線性表上的查找算法比較 順序表上的查找 ? 順序表或者線性鏈表上的查找用順序查找算法來實現(xiàn),順序查找算法是從序列的最后一個元素開始從后往前依次進行比較,如果匹配則查找成功,如果直到所有的記錄都比較過仍然沒有匹配則查找失敗。 ? 下面給出順序查找的算法 void straipass(int * SqList, int key,int len) { SqList[0]=key。 //設(shè)置監(jiān)視哨 //從右至左查找第一個與 key匹配記錄的位置 for(int i=len。Sqlist[i]!=key。i)。 return i。 //如果返回值為 0則查找失敗,否則查找成功 } 有序表上的查找 折半查找又稱為二分查找,它要求線性表是有序的,即表中的結(jié)點按關(guān)鍵字有序進行排列,并且需要采用一維數(shù)組進行存儲。 折半查找的基本思想如下。 假設(shè) L[low..high]為當前的查找區(qū)間。 (1) 首先確定該區(qū)間中點位置。即 mid=[(low+high)]。 (2) 將待查找的 k值與 L[mid].key進行比較,如果 k=L[mid].key,則查找成功,返回此位置;否則,需要確定新的查找區(qū)間,在新的查找區(qū)間中繼續(xù)進行折半查找,直至找到關(guān)鍵字為 k的結(jié)點,或者直至當前的查找區(qū)間為空 (即查找失敗 )時停止。 ①如果 kL[mid].key,則待查找的 k值必定在子區(qū)間 L[low..mid1]中,因此新查找的區(qū)間為 L[low..mid1]。 ②如果 kL[mid].key,則待查找的 k值必定在子區(qū)間 L[mid+1..high]中,因此新查找的區(qū)間為 L[mid+1..high]。 索引順序表上的查找 索引順序查找又稱為分塊查找 (blocking search)。
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1