集合論雜記——關系的性質


“函數”是高中課本就有的概念,“關系”是大學離散數學里研究集合元素的聯系時出現的更常見的概念。上課的時候其實大部分內容沒有難度,給人“廢話”的感覺,但是還是有些東西超出了高中的認知,還有些與程序設計結合起來后認識更深了。

什么是關系

關系(relation):有集合\(A,B\),那么\(A\times B\)(直積)的任意子集都是一個\(A\to B\)的關系。關系相當於一個可以一對多的函數,每個A中元素可對應B中多個元素,每個B中元素可以對應A中任意元素。任取A中一個元素x和B中一個元素y,x和y要么是“有關系”,要么是“沒有關系”。用\(xRy\)表示存在關系\(\langle x,y\rangle\)也可以選擇用謂詞\(f(x,y)\)表示x和y是否有關系,有則為真,無則為假。

關系可以用“連線圖”來表示,也可以用矩陣來表示,比如\(\{1,2,3\}\to\{1,2,3,4\}\)上的小於關系:

image

關系的逆很好理解,將箭頭倒轉就可以,關系的復合就是在右側加上第二列連線到第三列,那么能從第一列連到第三列的所有元素對就是復合關系,這與函數的理論是基本一致的。

自反,對稱與傳遞

對於一個自身上的映射(即\(A\times A\)上),幾個耳熟但不能詳的名詞:

  • 自反(reflexive):任意\(x\in A\)都有\(xRx\),那么A就是自反關系,即每個元素都有到自己的關系。
  • 非自反(inreflexive):任意\(x\in A\)都有\(x/ \hspace{-0.6em}Rx\),那么A就是非自反關系,即每個元素都不存在到自己的關系。顯然集合只能是自反,非自反,和兩者都不是中的一種。
  • 對稱(symmetric):任意\(xRy\),則必有\(yRx\),那么A就是對稱關系,對稱關系也可以用“逆關系等於自身”來描述。
  • 反對稱(antisymmetric):任意\(xRy\),若有\(yRx\),則必有\(x=y\),即不存在兩個不同元素有互相的對稱關系。但是可以指向自身,因此有些關系可以既對稱又反對稱。
  • 傳遞(transitive):任意\(xRy\)\(yRz\),則必有\(xRz\),那么A就是傳遞關系,傳遞關系也可以用\(R^2\subseteq R\)來表述(\(R^2\)表示R與R的復合\(R\cdot R\))。

構造關系閉包

關系閉包提出的問題是:給定任意關系\(R\),並在\(R\)基礎上添加最少的關系,如何把\(R\)變成具有給定性質的關系?

創建一個自反閉包很簡單,把所有\(xRx\)加上就可以;創建對稱閉包也很簡單,對於每個\(xRy\),如果\(yRx\)不存在,加上就可以。

那么傳遞閉包呢?傳遞閉包的結論是:構造\(R_t=R\cup R^2 \cup R^3\cup...\),得到的\(R_t\)即為包含R的傳遞閉包關系。

證明兩邊相等:先證右屬於左,用歸納法證明,右側\(R^1\subseteq R_t\)顯然;假設\(R^n\subseteq R_t\),那么任意\(\langle x,y\rangle\in R^{n+1}=R^n\cdot R\),都應該存在\(z\)使\(\langle x,z\rangle\in R\wedge \langle z,y\rangle\in R^n\),而\(R,R^n\subseteq R_t\),所以\(\langle x,z\rangle,\langle z,y\rangle\)都是\(R_t\)的元素,由傳遞集合性質\(\langle x,y\rangle\in R_t\)

再證左屬於右,任意\(R\cup R^2 \cup R^3\cup...\)中的元素一定在某一個\(R^i\)中,設有\(\langle x,z\rangle\in R_s\)\(\langle z,y\rangle\in R_t\),顯然有\(\langle x,y\rangle\in R_{s+t}\)也在集合中,因此\(R\cup R^2 \cup R^3\cup...\)就是傳遞的,它比最小閉包\(R_t\)大或相等。因此等式成立。

