⑴ 涓岖浉浜ら泦 (disjointSet)
鍦ㄦ暟鎹缁撴瀯镄勫囧欎笘鐣岄噷锛DisjointSet锛堜笉鐩镐氦闆嗭级</锛屽傚悓涓搴фˉ姊侊纴杩炴帴镌鍏幂礌镄勭瓑浠峰叧绯汇傚畠镄勬牳蹇冩搷浣滐纴Find鍜孶nion锛岀姽濡傛帰绱㈣糠瀹镄勬寚鍗楅拡锛屽紩棰嗘垜浠鐞呜В闆嗗悎镄勫悎骞朵笌镆ユ垒銆备粖澶╋纴鎴戜滑灏嗘洿娣卞叆鍦版帰绱㈠叾涓镄刄nion杩愮畻锛屽挨鍏舵槸濡备綍浼桦寲Find镎崭綔锛屾彁鍗囨晥鐜囥
𨱍宠薄涓涓嬶纴姣忎釜鍏幂礌灏卞儚涓涓镫鐗圭殑瀛楁瘝锛岃娈isjointSet鏄鎴戜滑镄勫瓧姣嶈〃锛岄氲繃涓嬫爣𨱒ユ爣璁版疮涓鍏幂礌镓灞炵殑闆嗗悎銆傚綋阆囧埌Find镎崭綔镞讹纴鎴戜滑镄勭洰镙囨槸镓惧嚭瀛楁瘝x镓鍦ㄧ殑瀛楁瘝琛ㄣ傚叧阌鍦ㄤ簬锛屾垜浠鍏虫敞镄勪笉鏄鍝涓瀛楁瘝鏄鍝涓锛岃屾槸瀹冧滑鏄钖﹀叡浜钖屼竴涓瀛楁瘝琛锛岃繖涓镣瑰湪Find(a)==Find(b)镄勭瓑寮忎腑寰椾互浣撶幇銆
绠鍗曞湴钖埚苟涓や釜闆嗗悎锛Union镎崭綔</鍙鑳芥樉寰楃洿瑙傦纴浣嗗綋鎴戜滑瑕侀珮鏁埚湴澶勭悊澶ч噺鍏幂礌镞讹纴闂棰桦氨鍑虹幇浜嗐傛瘆濡傦纴濡傛灉鐩存帴镓ц孶nion(4,5)锛屽彲鑳戒细瀵艰嚧娣卞害镆ユ垒锛孎ind镄勬ц兘鐡堕堢敱姝ゆ樉鐜般备负浜呜В鍐宠繖涓闂棰桡纴鎴戜滑寮曞叆浜嗘寜澶у皬鍜岄珮搴﹁繘琛屽悎骞剁殑绛栫暐銆
鎸夊ぇ灏忔眰骞</镄勬敼杩涚増涓锛屾垜浠阃氲繃姣旇缉闆嗗悎镄勫ぇ灏忔垨楂桦害𨱒ュ喅瀹氩悎骞剁殑鏂瑰悜锛岄伩鍏崭笉蹇呰佺殑阃掑綊銆傝繖镙凤纴鍗充娇澶氭℃墽琛孶nion锛孎ind(8)镄勬煡镓炬椂闂翠篃浼氭樉镢楃缉鐭銆傝璺寰勫帇缂杩欎竴绛栫暐锛屽氨鏄鍦‵ind镎崭綔涓娣诲姞镵鏄庣殑浼桦寲锛屼娇寰楁疮娆℃煡镓鹃兘灏介噺鍑忓皯灞傜骇锛屽ぇ澶ф彁楂樻晥鐜囥
璺寰勫帇缂╀笌鎸夊ぇ灏忔眰骞舵槸鐩歌緟鐩告垚镄勶纴瀹冧滑鍏卞悓鎻愬崌浜嗙畻娉旷殑镐ц兘銆傜劧钥岋纴璺寰勫帇缂</涓鎸夐珮搴︽眰骞骞朵笉瀹屽叏鍏煎癸纴锲犱负铡嬬缉钖庣殑缁撴瀯闅愯棌浜嗛珮搴︿俊鎭锛岃繖鍦ㄥ悓镞朵娇鐢ㄦ椂闇瑕佽皑鎱庡勭悊锛屾湁镞朵细鍒╃敤涓涓浼拌″硷纴濡傜З锛屾潵杈呭姪鍐崇瓥銆
鍦ㄨ繖涓鎺㈢储镞呯▼涓锛屾垜浠涓嶆柇浼桦寲锛岃拷姹傛晥鐜囦笌绮剧‘镐х殑骞宠銆傞氲繃鐞呜ВDisjointSet镄勬疮涓缁呜妭锛屾垜浠涓崭粎鑳借В鍐冲疄闄呴梾棰桡纴镟磋兘棰嗙暐鏁版嵁缁撴瀯镄勫阀濡欎箣澶勚傝╂垜浠涓璧峰湪浠g爜镄勪笘鐣屼腑锛岄嗙暐FindUnion绠楁硶镄勭簿杩涗笌榄呭姏钖э紒
⑵ 克鲁斯卡尔算法是怎样判断是否构成了回路
使用遍历方法,同时存储他们的父亲节点,如果父亲节点不一样,就说明有回路
⑶ 使用加权规则和压缩规则实现UNION和FIND算法
UNION(1,2);UNION(3,4);UNION(5,6);UNION(7,8);UNION(1,3);UNION(5,7);
FIND(8); 输出结果是5;
UNION(1,5);
FIND(8); 输出结果是1.
我所理解的Find(i)算法是将含有i的parent暂时(在合并的过程中的父母)记住,然后继续合并一些集合之后在进行查找,就可以在刚刚所求得的parent的基础上继续查找,提高了效率。