乙個不相交資料結構維護了乙個不相交動態集的集合s = ,用乙個代表來標示每個集合,這個代表是集合中的任意乙個元素。
支援一下三種操作:
1、makeset(x):建立乙個新的集合,成員為x,因為各個集合是不相交的,故不出現在任何其他集合中。
2、uinon(x, y):將包含x和y的兩個集合合併成乙個新的集合,即為這兩個集合的並集。
3、findset(x):返回乙個指標,這個指標指向包含x的集合的代表。
乙個實現不相交集合的資料結構是鍊錶表示:每個集合用乙個自己的鍊錶來表示,每個集合的物件包含head屬性和tail屬性,head屬性指向標的第乙個物件,tail屬性指向標的最後乙個物件。集合的代表是鍊錶中第乙個物件的集合物件。
書上寫的findset僅需要沿著x物件的返回指標返回到集合物件,然後返回head指向物件的成員,難道他的x指的是這個結點的指標嗎?哎,我給出的是節點值,得遍歷鍊錶找,花銷為o(n)...因為找到這個節點要遍歷整個集合.....
union是將含有少的結點的集合連線到大的集合中,在每個集合的鍊錶的頭結點中記錄該集合的個數。
但是為了保持資料一致性,我寫的這個實際上data只能是int,才能在頭結點中使用記錄個數的整數t_t,還是寫的很差啊,哎
誰知道到底應該怎麼寫的?
下面是我的。。。
表示的集合是相當於書上演算法導論第三ban326頁的集合
#include #include //#include using namespace std;
template struct linknode
};template class disjlinkset
} //使val成為乙個單獨的集合
void makeset(datatype val)
//找到val所在的集合,並且返回集合的頭結點
lnode *findset(datatype val)
}return null;
} //將較短的表接在較長的表中, 輸入為兩個元素,
//輸出為較長表的表頭結點的head結點的元素值
datatype unionset(datatype vx, datatype vy)
x->data += y->data;
//將y所在鍊錶的表頭清空
y->head = y;
y->tail = y;
y->data = 0;
return x->head->data;
} else
y->data += x->data;
//將x所在鍊錶的表頭清空
x->head = x;
x->tail = x;
x->data = 0;
return y->head->data;
} } //顯示各個集合的元素
void display()
cout << node->data << " ";
}cout << endl;
} cout << "*******************************" << endl;
} //刪除各個集合的元素
void destory()
delete node;
node = null;
}} }
private:
int num; //總共有的元素個數
vectorlnvec; //存放集合的頭結點
static int i; //使每個結點成為單獨集合時使用的陣列序號
};int disjlinkset::i = 0;
int main()
執行結果為:
演算法導論習題解 第21章用於不相交集合的資料結構
習題編號以第3版為準 解 a 根據第7行和第9行,檢查pair總是在其中乙個節點被加黑的時候進行。對於,會在v1被加黑的時候檢查一次,在v2被加黑的時候檢查一次,對於先加黑的節點而言此時另乙個節點尚未加黑,故第10行只會輸出一次。b 對於節點u,lca u 執行完畢時,以u為根的子樹都在同乙個集合裡...
演算法導論筆記 21用於不相交集合的資料結構
在某些應用中,要將 n個不同的元素分成一組不相交的集合。不相交集合上有兩個重要操作,即找出給定的元素所屬的集合和合併兩個集合。一 不相交集合的操作 不相交集合教據結構維護一組不相交的動態集合的集合s 每個集合通過乙個代表來識別,代表是集合中的某個成員,在某些應用中,哪乙個成員被選作代表是無所謂的,但...
第8章 不相交集類
等價關係是滿足下列三個性質的關係r 1.自反性 對於所有的a屬於s,ara。2.對稱性 arb 當且僅當 bra。3.傳遞性 若arb且brc則arc。不相交集合 union 不是最好的方法 1 public class disjsets29 public void union int root1,...