離線等價類問題

2021-08-21 16:32:17 字數 1353 閱讀 5270

等價類是滿足自反性,傳遞性的一組關係,其具有find和union兩個方法。這之前我們已經說過了。

這裡我們介紹的離線等價類是find的公升級版本,find只找尋root,而離線等價尋找,乙個等價類的所有元素。

其原理就是首先隨便尋找乙個等價類元素,然後利用傳遞性去把所有和他相關的元素找出來。

int main()

cout

<<"enter number of relations"

>r;

if(r<1)

arraylist* list=new arraystack[n+1];//這是個陣列,陣列的每個元素都是乙個棧

//輸入r個關係儲存到表中

int a,b;//a,b是乙個關係對

for(int i=1;icout

<<"enter next relation/pair"

>a>>b;

list[a].push(b);

list[b].push(a);

}arraystackunprocessedlist;//用來儲存種子。

bool *out=new

bool[n+1];//用來判斷元素i是否被輸出

for(int i=1;i<=n;i++)

out[i]=false;

//輸出等價類

for(int i=1;i<=n;i++)

if(!out[i])//如果i沒有被輸出,則啟動乙個新類。}}

cout

<<"end of list of equivalent calsses"

0;}

內部的第乙個while迴圈完成後將輸出乙個等價類。下面進行一些例項講解

假如n=9,r=11.且11個關係對為(1,5)(1,6)(3,7)(4,8)(5,2)(6,5)(4,9)(9,7),(7,8)(3,4)(6,2)

則: list[1]=[5,6]

list[2]=[5,6]

list[3]=[7,4]

list[4]=[8,9,3]

list[5]=[1,2,6]

list[6]=[1,2,5]

list[7]=[3,9,8]

list[8]=[4,7]

list[9]=[4,7]

首先i=1;將1推入棧中且設定為輸出然後

將5,6推入棧中且刪除list[1]且將5,6設定為輸出然後檢查list[5]將1,2,6壓入棧中並設定為輸出,然後檢查list[1]為空跳過,然後檢查2發現[5,6]但是五六已經輸出所以不再壓入棧中。繼續檢查找出所有的相關元素。

將找到的元素全部設為輸出之後不再處理,沒找到的壓入棧,並設定為true以後不再進行處理。

Python 離線等價類

離線等價類的概念見離線等價類 最近在清洗資料的時候涉及到要將相似度比較高的資料夾合併,特徵比對得到是1 1的對,比如 a,b c,d a,c 那麼合併的時候就涉及到將這些等價的對合併成乙個大類,直觀上這就是乙個離線等價類的問題。import os import pickle with open r ...

堆疊應用(五) 離線等價類

例子 假定 n 1 4,r 我們忽略了所有形如 a a 的關係,因為按照反身屬性,這些關係是隱含的。同樣也忽略了所有的對稱關係。比如 1 11 r,按對稱屬性應有 11,1 r。其他被忽略的關係是由傳遞屬性可以得到的屬性。例如根據 7 11 和 11 1 2 應有 7,12 r。如果 a b r,則...

計算等價類

首先,什麼是等價關係 等價關係是集合元素間的一種代數關係,用字母e來表示,對於乙個集合中的兩個元素,如果他們之間存在一種等價關係,那麼必須滿足以下性質 1.自反性,對於任意乙個元素x,它與自己存在等價關係,即 x,x 滿足e 2.對稱性,如果 x,y 滿足 e,那麼 y,x 也屬於e 3.傳遞性,如...