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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

并查集类的c++封装,比较union_find algorithm四种实现方法之间的性能差别

發布時間:2025/6/15 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并查集类的c++封装,比较union_find algorithm四种实现方法之间的性能差别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述:

在計算機科學中,并查集是一種樹型的數據結構,其保持著用于處理一些不相交集合(Disjoint Sets)的合并及查詢問題。有一個聯合-查找算法union-find algorithm)定義了兩個操作用于此數據結構:

Find:確定元素屬于哪一個子集。它可以被用來確定兩個元素是否屬于同一子集;

Union:將兩個子集合并成同一個集合;

實現并查集的關鍵是實現union-find algorithm, 本文根據常用的四種算法,實現了這個類,具體算法實現請參看維基百科;

制造測試數據集,測試幾種方法之間性能的指標;


程序代碼:


?? ? ? ?

[cpp]?view plaincopy
  • #ifndef?_DISJOINT_SET_H_??
  • #define?_DISJOINT_SET_H_??
  • ??
  • #include?<stdlib.h>??
  • #include?<stdio.h>??
  • #include?<assert.h>??
  • #include?<time.h>??
  • #include?<math.h>??
  • ??
  • #include?"windows.h"??
  • ??
  • ??
  • enum?DISJOINTWAY??
  • {??
  • ????COMMON_WAY,??
  • ????COMPREE_WAY,??
  • ????WEIGHT_WAY,??
  • ????WEIGHT_COMPRESS_WAY??
  • };??
  • ??
  • /*?
  • *?encapsulate?the?class?of?disjoint?set??
  • *?
  • */??
  • ??
  • #define?MAXDISJOINTSET?0xffffff??
  • class?DisjointSet??
  • {??
  • public:??
  • ????DisjointSet(?int?maxSize?=?MAXDISJOINTSET?):m_item(0),?m_size(maxSize)??
  • ????{??
  • ????????m_item?=?new?int[maxSize];??
  • ????????for(?int?i?=?0;?i?<?m_size;?i++?)??
  • ????????{??
  • ????????????m_item[i]?=?i;??
  • ????????}??
  • ??
  • ????????m_path?=?new?int[maxSize];??
  • ????????memset(?m_path,?1,?sizeof(int)*maxSize?);??
  • ????}??
  • ??
  • ????~DisjointSet()??
  • ????{??
  • ????????Clear();??
  • ????}??
  • ??
  • ????/*?
  • ????*?find?interface??
  • ????*?
  • ????*/??
  • ????int?Find(?DISJOINTWAY?way,?int?input?)??
  • ????{??
  • ????????assert(?input?<??m_size?);??
  • ????????switch(?way?)??
  • ????????{??
  • ????????case?COMMON_WAY:??
  • ????????????return?ImplFindFirst(?input?);??
  • ????????case?COMPREE_WAY:??
  • ????????????return?ImplFindSecond(?input?);??
  • ????????case?WEIGHT_WAY:??
  • ????????????return?ImplFindWeight(?input?);??
  • ????????case?WEIGHT_COMPRESS_WAY:??
  • ????????????return?ImplFindWeightCompree(?input?);??
  • ????????default:??
  • ????????????return?-1;??
  • ????????}??
  • ????}??
  • ??
  • ??
  • ????/*?
  • ????*?make?union?
  • ????*?
  • ????*/??
  • ????void?Union(?DISJOINTWAY?way,?int?first,?int?second?)??
  • ????{??
  • ????????assert(?first?<?m_size?&&?second?<?m_size?);??
  • ????????switch(?way?)??
  • ????????{??
  • ????????case?COMMON_WAY:??
  • ????????????ImplUnionFirst(?first,?second?);??
  • ????????????break;??
  • ????????case?COMPREE_WAY:??
  • ????????????ImplUnionSecond(?first,?second?);??
  • ????????????break;??
  • ????????case?WEIGHT_WAY:??
  • ????????????ImplUnionWeighted(?first,?second?);??
  • ????????????break;??
  • ????????case?WEIGHT_COMPRESS_WAY:??
  • ????????????ImplUnionCompree(?first,?second?);??
  • ????????????break;??
  • ????????default:??
  • ????????????break;??
  • ????????}??
  • ??????????
  • ????}??
  • ??
  • ????/*?
  • ????*?
  • ????*?
  • ????*/??
  • ????void?Clear()??
  • ????{??
  • ????????delete?[]?m_item;??
  • ????????m_item?=?0;??
  • ??
  • ????????delete?[]?m_path;??
  • ????????m_path?=?0;??
  • ??
  • ????????m_size?=?0;??
  • ????}??
  • ??
  • protected:??
  • ??
  • ????int?ImplFindFirst(?int?input?)??
  • ????{??
  • ????????assert(?input?<?m_size??);??
  • ????????return?m_item[input];??
  • ????}??
  • ??
  • ????int?ImplFindSecond(?int?input?)??
  • ????{??
  • ????????int?i?=?input;??
  • ????????for(?;?i?!=?m_item[i];?i?=?m_item[i]?);??
  • ??
  • ????????return?i;??
  • ????}??
  • ??
  • ????int?ImplFindWeight(?int?input?)??
  • ????{??
  • ????????int?i?=?input;??
  • ????????for(?;?i?!=?m_item[i];?i?=?m_item[i]?);??
  • ??????????
  • ????????return?i;??
  • ??
  • ????}??
  • ??
  • ????int?ImplFindWeightCompree(?int?input?)??
  • ????{??
  • ????????int?i?=?input;??
  • ????????for(?;?i?!=?m_item[i];?i?=?m_item[i]?)??
  • ????????????m_item[i]?=?m_item[m_item[i]];??
  • ??
  • ????????return?i;??
  • ????}?????
  • ??
  • ????/*?
  • ????*?
  • ????*?
  • ????*/??
  • ????void?ImplUnionFirst(?int?first,?int?second?)??
  • ????{??
  • ????????int?x?=?m_item[first];??
  • ????????int?y?=?m_item[second];??
  • ??
  • ????????if(?x?!=?y?)??
  • ????????{??
  • ????????????m_item[first]?=?y;??
  • ????????}??
  • ??
  • ????????for(?int?i?=?0;?i?<?m_size;?i++?)??
  • ????????{??
  • ????????????if(?x?==?m_item[i]?)??
  • ????????????????m_item[i]?=?y;??
  • ????????}??
  • ????}??
  • ??
  • ????/*?
  • ????*?
  • ????*?
  • ????*/??
  • ????void?ImplUnionSecond(?int&?first,?int&?second?)??
  • ????{??
  • ????????if(?first?!=?second?)??
  • ????????{??
  • ????????????m_item[first]?=?second;??
  • ????????}??
  • ????}??
  • ??
  • ????/*?
  • ????*?
  • ????*?
  • ????*/??
  • ????void?ImplUnionWeighted(?int?first,?int?second?)??
  • ????{??
  • ????????if(?first?!=?second?)??
  • ????????{??
  • ????????????if(?m_path[first]?<?m_path[second]?)??
  • ????????????{??
  • ????????????????m_item[first]?=?second;??
  • ????????????????m_path[second]?+=?m_path[first];??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????m_item[second]?=?first;??
  • ????????????????m_path[first]?+=?m_path[second];??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????/*?
  • ????*?
  • ????*?
  • ????*/??
  • ????void?ImplUnionCompree(?int?first,?int?second?)??
  • ????{??
  • ????????if(?first?!=?second?)??
  • ????????{??
  • ????????????if(?m_path[first]?<?m_path[second]?)??
  • ????????????{??
  • ????????????????m_item[first]?=?second;??
  • ????????????????m_path[second]?+=?m_path[first];??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????m_item[second]?=?first;??
  • ????????????????m_path[first]?+=?m_path[second];??
  • ????????????}??
  • ????????}??
  • ??
  • ??
  • ????}??
  • ??
  • protected:??
  • ??
  • ????int*???m_item;??
  • ????int????m_size;??
  • ??
  • ????int*???m_path;??
  • ??
  • };??
  • ??
  • void?TestDisjointSetSimple()??
  • {??
  • ????DisjointSet?djoint;??
  • ????int?i?=?djoint.Find(?COMMON_WAY,?1?);??
  • ????int?j?=?djoint.Find(?COMMON_WAY,?3?);??
  • ????if(?i?!=?j?)??
  • ????????djoint.Union(?COMMON_WAY,?1,?3?);??
  • ??
  • ????i?=?djoint.Find(?COMMON_WAY,?2?);??
  • ????j?=?djoint.Find(?COMMON_WAY,?5?);??
  • ????if(?i?!=?j?)??
  • ????????djoint.Union(?COMMON_WAY,?i,?j?);??
  • ??
  • ????i?=?djoint.Find(?COMMON_WAY,?2?);??
  • ????j?=?djoint.Find(?COMMON_WAY,?6?);??
  • ????if(?i?!=?j?)??
  • ????????djoint.Union(?COMMON_WAY,?i,?j?);??
  • ??
  • ????i?=?djoint.Find(?COMMON_WAY,?6?);??
  • ????j?=?djoint.Find(?COMMON_WAY,?7?);??
  • ????if(?i?!=?j?)??
  • ????????djoint.Union(?COMMON_WAY,?i,?j?);??
  • ??
  • ????assert(?djoint.Find(?COMMON_WAY,?2?)?==?djoint.Find(?COMMON_WAY,?7?)?);??
  • ??
  • ????i?=?djoint.Find(?COMMON_WAY,?1?);??
  • ????j?=?djoint.Find(?COMMON_WAY,?7?);??
  • ????if(?i?!=?j?)??
  • ????????djoint.Union(?COMMON_WAY,?i,?j?);??
  • ??
  • ????assert(?djoint.Find(?COMMON_WAY,?3?)?==?djoint.Find(?COMMON_WAY,?7?)?);??
  • }??
  • ??
  • void?TestDisjointSetComplex(?DISJOINTWAY?way,?const?char*?str?)??
  • {??
  • ??????
  • ????unsigned?long?start?=?GetTickCount();??
  • ????DisjointSet?djoint;??
  • ??
  • ????const?int?len?=?1000000;??
  • ????const?int?base?=?60000;??
  • ????int?halfLen?=?len?/?2;??
  • ????srand(?time(NULL)?);??
  • ????for(?int?i?=?0;?i?<?len;?i++?)??
  • ????{??
  • ????????int?first?=?rand()?%?base;??
  • ????????int?second?=?rand()?%?base;??
  • ????????if(?i?>?halfLen?)??
  • ????????{??
  • ????????????first?+=?base;??
  • ????????????second?+=?base;??
  • ????????}??
  • ??
  • ??
  • ????????if(?first?!=?second?)??
  • ????????{??
  • ????????????first?=?djoint.Find(?way,?first?);??
  • ????????????second?=?djoint.Find(?way,?second?);??
  • ????????????if(?first?!=?second?)??
  • ????????????????djoint.Union(?way,?first,?second?);??
  • ??
  • ??
  • ????????????assert(?djoint.Find(?way,?first?)?==?djoint.Find(?way,?second?)??);??
  • ????????}??
  • ????}??
  • ??
  • ????unsigned?long?interval?=?GetTickCount()?-?start;??
  • ????printf("?%s?way?consume?time?is?%d?\n",?str,?interval?);??
  • ??
  • }??
  • ??
  • void?TestSuiteDisjointSet()??
  • {??
  • ????TestDisjointSetSimple();??
  • ??
  • ????const?char*?str[]?=?{"common",?"compress",?"weight",?"weight?compress"};??
  • ????for(?int?i?=?WEIGHT_COMPRESS_WAY;?i?>=?0;?i--)??
  • ????{??
  • ????????TestDisjointSetComplex((DISJOINTWAY)i,?str[i]?);??
  • ????}??
  • ??
  • }??
  • ??
  • ??
  • ??
  • ??
  • #endif???
  • compile and run in visual studio 2005

    下面圖片是幾種方法運行時間之比較,最直白方法的時間到現在還沒輸出,所以就沒有顯示:

    總結

    以上是生活随笔為你收集整理的并查集类的c++封装,比较union_find algorithm四种实现方法之间的性能差别的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 福利视频一区 | 中文字幕在线字幕中文 | 182tv福利视频 | 最近中文字幕av | 亚洲三级免费观看 | 日本熟妇成熟毛茸茸 | 国产精品一级视频 | 一二三区免费视频 | 青青青青青草 | 男人的天堂色 | 色小说综合| 亚洲国产成人va在线观看天堂 | 在线观看久 | 在线观看黄色免费视频 | av黄色免费观看 | 精品一区二区三区久久 | 91亚洲国产成人精品性色 | 欧美激情91 | 男人的av | 午夜精品国产精品大乳美女 | 在线免费精品视频 | 三年大全国语中文版免费播放 | 国产精品69久久久久 | 午夜91视频 | 夫妻露脸自拍[30p] | 在线免费视频你懂的 | 两性囗交做爰视频 | 亚洲综合色自拍一区 | 超碰超碰97| 女人17片毛片60分钟 | 色综合中文网 | 五月婷六月 | 91国产视频在线观看 | 欧美一区二区三区婷婷 | 欧美成年人网站 | 黄页网站在线 | 亚洲二区在线观看 | 亚洲第一中文字幕 | 久久精热| 每日在线观看av | 制服.丝袜.亚洲.中文.综合 | 日韩免费一级 | 手机看片日韩 | 精品一区二区三区在线免费观看 | 欧美视频在线观看一区 | 在线观看视频福利 | 国产精品刘玥久久一区 | 午夜影院免费体验区 | 亚洲欧洲色 | va在线视频 | 免费观看成年人视频 | 91人人澡人人爽人人精品 | 91精品国产综合久久久蜜臀九色 | 欧美三级又粗又硬 | 一级美女视频 | 陪读偷伦初尝小说 | 一区二区在线不卡 | 色爽 | 91在线小视频 | 激情伦成人综合小说 | 精品国产99一区二区乱码综合 | 国产一级一区 | 色天堂视频 | 禁片天堂 | av自拍偷拍 | 久久99国产精品久久99果冻传媒 | 天天射寡妇 | 中国女人内谢69xxxx | 加勒比久久综合 | 狠狠搞视频 | 日韩av一区在线观看 | 日韩中文字幕高清 | 99精品热| 国产精品久久久午夜夜伦鲁鲁 | 欧美亚洲在线播放 | 日本老熟妇毛茸茸 | 放荡的美妇在线播放 | 日本久久久久久久久久 | 成人在线观看你懂的 | 激情内射人妻1区2区3区 | 欧美亚洲日本一区 | 午夜伦伦电影理论片费看 | 女女h百合无遮涩涩漫画软件 | 免费视频中文字幕 | 韩国无码一区二区三区精品 | 天天干天天添 | 久久新网址| 青青免费视频 | cao国产| 欧美视频a| 人人澡人人爱 | 国产精品自产拍在线观看 | 欧美另类极品videosbest使用方法 | 日本成人久久 | 九九精品视频在线观看 | 波多野结衣导航 | 久操中文 | 久久久久免费视频 | 噜噜噜精品欧美成人 |