目录

第一关:求给定集合的对角线关系(Diagonal Relation)

第二关:关系的合成

第三关:关系的幂运算

第四关:关系的并运算

第五关:转换成关系矩阵

第六关:自反关系的判断

第七关:反自反关系的判断

第八关:对称关系的判断

第九关:非对称关系的判断

第十关:反对称关系的判断

第十一关:传递关系的判断

第十二关:计算自反闭包

第十三关:关系的对称闭包

第十四关:关系的传递闭包

第十五关:利用Warshall算法求传递闭包

第十六关:判断等价关系

第十七关:计算等价类

第十八关:从划分生成等价关系

第十九关:判断半序关系

第二十关:判断逆序关系

第二十一关:判断全序关系

第二十二关:关系矩阵的 join 运算

第二十三关:关系矩阵的 meet 运算

第二十四关:关系矩阵的布尔乘积

代码总和实现


        本人未系统学习过离散数学,完成此实训只是在熟悉python。


第一关:求给定集合的对角线关系(Diagonal Relation)

  • 任务简述:添加方法diagonalRelation(self),返回对角线关系对象
  • 总体思路:NEW rel = [(x, x) for x in self.sets]
  • 相关知识:类实例创建、列表表达式
  • 关卡难度:0.4   代码于文末

第二关:关系的合成

  • 任务简述:重载方法__mul__(self),用于实现关系的合成。
  • 总体思路:NEW rel = [(x,z) for (x,y) in other.rel for (y1,z) in self.rel if y == y1]
  • 相关知识:类实例创建、列表表达式、方法重载
  • 关卡难度:0.5  代码于文末

第三关:关系的幂运算

  • 任务简述:重载方法__pow__(self, power),实现关系的幂运算。
  • 总体思路:幂次为-1时求反,幂次为0时求对角线,其他递归运算即可
  • 相关知识:重载、递归
  • 关卡难度:0.7  代码于文末

第四关:关系的并运算

  • 任务简述:重载方法__add__(self, other),实现加法,即关系的并
  • 总体思路:关系求并集
  • 相关知识:集合的并集运算
  • 关卡难度:0.2  代码于文末

第五关:转换成关系矩阵

  • 任务简述:添加方法toMatrix(self),实现将序偶形式的关系转换成矩阵形式
  • 总体思路:先把集合化为列表并排序,对矩阵一行一行去赋值
  • 相关知识:列表排序、列表的*运算
  • 关卡难度:0.7   代码于文末

第六关:自反关系的判断

  • 任务简述:添加方法isReflexive(self),实现对自反性的判断
  • 总体思路:对每个元素进行一次判读,一旦出现某元素不自反,返回False
  • 相关知识:对集合的遍历、in、not in
  • 关卡难度:0.4  代码于文末

第七关:反自反关系的判断

  • 任务简述:添加方法isIrreflexive(self),实现对反自反性的判断
  • 总体思路:对每个元素进行一次判读,一旦出现某元素自反,返回False
  • 相关知识:对集合的遍历、in、not in
  • 关卡难度:0.4   代码于文末

第八关:对称关系的判断

  • 任务简述:添加方法isSymmetric(self),实现对对称性的判断
  • 总体思路:对每个元素进行一次判读,一旦出现某元素不对称,返回False
  • 相关知识:对集合的遍历、in、not in
  • 关卡难度:0.4   代码于文末

第九关:非对称关系的判断

  • 任务简述:添加方法isAsymmetric(self),实现对非对称性的判断
  • 总体思路:对每个元素进行一次判读,一旦出现某元素对称,返回False
  • 相关知识:对集合的遍历、in、not in
  • 关卡难度:0.4   代码于文末

第十关:反对称关系的判断

  • 任务简述:添加方法isAntiSymmetric(self),实现对反对称性的判断
  • 总体思路:一旦出现某元素对称且不位于对角线,返回False
  • 相关知识:对集合的遍历、in、not in
  • 关卡难度:0.5   代码于文末