這個結論是正確的,同時也是可計算的,含有n個元素的集合,最多有\(2^{n^2}\)種可能的關系,所以右邊的集合一定會出現重復,數量是有限的。

傳遞關系與Warshell算法

傳遞關系要求\(f((x,y)\wedge f(y,z))\to f(x,z)\)\(R\)相當於x直接走到z,\(R^2\)相當於x走兩步到z,以此類推,只要最終x能走到z,就有\(f(x,z)=1\),我們用下面的流程計算\(R\cup R^2 \cup R^3\cup...\)(假設有n個元素):

  1. \(k = 1\)
  2. 枚舉所有\(\langle i,j\rangle\in n\times n\),若\(f_{k-1}(i,k)\wedge f_{k-1}(k,j)\),則令\(f_k(i,j)=1\)。(這里的\(f_k\)指不超過k步能走到)
  3. 遞增k,重復運算到k大於n。

每一次k取A的枚舉解出\(R\cup...R^A\),代表求解i能否在A步以內走到j,由於A步以下的答案都已經求解,若i能在A-1步內走到k,k能在A-1步內走到j,那么i就可以走到j。復雜度為\(O(n^3)\)

剛剛一直在用“走到”來描述一次關系變換,其實這個問題是可以抽象為一個圖論問題的,關系就是一張有向圖,每個圖能走到的所有點全部加起來就是傳遞閉包。在實際編程中,上述算法的第一維可以省略,這樣就變成了Floyed算法。

//Floyed
for (int k = 1; k <= n; k++)
	for (int i = 1; i <= n; i++)
	for (int j = 1; j <= n; j++)
		f[i][j] = f[i][k] | f[k][j];

img

等價,偏序與擬序

介紹了自反,對稱與傳遞,下面得說說他們存在的意義了。

等價關系(equivelance):滿足自反,對稱,傳遞的關系即為等價關系。自然數的“等於”是典型的等價關系。假設有集合\(\{1,2,3,4,5,6,7,8\}\),顯然只有\(eq(x,x)=1, eq(x,y)=0\)每個元素只和自己相等。“模3等於”也是等價關系,此時模3得1的數互相關系,模3得2的數互相關系,模3得0的數互相關系,他們之間卻都沒有關系。

容易發現,等價關系將集合中的元素進行了“分組”,組內是全聯通的,任意兩元素都等價,而組間都沒有關系,數的等於是等價關系,矩陣的相似等一樣是等價關系,都是按照性質分類帶來的結果。

img

偏序關系(partial order):滿足自反,反對稱,傳遞的關系即為偏序關系,自然數的“小於等於”是典型的偏序關系,整數的整除關系也是典型的偏序關系。

擬序關系(quasi order):滿足非自反和傳遞的關系即為擬序關系(顯然是反對稱的),“小於”是典型的擬序關系。

偏序和擬序的差別在於有無自反。省略到自己的關系,在偏序或擬序關系下,由於反對稱性,元素會形成一張有向無環圖。對於“小於”來說,所有元素形成了一條鏈,這就是排序的基礎。

img

關系的規則與程序設計

“自然數的等於”是等價關系的典型,“自然數的小於”是擬序關系的典型。這樣的規則一方面便於我們記憶,另一方面解釋了這些關系的本質。

而第三個方面,我們要確保使用小於和等於時滿足這些性質。比如在C++里,使用map和set需要支持==號,使用sort需要一個小於號,如果你重載了自定義類型的比較運算符號,就一定要確保它滿足對應的性質。比如重載小於號的時候,一定要保證重載出的符號滿足非自反性和傳遞性,只有這樣才能把全體元素連成一條鏈,按鏈上的大小規則排序,否則(比如使用了小於等於號導致自反或者出現\(a<b,b<c,c<a\)的情況)將不能正確排序。

典型例題:洛谷 P2123 皇后游戲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM