當我們畫乙個80*50的迷宮時相當於是畫了個80*50的方格仔,把格仔和格仔之間的某些牆拆掉,互相連通的格仔我們稱之為屬於同乙個集合,如果兩個集合不連通,那就稱之為不相交集.
畫迷宮的過程就是不斷地拆除格仔與格仔之間的牆,直到第乙個格仔和最後乙個格仔屬於同乙個集合演算法終止.
不相交集類.
#ifndef _disjsets_h
#define _disjsets_h
#include using namespace std;
class disjsets;
#endif
類的實現
#include "disjsets.h"
disjsets::disjsets(int numelems):s(numelems)
int size=width*height;
srand((unsigned)time(null));
disjsets labyrinth(size);
vector> grap(size);
for(;;)
} grap[size-1].first=grap[size-1].second=1; //最後那一格仔的右面和下面的牆都要拆掉
for(int i=0;i=0 && x=size)
else if((x+1)%width==0)
else
} return ret;
}
執行 利用不相交集實現等價元素的聚類
說到聚類,相信大家最先想到的應該是k means,但是我們知道k means必須指定聚類的個數,而且聚類初始點的選取也很大影響最後聚類的效果。雖然有一些方法 如k means 可以設定較為合理的初始聚類點,但仍然需要指定聚類的個數,但有時我們並不知道一堆資料中有多少個類,這樣就使得聚類變得沒法下手。...
不相交集ADT
1.不相交集是解決等價關係的一種資料結構,執行合併和查詢的速度都非常快,m次執行合併和查詢的執行時間為 m logn 在乙個集合中,對於每一對元素 a,b a,b s,對於關係r如果滿足下面三個條件,則成關係r為等價關係 1 自反性 對於所有a s,ara 2 對稱性 arb當且僅當bra 3 傳遞...
不相交集ADT
首先我們必須明白不相交集這種資料結構是用來幹什麼的。不相交即主要用來實現動態等價問題的求解。動態 等價問題 這裡不再說明等價關係的概念,這個可以參考數理邏輯之類的書。假設我們有乙個集合和乙個等價關係 針對集合中的任意兩個元素 a 和 b,我們如何確定他們有等價關係 即a b.那麼我們需要等價類的概念...