第十一关:传递关系的判断

  • 任务简述:添加方法isTransitive(self),实现对传递性的判断
  • 总体思路:对关系遍历,一旦出现某元素传递失败,返回False
  • 相关知识:对集合的遍历、in、not in
  • 关卡难度:0.7   代码于文末

第十二关:计算自反闭包

  • 任务简述:添加方法reflexiveClosure(self),计算并返回自反闭包
  • 总体思路:与对角线关系求并
  • 相关知识:集合的并运算
  • 关卡难度:0.4  代码于文末

第十三关:关系的对称闭包

  • 任务简述:添加方法symmetricClosure(self),计算并返回对称闭包
  • 总体思路:求反(-1次幂)的结果与自身之并
  • 相关知识:集合的并运算
  • 关卡难度:0.4   代码于文末

第十四关:关系的传递闭包

  • 任务简述:添加方法transitiveClosure(self),按幂运算计算并返回传递闭包
  • 总体思路:结果 = 
  • 相关知识:集合的并运算
  • 关卡难度:0.6  代码于文末

第十五关:利用Warshall算法求传递闭包

  • 任务简述:添加方法__warshall(self, a),计算并返回新的关系矩阵,a为关系矩阵
  • 总体思路:遍历关系矩阵,每遇到一个1,对该列重新赋值,赋值关系见代码
  • 相关知识:Warshall-Roy算法、
  • 关卡难度:1.5  代码于文末

第十六关:判断等价关系

  • 任务简述:添加函数isEquivalenceRelation(rel),判断是否是等价关系
  • 总体思路:等价关系具有自反性、对称性与传递性
  • 相关知识:无
  • 关卡难度:0.2   代码于文末

第十七关:计算等价类

  • 任务简述:添加函数createPartition(rel),如果关系是等价关系,计算并返回商集
  • 总体思路:等价关系中,每个元素的等价类都会出现在二元关系的第二项
  • 相关知识:frozenset类型作为集合元素
  • 关卡难度:1   代码于文末

第十八关:从划分生成等价关系

  • 任务简述:添加函数createEquivalenceRelation(patition,A),根据所给集合A上的划分partition创建等价关系
  • 总体思路:每个等价类的元素与元素之间、元素与自身存在关系
  • 相关知识:生成器(集合化)
  • 关卡难度:1.2   代码于文末

第十九关:判断半序关系

  • 任务简述:添加函数isPartialOrder(rel),判断关系是否半序
  • 总体思路:半序 = 自反 + 反对称 + 传递;或者求反与本身之交集为对角线
  • 相关知识:集合交运算
  • 关卡难度:0.6   代码于文末

第二十关:判断逆序关系

  • 任务简述:添加函数isQuasiOrder(rel),判断关系是否半序
  • 总体思路:逆序 = 反自反 + 反对称 + 传递
  • 相关知识:无
  • 关卡难度:0.6   代码于文末

第二十一关:判断全序关系

  • 任务简述:添加函数isLinearOrder(rel),判断关系是否半序
  • 总体思路:全序 = 半序+;关系矩阵表示为上(下)三角
  • 相关知识:生成器集合化
  • 关卡难度:1.1  代码于文末

第二十二关:关系矩阵的 join 运算

  • 任务简述:添加函数join(rel1, rel2),返回两个关系矩阵的join(或)运算矩阵
  • 总体思路:矩阵或运算 |
  • 相关知识:列表
  • 关卡难度:0.8  代码于文末

第二十三关:关系矩阵的 meet 运算

  • 任务简述:添加函数meet(rel1, rel2),返回两个关系矩阵的meet(与)运算矩阵
  • 总体思路:矩阵与运算 &
  • 相关知识:列表
  • 关卡难度:0.8  代码于文末

第二十四关:关系矩阵的布尔乘积

  • 任务简述:添加函数booleanProduct(rel1, rel2),返回两个关系矩阵的布尔乘积
  • 总体思路:线性代数、矩阵乘法、注意顺序
  • 相关知识:列表表达式、if长句、zip打包
  • 关卡难度:1  代码于文末

代码总和实现

