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

正文內(nèi)容

數(shù)據(jù)結(jié)構(gòu)3清華大學(xué)ppt(編輯修改稿)

2025-02-16 06:34 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 則 x ? z。 37 確定等價(jià)類(lèi)的方法 ? 因此,等價(jià)關(guān)系是集合上的一個(gè)自反、對(duì)稱、傳遞的關(guān)系。 ? “ 相等 ” (=)就是一種等價(jià)關(guān)系 , 它滿足上述的三個(gè)特性 。 ? 一個(gè)集合 S 中的所有對(duì)象可以通過(guò)等價(jià)關(guān)系劃分為若干個(gè)互不相交的子集 S1, S2, S3, … , 它們的并就是 S。 這些子集即為等價(jià)類(lèi) 。 ? 確定等價(jià)類(lèi)的方法分兩步走 : 38 ( i, j ); 。 void equivalence ( ) { 初始化 。 while ( 等價(jià)對(duì)未處理完 ) { 讀入下一個(gè)等價(jià)對(duì) ( i, j )。 存儲(chǔ)這個(gè)等價(jià)對(duì) 。 } 輸出初始化 。 for ( 尚未輸出的每個(gè)對(duì)象 ) 輸出包含這個(gè)對(duì)象的等價(jià)類(lèi) 。 } 39 ? 給定集合 S = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 },及如下等價(jià)對(duì) : 0 ? 4, 3 ? 1, 6 ? 10, 8 ? 9, 7 ? 4, 6 ? 8, 3 ? 5, 2 ? 11, 11 ? 0 ? 進(jìn)行歸并的過(guò)程為: 初始 {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11} 0 ? 4 {0,4},{1},{2},{3},{5},{6},{7},{8},{9},{10},{11} 3 ? 1 {0,4},{1,3},{2},{5},{6},{7},{8},{9},{10},{11} 6 ? 10 {0,4},{1,3},{2},{5},{6,10},{7},{8},{9},{11} 8 ? 9 {0,4},{1,3},{2},{5},{6,10},{7},{8,9},{11} 7 ? 4 {0,4,7},{1,3},{2},{5},{6,10},{8,9},{11} 40 {0,4,7},{1,3},{2},{5},{6,10},{8,9},{11} 6 ? 8 {0,4,7},{1,3},{2},{5},{6,8,9,10},{11} 3 ? 5 {0,4,7},{1,3,5},{2},{6,8,9,10},{11} 2 ? 11 {0,4,7},{1,3,5},{2,11},{6,8,9,10} 11 ? 0 {0,2,4,7,11},{1,3,5},{6,8,9,10} ? 設(shè)等價(jià)對(duì)個(gè)數(shù)為 m, 對(duì)象個(gè)數(shù)為 n。一種可選的存儲(chǔ)表示為單鏈表。 ? 可為集合的每一對(duì)象建立一個(gè)帶表頭結(jié)點(diǎn)的 確定等價(jià)類(lèi)的鏈表方法 49 并查集 (UnionFind Sets) ? 并查集支持以下三種操作: ? Union (Root1, Root2) //合并操作 ? Find (x) //查找操作 ? UFSets (s) //構(gòu)造函數(shù) ? 對(duì)于并查集來(lái)說(shuō),每個(gè)集合用一棵樹(shù)表示。 ? 為此,采用 樹(shù)的雙親表示 作為集合存儲(chǔ)表示。集合元素的編號(hào)從 0到 n1。其中 n 是最大元素個(gè)數(shù)。 50 ? 在雙親表示中,第 i 個(gè)數(shù)組元素代表包含集合元素 i 的樹(shù)結(jié)點(diǎn)。初始時(shí),根結(jié)點(diǎn)的雙親為 1,表示集合中的元素個(gè)數(shù)。 ? 在同一棵樹(shù)上所有結(jié)點(diǎn)所代表的集合元素在同一個(gè)子集合中。 ? 為此,需要有兩個(gè)映射: a) 集合元素到存放該元素名的樹(shù)結(jié)點(diǎn)間的對(duì)應(yīng); b) 集合名到表示該集合的樹(shù)的根結(jié)點(diǎn)間的對(duì)應(yīng)。 51 ? 設(shè) S1= {0, 6, 7, 8}, S2= {1, 4, 9}, S3= {2, 3, 5} ? 為簡(jiǎn)化討論 , 忽略實(shí)際的集合名 , 僅用表示集合的樹(shù)的根來(lái)標(biāo)識(shí)集合 。 集合名 指針 0 S1 1 S2 2 S3 0 4 2 7 6 8 1 9 3 5 4 0 0 0 3 3 4 4 2 2 52 ? 初始時(shí) , 用構(gòu)造函數(shù) UFSets(s) 構(gòu)造一個(gè)森林 , 每棵樹(shù)只有一個(gè)結(jié)點(diǎn) , 表示集合中各元素自成一個(gè)子集合 。 ? 用 Find(i) 尋找 集合元素 i 的根 。 如果有兩個(gè)集合元素 i 和 j, Find(i) == Find(j), 表明這兩個(gè)元素在同一個(gè)集合中 , ? 如果兩個(gè)集合元素 i 和 j 不在同一個(gè)集合中 ,可用 Union(i, j) 將它們合并到一個(gè)集合中 。 下標(biāo) parent 1 1 1 1 1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 53 S1 下標(biāo) parent 集合 S1, S2 和 S3 的雙親表示 4 4 3 2 3 2 0 0 0 4 0 1 2 3 4 5 6 7 8 9 S2 S3 0 7 6 8 0 0 0 4 4 1 9 3 4 4 2 3 5 3 2 2 54 S1 ? S2的可能的表示方法 下標(biāo) parent 集合 S1 ? S2 和 S3 的雙親表示 7 4 3 2 0 2 0 0 0 4 0 1 2 3 4 5 6 7 8 9 0 7 6 8 4 1 9 4 1 9 0 8 7 6 7 7 0 0 0 0 4 4 4 4 4 0 0 0 55 用雙親表示實(shí)現(xiàn)并查集的類(lèi)定義 const int DefaultSize = 10。 class UFSets { //集合中的各個(gè)子集合互不相交 public: UFSets (int sz = DefaultSize)。 //構(gòu)造函數(shù) ~ UFSets() { delete []parent。 } //析構(gòu)函數(shù) UFSetsamp。 operator = (UFSetsamp。 R)。 //集合賦值 void Union (int Root1, int Root2)。 //子集合并 int Find (int x)。 //查找 x的根 void UnionByHeight (int Root1, int Root2)。 //改進(jìn)例程 :壓縮高度的合并算法 private: 56 int *parent。 //集合元素?cái)?shù)組 (雙親表示 ) int size。 //集合元素的數(shù)目 }。 UFSets::UFSets (int sz) { //構(gòu)造函數(shù): sz 是集合元素個(gè)數(shù),雙親數(shù)組的范圍 //為 parent[0]~ parent[size1]。 size = sz。 //集合元素個(gè)數(shù) parent = new int[size]。 //創(chuàng)建雙親數(shù)組 for (int i = 0。 i size。 i++) parent[i] = 1。 //每個(gè)自成單元素集合 }。 57 ? 并查集操作的算法 ? 查找 5 0 1 2 3 0 1 2 3 4 Find (4) Find (3) = 3 Find (2) =2 Find (1) = 1 Find (0) = 0 = 5 0 結(jié)束 58 5 0 1 2 3 parent Parent[4] =3 Parent[3] =2 Parent[2] =1 Parent[1] =0 Parent[0] =5 0 1 2 3 4 int UFSets::Find (int x) { //函數(shù)搜索并返回包含元素 x的樹(shù)的根。 if (parent[x] 0) return x。 //根的 parent[]值小于 0 else return (Find (parent[x]))。 }。 59 void UFSets::Union (int Root1, int Root2) { //求兩個(gè)不相交集合 Root1與 Root2的并 parent[Root1] += parent[Root2]。 parent[Root2] = Root1。 //將 Root2連接到 Root1下面 }。 ? Find 和 Union 操作性能不好。假設(shè)最初 n 個(gè)元素構(gòu)成 n 棵樹(shù)組成的森林, parent[i] = 1。做處理 Union(n2, n1), …, Union(1, 2), Union(0, 1)后,將產(chǎn)生退化的樹(shù)。 60 ? 合并 1 1 1 1 1 0 2 3 4 3 5 0 3 2 1 3 3 4 1 3 3 2 2 0 2 3 1 4 Union(0,1) 2 3 4 1 4 2 1 2 3 4 Union(1,2) Union(2,3) Union(3,4) 61 ? 執(zhí)行一次 Union操作所需時(shí)間是 O(1), n1次Union操作所需時(shí)間是 O(n)。 ? 若再執(zhí)行 Find(0), Find(1), …, Find( n1), 若被搜索的元素為 i,完成 Find(i) 操作需要時(shí)間為 O(i),完成 n 次搜索需要的總時(shí)間將達(dá)到 ? 改進(jìn)的方法 ? 按樹(shù)的結(jié)點(diǎn)個(gè)數(shù)合并 ? 按樹(shù)的高度合并 ? 壓縮元素的路徑長(zhǎng)度 ???nini12OO )()(62 ? 按樹(shù)結(jié)點(diǎn)個(gè)數(shù)合并 ?結(jié)點(diǎn)個(gè)數(shù)多的樹(shù)的根結(jié)點(diǎn)作根 1 1 1 1 1 0 1 2 3 4 1 1 0 7 2 5 6 5 2 2 2 3 3 2 0 1 3 4 5 6 2 3 3 0 2 0 5 6 2 3 1 4 Union(2, 0) 63 void UFSets :: WeightedUnion (int Root1, int Root2) { //按 Union的加權(quán)規(guī)則改進(jìn)的算法 int temp = parent[Root1] + parent[Root2]。 if (parent[Root2] parent[Root1]) { parent[Root1] = Root2。 //Root2中結(jié)點(diǎn)數(shù)多 parent[Root2] = temp。 //Root1指向 Root2 } else { parent[Root2] = Root1。 //Root1中結(jié)點(diǎn)數(shù)多 parent[Root1] = temp。 //Root2指向 Root1 } }。 64 ? 按樹(shù)高度合并 ? 高度高的樹(shù)的根結(jié)點(diǎn)作根 1 1 1 1 1 0 1 2 3 4 1 1 0 3 2 5 6 3 2 2 2 3 3 2 0 1 3 4 5 6 2 3 3 0 2 0 5 6 2 3 1 4 Union(2, 0) 65 Union操作的折疊規(guī)則 ? 為進(jìn)一步改進(jìn)樹(shù)的性能 , 可以使用如下折疊規(guī)則來(lái) “ 壓縮路徑 ” 。 即:如果 j 是從 i 到根的路徑上的一個(gè)結(jié)點(diǎn) , 且 parent[j] ? root[j],則把 parent[j] 置為 root[i]。 0 0 6 7 8 6 7 8 1 9 1 9 3 5 3 5 從 i = 5 壓縮路徑 0 0 0 0 0 0 0 0 7 7 7 9 9 9 8
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1