日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

union-find算法分析(1)

發(fā)布時間:2023/12/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 union-find算法分析(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

詳細(xì)解析參照算法(第4版)1.5章——案例研究:union—find算法

1.union-find法的API

public class UF?
UF(int N)以整數(shù)標(biāo)識(0—N-1)初始化N個標(biāo)識
void union(int p,int q)在觸點p和q之間添加一條連接
void find(int p)p所在連通分量的標(biāo)識符(0—N-1)
void connected(int p,int q)判斷觸點p和q是否連通,即p和q是否在同一連通分量
int count()連通分量的數(shù)目

?

2.union-find的實現(xiàn)

1: public abstract class UF { 2: protected int count; 3: protected int[] id; 4:? 5: public UF(int N) { 6: count = N; 27: if (find(i) == pID) 7: id = new int[N]; 8: for (int i = 0; i < N; i++) 9: id[i] = i; 10: } 11: 12: public abstract int find(int p); 13: 14: public abstract void union(int p,int q); 15: 16: public boolean connected(int p,int q){ 17: return find(p) == find(q); 18: } 19: 20: public int count(){ 21: return count; 22: } 23: }

2.1.quick-find算法

1: public class QuickFindUF extends UF { 2:? 3: public QuickFindUF(int N) { 4: super(N); 5: } 6:? 7: @Override 8: public int find(int p) { 9: // TODO Auto-generated method stub 10: // 觸點p為索引,id[p]即是p所在的連通分量的標(biāo)識符 11: return id[p]; 12: } 13:? 14: /** 15: * 如果p和q在同一個連通分量,則p和q連通 否則,要將p和q連通(兩個連通分量合并),即將p的連通分量所有觸點的連通分量改成q的連通分量 16: */ 17: @Override 18: public void union(int p, int q) { 19: // TODO Auto-generated method stub 20: int pID = find(p); 21: int qID = find(q); 22:? 23: if (pID == qID) 24: return; 25:? 26: for (int i = 0; i < id.length; i++) 27: if (find(i) == pID) 28: id[i] = qID; 29: count--; 30: } 31: 32: 33:? 34: }

?

算法分析

?????? 1.union(p,q)會訪問數(shù)組次數(shù)N+3~2N+1

?????? 分析:(1)兩次find()操作,訪問2次數(shù)組

????????????????? (2)掃描整個數(shù)組id[],判斷p和q是否在同一個連通f分量if(find(i)==pID),訪問N次數(shù)組

????????????????? (3)①只有p,其余觸點均不和p在同一連通分量 id[p] =qID,訪問1次數(shù)組

????????????????????? ②除了q本身,其余均和p在同一連通分量 id[i] = qID(i≠q),訪問 N-1次數(shù)組,故總的訪問次數(shù)①2+N+1 = N+3??????? ②2+N+N-1 = 2N+1

?????? 2.在最好的情況下(union(p,q)訪問數(shù)組N+3次),N個整數(shù)要進行N-1次合并union(p,q)操作,訪問數(shù)組(N+3)(N-1)~N^2。

? ? ? ?quick-union算法是平方級別的。

測試結(jié)果

1: public static void main(String[] args) { 2: DirectInput.directInput(args); 3: int N = StdIn.readInt(); 4: UF uf = new QuickFindUF(N); 5: while(!StdIn.isEmpty()){ 6: int p = StdIn.readInt(); 7: int q = StdIn.readInt(); 8: if(uf.connected(p, q) ) continue; 9: uf.union(p, q); 10: StdOut.println(p+ " " + q); 11: } 12: 13: StdOut.println(uf.count() + " components"); 14: }

?

2.2.quick-union算法

1: /** 2: * 以觸點p為索引的數(shù)組id[p]是p所在的連通分量中的另一個觸點q<br> 3: * 即p與q是連通的 4: * 5: * @author YoungCold 6: * 7: */ 8: public class QuickUnionUF extends UF { 9:? 10: public QuickUnionUF(int N) { 11: super(N); 12: } 13:? 14: /** 15: * 找到p的根觸點<br> 16: * 根觸點:符合id[p]=p,即指向自己的觸點,即為根觸點 17: */ 18: @Override 19: public int find(int p) { 20: // TODO Auto-generated method stub 21: while (p != id[p]) 22: p = id[p]; 23: return p; 24: } 25:? 26: /** 27: * 當(dāng)p的根觸點和q的根觸點不同時,說明p和q不在同一個連通分量<br> 28: * 要想p和q連通,即將p(q)的根觸點(id值為本身)指向q(p)的根觸點 29: */ 30: @Override 31: public void union(int p, int q) { 32: // TODO Auto-generated method stub 33: int pRoot = find(p); 34: int qRoot = find(q); 35:? 36: if (pRoot == qRoot) 37: return; 38:? 39: // 將p的根觸點(id值為本身)指向q的根觸點 40: id[pRoot] = qRoot; 41: //每次合并,連通分量的數(shù)目減一 42: count--; 43: } 44:? 45: public static void main(String[] args) { 46: DirectInput.directInput(args); 47: int N = StdIn.readInt(); 48: UF uf = new QuickUnionUF(N); 49: for (int i = 0; i < N; i++) { 50: int p = StdIn.readInt(); 51: int q = StdIn.readInt(); 52: if (uf.connected(p, q)) 53: continue; 54:? 55: uf.union(p, q); 56: StdOut.println(p + " " + q); 57: } 58: StdOut.println(uf.count() + " components"); 59: } 60:? 61: }

(1)與quick-find不同的是,以觸點p為索引的數(shù)組id[]不再表示p所在的連通分量,而是表示p所在的連通分量的另一個觸點(也可能是它本身),當(dāng)它是本身時,該觸點就是根觸點,也就是連通分量所對應(yīng)的樹的根節(jié)點,這種聯(lián)系稱之為鏈接。

(2)森林的表示,實際上id[]數(shù)組用父鏈接的形式表示了一片森林。無論從任何觸點所對應(yīng)的節(jié)點開始跟蹤鏈接,最終都能到達含有該節(jié)點的樹的根節(jié)點(可用數(shù)學(xué)歸納法證明)。

?

算法分析

? ? ? ?1.quick-union算法看似比quick-find算法塊,因為它不需要為每對輸入遍歷整個數(shù)組。

??????? 2.①最好的情況下find(p),僅訪問一次數(shù)組,此時觸點p為根觸點。

????????? ②最壞的情況下find(p),訪問數(shù)組2N-1次

????????????? while(p != id[p]) p = id[p];

???????????? 最壞的情況是觸點p所在的連通分量對應(yīng)的樹退化成線性表而且僅有一個連通分量,而p在線性表的表尾。

???????????? while()循環(huán)的判斷條件要訪問N次數(shù)組,while()循環(huán)的執(zhí)行體要訪問N-1 次數(shù)組(當(dāng)最后一次到達根節(jié)點時,不執(zhí)行循環(huán)體)。共2N-1次。

? ? ? ? 3.由此可見,find(p)訪問數(shù)組的次數(shù),是由觸點p對應(yīng)的節(jié)點在樹的高度所決定的。設(shè)p在樹的中的高度為h,則訪問數(shù)組的次數(shù)為2h+1次。

? ? ? ? 4.假設(shè)輸入的是有序整數(shù)對0-1、0-2、0-3…0-N,N-1對之后的N個觸點將全 部處于同一個連通分量內(nèi)(詳見main()),且由quick-union算法得到的樹的高度為N-1,其中0→1,1→2…N-1→N。

????????? 對于整數(shù)對0-i,執(zhí)行union(0,i),將訪問2i+1次數(shù)組。

????????? ①其中0的根觸點是i-1,高度是i-1,根據(jù)3,find(0)訪問數(shù)組2i-1次

????????? ②其中i的根觸點是i,高度是0,根據(jù)3,find(i)訪問數(shù)組1次

????????? ③將i-1的根觸點(原指向本身,現(xiàn)指向觸點i)的數(shù)組內(nèi)容變成i,訪問數(shù)組1次

????????? PS:書上是2i+2次,我分析是0-i是連通的,這樣0的根觸點是i,i的根觸點是i,find(0)訪問2i+1次,find(i)訪問1次

????????????????? 共2i+2次。

????????????????? 可根據(jù)main()方法,此時0和i應(yīng)該不連通才對。

?????? 5.處理N對整數(shù)所需的所有find()操作訪問是;Σ(1→N)(2i) = 2(1+2+…N) ~N2

? ? ? ? ?可以看出quick-union和quick-find都是平方級別的算法。

?

轉(zhuǎn)載于:https://blog.51cto.com/youngcold/1106992

總結(jié)

以上是生活随笔為你收集整理的union-find算法分析(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩欧美中文一区 | 国产操操操 | 日韩高清不卡在线 | 人人爽人人射 | 久久综合爱 | 久久午夜伦理 | 嫩草私人影院 | 夜夜草av | 成人在线高清 | 欧美一区二区三区免费视频 | 香蕉视频免费网站 | 91丨porny丨露出 | 日一日射一射 | 色小说在线观看 | 精品少妇白浆小泬60P | 日韩成人av免费在线观看 | 香蕉福利视频 | 国产第九页 | 正在播放超嫩在线播放 | 亚洲日本va中文字幕 | 天天夜碰日日摸日日澡性色av | 日本一区视频 | 人妻少妇偷人精品视频 | 97视频一区二区三区 | 成人a级网站 | 97国产在线观看 | 靠逼网站在线观看 | 日本丰满熟妇bbxbbxhd | 国产精品99精品久久免费 | v8888av| 日本在线免费看 | 国产精品国产三级国产专播品爱网 | 国产精品一级黄色片 | 大色综合 | 熊猫成人网 | 麻豆最新网址 | 99国产精品一区二区三区 | 男生桶女生肌肌 | 精品一区二区日韩 | 91tv在线观看 | 久久精品九九 | 日韩精品中文字幕一区 | 大陆农村乡下av | 黑巨茎大战欧美白妞 | 精品热 | 国产精品51麻豆cm传媒 | jizz国产在线观看 | 一区二区小视频 | 毛片在线网站 | 日韩专区在线 | 中文字幕第5页 | 欧美日韩一级二级 | 日韩三级电影网址 | 久久一二三四区 | 国产日产精品一区二区 | 激情一区二区三区 | 成人亚洲精品 | 中国少妇做爰全过程毛片 | 天天插天天狠天天透 | 国产成人免费观看视频 | 亚洲精品视频在线观看免费 | 精品黑人一区二区三区观看时间 | 黄色av观看 | 波多野结衣 在线 | 天堂中文资源在线 | 中文字幕免费在线看线人动作大片 | 美女黄色片网站 | 特级性生活片 | 天堂影音| 亚洲精视频 | 国产成人久久777777 | 国产亚洲精品久久 | 亚洲欧美国产精品久久久久久久 | 性生活一区 | 精品国产一区二区三区性色av | 69视频免费在线观看 | 美女啪啪国产 | 性囗交免费视频观看 | 夜夜嗨aⅴ一区二区三区 | 精品乱码一区二区三区 | 久久国产精品电影 | 青青草免费在线视频 | 欧美精品网站 | 日韩大片在线观看 | 四季av中文字幕 | 日本一二三不卡 | 日韩精品在线播放 | 91无限观看 | 亚洲精品社区 | 亚洲熟女一区二区 | 少妇色视频 | 日韩黄色一区二区 | 久久精品123 | 欧美午夜在线视频 | 国产日韩欧美成人 | 天天想你在线观看完整版高清 | 日产久久久久久 | 亚洲av无码一区二区二三区软件 | 亚洲熟妇一区 |