一些关系(离散数学中的)的算法设计思想

证明既定关系

给出如下所示的学生成绩统计表

学生\课程 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 学生成绩统计表table
获取成绩表中学生人数m,课程数目n
初始化学生矩阵student_matrix(m,m)为零矩阵

for i=1:m 
    for j=1:m 
    	flag=1
        for k=1:m
        	if table(i,k)

证明等价关系

给定一个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,设计算法求得这个等价关系所对应的划分。

思路

首先了解等价关系对应的划分
一些关系(离散数学中的)的算法设计思想_第1张图片

通俗来讲
等价关系→划分:彼此满足关系的元素构成一个集合(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
创建容器partition 和 block
for i=1:m
	for j=1:m
		if M(i,j)==1
			block中加入A(j)
		end if
	end for
	for b in partition
		if block 与b有交集
			block与b取并集存储在b中
		end if
	end for
	if block与partition每个元素都没交集
		partition加入block
	end if
	block清空,准备下一轮存储
end for
Output partition

找寻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

如果本文对你有帮助,请不要吝惜你的赞哦,这是对作者最大的鼓励

你可能感兴趣的:(笔记,算法)