最小函數依賴集的求解
一、定義
最小函數依賴集也稱為極小函數依賴集、最小覆蓋;如果函數依賴集 F 滿足下列條件,則稱 F 為一個最小依賴集。
- F 中任意函數依賴的右部僅含有一個屬性
- F 中不存在這樣的函數依賴X→A,使得 F 與 F - {X→A}等價,即 F 中的函數依賴均不能由 F 中其他函數依賴導出
- F 中不存在這樣的函數依賴X→A,X有真子集 Z 使得 F - {X→A} ∪ {Z→A}與 F 等價,即 F 中各函數依賴左部均為最小屬性集(不存在冗余屬性)
二、算法步驟:
- 將 F 中的所有函數依賴的右邊化為單一屬性
- 去掉 F 中的所有函數依賴左邊的冗余屬性(只針對F中左部不是單一屬性的函數依賴)
- 去掉 F 中的所有冗余的函數依賴
三、例子說明
假設R<U , F> ,U = ABCD,函數依賴集F={A→BD,AB→C,C→D},求:F 最小函數依賴集
第一步:將F中的所有函數依賴的右邊化為單一屬性:
因為F = {A→BD,AB→C,C→D},函數依賴右邊化為單一屬性得:F = {A→B,A→D,AB→C,C→D};
第二步:去掉F中的所有函數依賴左邊的冗余屬性(只針對F中左部不是單一屬性的函數依賴)
F={A→B,A→D,AB→C,C→D}中只有函數依賴AB→C左部不是單一屬性,所以要對其進行去掉左邊冗余屬性的處理:
- 先看A是不是冗余屬性:因為BF+ ={ B }不包含A,所以A屬性不冗余 //這里應該注意的是,要看哪一個屬性是否是冗余屬性,則求該函數依賴左部除要查看的屬性外的其他屬性的集關於 F 的閉包是否包含要查看屬性
- 再看B是不是冗余屬性:因為AF+ ={A,B,C,D} 包含的B,所以B屬性冗余
因此只將函數依賴AB→C左部B屬性去掉,所以F={A→B,A→D,A→C,C→D}。
第三步:去掉 F 中的所有冗余的函數依賴
依據引理:設F為屬性集U上的一組函數依賴,X,Y ⊆ U,X→Y 能由 F 根據Armstrong公理導出的充分必要條件是Y⊆ XF+ 。即判斷 F 中一個函數依賴X→Y是否冗余,則只需要判定 Y 是否為的XF+ 子集。
因為有F={A→B,A→D,A→C,C→D}:
- 先看判斷函數依賴A→D是否冗余,則把函數依賴A→D從F={A→B,A→D,A→C,C→D}中去掉后得F={A→B,A→C,C→D},求得AF+ = { A,B,C,D} 包含了D,所以為函數依賴A→D冗余,所以應該從F={A→B,A→D,A→C,C→D}中去掉函數依賴A→D,得F={A→B,A→C,C→D}
- 再從F={A→B,A→C,C→D}依次判斷每一個函數依賴是否冗余,直至所有冗余的函數依賴都被消除。本例子中經過第1步后已消除 F 中的所有冗余函數依賴了,因此原F={A→BD,AB→C,C→D}的最小函數依賴集為 F ={A→B,A→C,C→D}。
注意點:
- F的最小依賴集F m 不一定是唯一的,它與對個函數依賴FDi 及X→A中個屬性的處置的順序有關。在本例子中在去掉F中的冗余的函數依賴時(綠色字體那一步)若不是首先判斷A→D是否冗余,而是首先判斷其它函數依賴是否冗余,那么所得的最小函數依賴就可能不同了
- 要搞清楚在判斷一個函數依賴X→A是否為冗余時,是求X關於上一步所求得的新的函數依賴集 F 的閉包XF+ ,然后在判斷A是否包含在該XF+