天天看點

等價類算法之連結清單法

☞問題描述:通過自定義輸入n對偶對(偶對中的兩個元素同屬于一類),通過等價類算法程式設計,求出共有哪幾種類并分别列印它們。

☞求解步驟:

思考1.何為等價類?

      定義在集合S上的關系'≡'稱為 集合S上的等價關系,當且僅當它在 S上是自反的reflexive(x=x)、對稱的symmetric(x=y☞y=x)、傳遞的transitive(x=y&&y=z☞z=x)。

思考2.構思資料結構

        我們考慮采用鍊式結構表示。對本應用而言,結點結構中隻需一個資料域和一個鍊域。為了結合随機通路第 i類的優點,用n個單元的數組 seq[n]存放各類頭結點。

      因為在算法的輸出階段,必須有某種機制指明足否已經列印了成員i,是以設定數組put[n],單元内容是 TRUE(未列印)或 FALSE(已列印)。

思考3.算法實作的兩個階段

第一階段:

      讀入等價的成員偶對 (i,j); 我們用前面給出的資料作程式的輸入。while循環結束後,每個關系 j≡i對應兩個結點,每個seq[i]指向一個連結清單,連結清單中的結點是根據輸入得到的同屬j的等價類成員。

第二階段:

      從0開始找出所有形式為 (0,j )的 偶對,其中0,j同屬一個等價類。根據傳遞性,通過偶對 (j,k)可以确定 k與 0也 同屬一個等價類。這個過程持續下去,直到找出、标記、列印包括 0的所有等價類成員。然後同理再确定其它等價類。

☞分解程式設計

1.準備部分

等價類算法之連結清單法

prepare partion

a.定義程式用到的頭檔案;

b.定義宏MAX表示程式最大所能運算的種類

c.定義程式中的資料結構

d.定義帶錯誤處理的記憶體配置設定函數

2.初始化

等價類算法之連結清單法

function of initial

a.根據使用者輸入所需的種類數n,為每一類型定義一個初始節點,其中資料域為類型号(0,n–1),鍊域為空;

b.為每一類的列印标記put[i]賦初始值TRUE

3.讀入偶對

等價類算法之連結清單法

function of inputpairs

a.提示使用者按具體格式輸入偶對

b.判定偶對是否符合輸入結束條件(-1,-1)

c.判定使用者輸入的偶對是否合法并做出處理

4.輸出和處理偶對

等價類算法之連結清單法

output with predeal and deal

a.調用output_predeal函數,輸出未處理前的偶對種類情況

b.依次調用output_deal函數,通過其遞歸設計,輸出最終分類結果

5.輸出

a.處理前的輸出

等價類算法之連結清單法

輸入10個偶對,并輸出未處理前的的分類結果

b.處理後的輸出

等價類算法之連結清單法