在線等價類與離線等價類(概念)


1.定義:等價類是指相互等價的元素的最大集合。

2.在線等價類

  ⑴ 初始時,只有n個元素,每個元素屬於一個獨立的等價類。

  ⑵需要執行以下操作:

              把包含a,b的等價類合併成一個類combina(a,b);  確定哪個類包含元素e,即確定兩個元素是否在同一Find(e);不同類返回不同結果。combina(a,b) 等效i=Find(a), j=Find(b); if(i!=j) Union(i,j);

  ⑶解決方案: 將每個集合(類)描述爲一棵樹,採用鏈表的方法來描述樹。每個節點必須有一個parent域,但不必有children域 。節點內的數字是其parent域的值,節點外的數字爲其索引。索引同時也就是該節點所表示的元素。根節點的 parent域被置爲0;



  ⑷代碼實現:

         int Find(int e)

           {

                 while(!root[e])

                      e= parent[e];

                 returne;

         }

高度規則:若樹i的高度小於樹j的高度,則將j作爲i的父節點。

重量規則:若樹i的節點數大於樹j的節點數,則將j作爲i的父節點。

在合併算法中,每個節點上增加 一個布爾域root,若當前節點爲跟節點,則其root域爲true,

每個根節點的parent域用來保存該樹中節點的總數。

             voidUnion(int i, int j)    //將根爲i,j的兩棵樹進行合併;

             {  

                 if(parent[i]< parent[j])

                 {

                                   parent[j]+= parent[i];

                                   root[i]= false;

                                   parent[i]= j;

                            }    

                            else

                            {

                                   parent[i]+= parent[j];

                                   root[j]= false;

                                   parent[j]= i;

                            }

              }

路徑壓縮:

 int Find(int e)

{

      Int j = e;

      while(!root[j])   //搜索根節點

           j =parent[j];

       int f =e;

      while(f!=j)

      {

              Int pf= parent[f];

              Parent[f]= j;

              F =pf;

      }

      return j;

}

3.離線等價類

  離線等價類的輸入時元素數目n,關係數目r以及r對關係,問題的目標是吧n個元素分配至相應的等價類中。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章