import functoolsclass Relation(object):def __init__(self, sets, rel):# rel为sets上的二元关系assert not(len(sets)==0 and len(rel) > 0)  # 不允许sets为空而rel不为空assert sets.issuperset(set([x[0] for x in rel]) | set([x[1] for x in rel]))  # 不允许rel中出现非sets中的元素self.rel = relself.sets = setsdef __str__(self):relstr = '{}'setstr = '{}'if len(self.rel) > 0:relstr = str(self.rel)if len(self.sets) > 0:setstr = str(self.sets)return 'Relation: ' + relstr + ' on Set: ' + setstrdef __eq__(self, other):return self.sets == other.sets and self.rel == other.reldef diagonalRelation(self):# 返回一个给定集合(self.sets)的对角线关系对象return Relation(self.sets, set([(a, a) for a in self.sets]))def __mul__(self, other):  # 返回合成的结果,为一个Relation对象assert self.sets == other.sets  # 必须满足self和other的A->B的映射空间相同# 注意序偶return Relation(self.sets, set([(x, y1) for x, y in other.rel for x1, y1 in self.rel if y == x1]))def __pow__(self, power, modulo=None):assert power >= -1  # 必须满足幂次>=-1if power == -1:  # 求反return Relation(self.sets, set([(x, y) for y, x in self.rel]))elif power == 0:  # 求对角线return self.diagonalRelation()return self ** (power - 1) * self  # 递归:*已经重载def __add__(self, other):assert self.sets == other.sets  # 必须满足元素相同return Relation(self.sets, self.rel)def toMatrix(self):"""将序偶集合形式的关系转换为矩阵"""matrix = []elems = sorted(list(self.sets))  # 为保证矩阵的唯一性,需对self.sets中的元素先排序line = [0] * len(self.sets)for elem in elems:for x, y in self.rel:if x == elem:line[elems.index(y)] = 1matrix.append(line)line = [0] * len(self.sets)return matrixdef isReflexive(self):"""判断是否自反"""for x in self.sets:if (x, x) not in self.rel:return Falsereturn Truedef isIrreflexive(self):"""判断是否 反自反"""for x in self.sets:if (x, x) not in self.rel:return Falsereturn Truedef isSymmetric(self):"""判断是否 对称"""for x, y in self.rel:if (y, x) not in self.rel:return Falsereturn Truedef isAsymmetric(self):"""判断是否 非对称"""for x, y in self.rel:if (y, x) in self.rel:return Falsereturn Truedef isAntiAsymmetric(self):"""判断是否 非对称"""for x, y in self.rel:if (y, x) in self.rel and x != y:return Falsereturn Truedef isTransitive(self):"""判断是否 传递"""for x, y in self.rel:for x1, y1 in self.rel:if x1 == y:if (x, y1) not in self.rel:return Falsereturn Truedef reflexiveClosure(self):"""计算自反闭包"""return self + self.diagonalRelation()def symmetricClosure(self):"""对称闭包"""return self + self ** -1def transitiveClosure(self):"""传递闭包"""closure = selffor i in range(2, len(self.sets) + 1):if closure.isTransitive():  # 反正是或运算,可以省此判断,或许还会更快算得breakclosure = closure + self ** ireturn closuredef transitiveClosure3(self):# 该方法利用Roy-Warshall计算传递闭包# 现将关系转换为矩阵,再调用__warshall函数m = self.toMatrix()return self.__warshall(m)def __warshall(self, a):  # 参数a为关系矩阵assert (len(row) == len(a) for row in a)n = len(a)# Roy-Warshall求传递闭包的算法for r in range(n):for c in range(len(a[r])):if a[c][r] == 1:for k in range(n):a[c][k] = a[c][k] | a[r][k]  # .......return adef isEquivalenceRelation(rel: Relation):"""判断等价关系"""return rel.isReflexive() and rel.isSymmetric() and rel.isTransitive()def createPartition(rel: Relation):  """对给定的Relation对象rel,求其决定的rel.sets上的划分"""# 如果rel不是等价关系,返回空集if not isEquivalenceRelation(rel):print("The given relation is not an Equivalence Relation")return set([])# 如rel是等价关系,求划分、商集partition = set([])for elem in rel.sets:  # 给个元素的等价类partition.add(frozenset(y for x, y in rel.rel if x == elem))return partitiondef createEquivalenceRelation(partition, A):# 根据所给集合A的划分partition创建等价关系assert functools.reduce(lambda x, y: x.union(y), partition) == A  # 断言保证 ...# 每个等价类的元素与元素之间、元素与自身存在关系return Relation(A, set((a,b) for part in partition for a in part for b in part))def isPartialOrder(rel: Relation):"""判断是否 半序 = 自反 + 反对称 + 传递"""return (rel ** (-1)).rel.intersection(rel.rel) == set((x, x) for x in rel.sets)# return rel.isReflexive() and rel.isAntiSymmetric() and rel.isTransitive()def isQuasiOrder(rel):"""判断是否 拟序 = 反自反 + 反对称 + 传递"""# return (rel ** (-1)).rel.intersection(rel.rel) == set()return rel.isIrreflexive() and rel.isAntiSymmetric() and rel.isTransitive()def isLinearOrder(rel: Relation):"""判断是否 全序 = 半序+ = (自反+) + 反对称 + 传递"""if not isPartialOrder(rel):return Falseelse:# 由于带有传递性:所以第二个==可以不用return set(x for x, y in rel.rel if x != y) == rel.sets == set(y for x, y in rel.rel if x != y)def join(rel1: Relation, rel2: Relation):"""实现关系矩阵的join运算"""assert rel1.sets == rel2.sets# 首先得到二者的矩阵M1 = rel1.toMatrix()M2 = rel2.toMatrix()m = len(M1)n = mM = []  # 实现关系矩阵的join运算,结果存于M中for r in range(m):row = [0] * nfor c in range(n):row[c] = M1[r][c] | M2[r][c]  # 或M.append(row)return Mdef meet(rel1: Relation, rel2: Relation):"""实现关系矩阵的meet运算"""assert rel1.sets == rel2.sets# 首先得到二者的矩阵M1 = rel1.toMatrix()M2 = rel2.toMatrix()m = len(M1)n = mM = []  # 实现关系矩阵的meet运算,结果存于M中for r in range(m):row = [0] * nfor c in range(n):row[c] = M1[r][c] & M2[r][c]  # 与M.append(row)return Mdef booleanProduct(rel1: Relation, rel2: Relation):assert rel1.sets == rel2.sets  # 保证了矩阵大小一致# 首先得到二者的矩阵M1 = rel1.toMatrix()M2 = rel2.toMatrix()m = len(M1)n = mM = []  # 结果存于M中for r in range(m):row_M1_r = M1[r]  # 准备M1矩阵的行row_M_r = [0] * nfor c in range(n):col_M2_c = [M2[r_2][c] for r_2 in range(m)]  #  准备M2矩阵的列# 计算r行c列的结果row_M_r[c] = 1 if sum([x & y for x, y in zip(row_r, col_M2_c)]) else 0M.append(row_M_r)return M    

