证明既定关系
给出如下所示的学生成绩统计表
学生\课程 | 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)<table(j,k)
flag=0 标记不满足优于关系
break 直接退出本次循环
end if
end for
if flag==1
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
创建容器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
如果本文对你有帮助,请不要吝惜你的赞哦,这是对作者最大的鼓励