一些關係(離散數學中的)的程式設計思想

makerjack001發表於2020-12-12

證明既定關係

給出如下所示的學生成績統計表

學生\課程A₁A₂……An
X₁A₁(X₁)A₂(X₁)…………
X₂A₁(X₁)A₂(X₁)…………
…………………………
Xm………………An(Xm

根據學生的學習成績,寫出求解獲取所有學生的集合上序關係的演算法描述:即 若學生Xi,在所有課程上的成績都優於學生Xj,則學生對(Xi,Xj)滿足序關係,這一序關係以矩陣的形式輸出。

思路

有n個學生,就構建一個n行n列的學生矩陣,比對每個學生與其他學生的關係
滿足“序關係”(成績全方面超過別人)就置為1,否則置為0

虛擬碼形式如下:

Input 學生成績統計表
獲取成績表中學生人數m,課程數目n
初始化學生矩陣student_matrix(m,m)為零矩陣

for i=1:m 
    for j=1:m 
        if 第i個學生所有成績 > 第j個學生所有成績
            student_matrix(i,j)=1; 
        end	if
    end	for
end	for
Output student_matrix

證明等價關係

給定一個m×m的矩陣M,用以表示定義在集合A上的一個二元關係,設計演算法用以判斷這一矩陣所表示的二元關係是否滿足等價關係

思路

等價關係分三步:自反、對稱、傳遞
自反性用一次for迴圈,遍歷關係矩陣M對角線上元素即可
對稱性用兩次for迴圈,遍歷M中(i,j)為1的部分,判斷(j,i)是否為1
傳遞性用三層for迴圈,遍歷M中(i,j)為1且(j,k)為1的部分,M(i,k)是否為1

虛擬碼形式如下:

Input 關係矩陣M,矩陣規模m

定義函式 reflective: 引數M,m
	for i=1:m
		if M(i,i)!=1
			return false
		end if
	end for
	return true
end

定義函式 symmetric: 引數M,m
	for i=1:m
		for j=1:m
			if M(i,j)==1 and M(j,i)!=1
				return false
			end if
		end for
	end for
	return true
end

定義函式 transitive: 引數M,m
	for i=1:m
		for j=1:m
			for k=1:m
				if M(i,j)==1 and M(j,k)==1 and M(i,k)!=1
					return false
				end if
			end for
		end for
	end for
	return true
end

主函式:
if reflective(M,m)and symmetric(M,m)and transitive(M,m)
	output 這是一個等價關係
else
	output 這不是一個等價關係
end if

證明關係的劃分

給定一個m×m的矩陣M用以表示一個等價關係,該等價關係是定義在集合A上的,即|A|=m,設計演算法求得這個等價關係所對應的劃分。

思路

首先了解等價關係對應的劃分
通俗來講
等價關係→劃分:彼此滿足關係的元素構成一個集合(block),所有的block組成對應的劃分
比如關係對(1,1)(1,2)(2,1)(2,2)構成集合{1,2},關係對(3,3)構成集合{3}那麼整個關係(1,1)(1,2)(2,1)(2,2)(3,3)對應的劃分就是{{1,2},{3}}
劃分→等價關係:劃分中的每個block自己與自己形成笛卡爾積,其元素就形成關係對,所有關係對合起來就是對應的等價關係,例子我就不舉了,傳送門裡面說的很詳細

回到題目,要求關係對應的劃分,根據關係矩陣找出每個關係對形成的block,所有block合併就是對應的劃分

虛擬碼如下:

Input 等價關係矩陣M,矩陣長度m,集合A
for i=1:m
	for j=1:m
		if M(i,j)==1
			block中加入A(j)
		end if
	end for
	block內元素去重
	Output block
	block清空
end for

找尋LUB和GLB

給定一個非空有限偏序集(A,≤),設計演算法求解A中任意兩個元素最小上邊界儲存在矩陣MLUB中,設計演算法求解A中任意兩個元素最大下邊界,儲存在矩陣MGLB中。

思路

這裡要用到一個推論(證明很簡單,我就不證了)
a∨b=b,當且僅當a≤b
a∧b=a,當且僅當a≤b
所以遍歷整個集合A
對每個元素i,再遍歷集合A一次
用A(i)對比A(j),如果滿足A(i)≤ A(j),則A(i)存入MGLB中第(i,j)位,A(j)存入MLUB第(i,j)位。
輸出MLUB 和 MGLB

虛擬碼如下:

Input 集合A
求出A的模m
for i=1:m
	for j=1:m
		if A(i)和A(j)滿足≤關係
			GLB(i,j)=A(i)
			LUB(i,j)=A(j)
		end if
	end for
end for
Output GLB 和 LUB

如果本文對你有幫助,請不要吝惜你的贊哦,這是對作者最大的鼓勵

相關文章