初笔于2023年4月2日。

【头歌educoder】离散数学实训参考-第二章-关系-part1-关系基础相关推荐

  1. 头歌MySQL数据库实训答案2022

    答案由本人收集+自己写的,仅作参考,帮助写不完作业的小伙伴 目录 实训1 数据库.表与完整性约束的定义(Create) 实训2 数据库.表与完整性约束的定义(Create) 实训3 基于金融应用的数据 ...

  2. 头歌-信息安全技术-实训04 数据库SQL注入漏洞

    头歌-信息安全技术-实训04 数据库SQL注入漏洞 第一关:获取dvwa环境 任务描述 实验步骤 1. 安装appach 2.安装php 3.修改apache配置文件 4.安装mysql 5.安装dv ...

  3. 头歌c语言实训作业题解

    头歌c语言实训作业题解 持续更新 C语言程序设计编辑与调试环境 1.打印输出 Hello World 2.打印输出图形 3.求三个数的最大值 4.熟悉C语言调试环境 C语言中最基本的输入输出 1.看看 ...

  4. 【Educoder离散数学实训】关系基础

    [Educoder离散数学实训]关系基础 题有点多,能聊的不多.有些题还是比较有价值的 就单独说几个题,代码放在最后.所有函数都改成自己写的了,没准比答案给的好读一点? T1 求给定集合的对角线关系( ...

  5. 【Educoder离散数学实训】生成真值表

    [Educoder离散数学实训]生成真值表 这个相当于是class的一个实际应用,体现出来了一点Python中类的强大 总体说一下想干啥:我们想用PythonPythonPython做一个真值表,对于 ...

  6. 头歌MySQL数据库实训答案 有目录

    头歌MySQL数据库答案 特别感谢黄副班.小青提供代码,有问题联系公众号[学思则安]留言更正 其他作业链接 数据库1-MySQL数据定义与操作实战 MySQL数据库 - 初识MySQL MySQL数据 ...

  7. 头歌C++面向对象实训一

    ** C&C++ 面向过程编程综合练习 ** 一.实训目的 熟练以下内容: (1)函数的定义及使用: (2)数组的定义及使用: (3)指针的定义及使用: (4)结构的定义及使用: (5)多文件 ...

  8. 头歌C++面向对象实训二

    ** C++ 面向对象 - 类和对象的创建和使用 ** 一.实训目的 1.熟悉C++中类和对象的创建和使用 2.理解C++中的关键字public.protected.private 二.实训内容 1. ...

  9. 头歌C++面向对象实训三

    C++ 面向对象 - 构造函数与析构函数 一.实训目的 1.理解构造函数和析构函数 2.熟悉掌握构造函数和析构函数的运用 3.掌握对象数组的运用 4.理解静态成员及函数 二.实训内容 1.构造函数 - ...

最新文章

  1. 僵尸进程的生成以及几种避免方法
  2. 图像处理常用边缘检测算子总结
  3. 在MonoTouch中正确而简单的使用 Sqlite 数据库
  4. 依赖注入的三种方式_一起学Spring之三种注入方式及集合类型注入
  5. 组装一台计算机 java_如何在同一台计算机上安装多个Java版本
  6. python beautifulsoup报错bs4 FeatureNotFound Couldnot find a tree builder with the features
  7. 《How to Write and Publish a Scientfic Paper》 Chapter 1
  8. php 读取js文件,JS中如何读取文件
  9. python进阶之学习笔记_Python进阶学习笔记
  10. 交换机芯片笔记2.1
  11. arcgis10之地理配准
  12. Python办公——根据Excel数据批量生成二维码
  13. python实现千牛客服自动回复语_千牛自动回复语大全
  14. 【MATLAB统计分析与应用100例】案例016:matlab读取Excel数据,进行样品系统聚类分析
  15. 西山小菜鸟之Scrapy学习笔记---爬取企查查网站公司基本信息
  16. allegro如何等长走线
  17. 【JS】学习记录【页面打印】
  18. 【超详细】对比10种优化函数BGD、SGD、mini-batch GD、Momentum、NAG、Adagrad、RMSProp、Adadelta、Adam、AMSgrad
  19. 整机压力测试_一种服务器整机压力的测试方法
  20. cloudflare免费设置_Cloudflare 设置教程 | 利用cloudflare提速外贸网站

热门文章

  1. 百度地图搜索功能的实现
  2. QScintilla的信号汇总和解释
  3. 任何手机都能刷原生android系统吗,如果你的安卓手机能自由地刷系统,你会选择谁?...
  4. Html5禁止浏览器后退,多页面网站禁用浏览器后退键
  5. zookeeper 分布式barrier
  6. 正则表达式在线生成器(txt2re)
  7. Opencv的使用小教程3——利用轮廓检测实现二维码定位
  8. 对话昔日“斜杠青年”西蒙斯:传奇数学家的别样人生
  9. 我对“Stay hungry,Stay foolish”的理解
  10. ionic2混合应用调起原生地图应用