• Python实现---南邮离散数学实验三:盖住关系的求取及格的判定


    一、题目要求:

    内容:

            求取集合A上的整除关系R对应的盖住关系,并判定偏序集<AR>是否为格,若是格,判断其是否为有补格。

    要求:

            集合A可以是用户任意给定的正整数集合。

    二、实验原理以及内容:

    实验所使用的数据结构、存储结构:列表及其sort排序,元祖(a,b)表示a|b(a整除b)以及map映射

    实验中函数:

    def judge_div(a,b)  #判断整除关系 10表示是否满足整除关系

    def judge_COV(A) #传入集合A,先判断符合整除关系的R集合,再判断出盖住关系,以列表的形式返回盖住关系(其中调用judge_div(a,b)函数来判断R集合)

    def union(a,b,A) #A集合中ab元素的并运算(得两者上确界)

    def intersect(a,b,A) #A集合中ab元素的交运算(得两者的下确界),其中调用judge_div(a,b)函数向下遍历A中的元素,寻找最小下界(存在,则返回上下确界,不存在返回0

    def judge_lattice(A) #判断是否是格以及是不是补格,根据格的定义,调用unionintersect函数去判断。
    def print_tuple(R) #格式化输出集合

    实验中数据传递关系:输入集合A,元素必须是正整数的集合,逗号隔开相邻元素,调用一系列函数处理即可

    实验思路与原理:

    • 判断符合整除关系的R集合和盖住关系:逐一遍历A中每个元素,调用judge_div函数判断是否符合整除关系,是->以元祖的形式放入R中。R计算完后,再对R中的每一个序偶(元祖)进行判断:R集合中,且无第三者逐一遍历是否符合,一旦出现<x,y><y,z>flag=0,退出循环,若flag经历遍历后仍然为1,放入COVA的序偶中。
    • 判断格:从定义出发(任意两个元素都会有上确界和下确界),调用unionintersect函数求出上下确界即可(存在,则返回上下确界,不存在返回0
    • 判断有补格:在是格的前提下,对于每一个元素逐一遍历能否找到A中的元素能成为它的补元(并运算后上确界1和交运算后下确界0)即可,(只要找到一个补元即可退出对该元素的讨论,当只有A中每一个元素都有至少一个补元,此时方可判断其为有补格->一旦遍历到一个找不到补元的元素,直接退出循环,flag2=0,不是补元)

    时间复杂度:O(n²)

    三、源代码:

    1. #盖住关系的求取及格的判定.py
    2. def judge_div(a,b):
    3. '''a整除b->b除以a为整数'''
    4. max=(a if a>b else b)
    5. min=a+b-max
    6. if max%min==0:#整除
    7. return 1
    8. else:
    9. return 0
    10. def judge_COV(A):#传入集合A,判断符合整除关系的R集合,再判断出盖住关系
    11. R=[]#存储R集合
    12. for i in A:
    13. for j in A[A.index(i):]:
    14. if judge_div(i,j):
    15. R.append(tuple([i,j]))
    16. #得出R关系的集合,下求COV A
    17. COVA=[]
    18. for x in R:
    19. if x[1]-x[0]==1:
    20. COVA.append(x)
    21. elif (x[1]-x[0])>1: #注意排除自反的<1,1>等元素
    22. flag=1 #假设符合
    23. template=A[A.index(x[0])+1:A.index(x[1])]
    24. for y in template:
    25. if R.count(tuple([x[0],y]))==1 and R.count(tuple([y,x[1]]))==1: #中间无其他元素才能满足盖住关系
    26. flag=0
    27. break
    28. if flag==1:
    29. COVA.append(x)
    30. return COVA
    31. '''格式化输出偏序集'''
    32. def print_tuple(R):
    33. print("{",end="")
    34. for i in R:
    35. print("<{0},{1}>".format(i[0],i[1]),end="")
    36. print("}")
    37. '''两个元素的并运算->得到两个元素的上确界'''
    38. def union(a,b,A):
    39. max=(a if a>b else b)
    40. for i in A[A.index(max):]:
    41. if judge_div(i,a) ==1 and judge_div(i,b)==1:
    42. return i
    43. return 0#若为0表示A中的a,b元素的上确界不在A中
    44. '''两个元素的交运算->得到两个元素的下确界'''
    45. def intersect(a,b,A):
    46. min=(a if a<b else b)
    47. for i in A[A.index(min)::-1]:
    48. if judge_div(b,i)==1 and judge_div(a,i)==1:
    49. return i
    50. return 0
    51. '''判断是否是格以及是不是补格'''
    52. def judge_lattice(A):
    53. #下面进行格相关的判断(任意两个元素均有其上确界和下确界)
    54. flag1=1#格
    55. flag2=1
    56. f=1
    57. for x in A:
    58. if flag1==0:
    59. break
    60. else:
    61. for y in A[A.index(x)+1:]:
    62. flag1=bool(union(x,y,A) and intersect(x,y,A))#注意and的返回值!!!!
    63. if flag1==0:
    64. break
    65. for m in A:
    66. if f==1:
    67. f=0
    68. for n in A:
    69. if intersect(m,n,A)==A[0] and union(m,n,A)==A[-1]:
    70. f=1
    71. break
    72. else:
    73. flag2=0
    74. if flag1==0:
    75. print("<A,|>不是一个格")
    76. elif flag2==0:
    77. print("<A,|>是一个格,但并非有补格")
    78. else:
    79. print("<A,|>是一个格,且为有补格")
    80. if __name__=="__main__":
    81. #输入集合A,集合A可以是用户任意给定的正整数集合。
    82. tempstr=input("输入集合A,元素必须是正整数的集合,逗号隔开相邻元素")
    83. Alist=tempstr.split(",")
    84. A=list(map(int,Alist))
    85. A.sort(reverse=False)#升序排序 例如:1 2 4 8等
    86. COVA=judge_COV(A)
    87. print("A对应的盖住关系为:",end="")
    88. print_tuple(COVA)
    89. judge_lattice(A)

    2022.6.29写在最后,

    有一个样例没有考虑,读者可以自行修改,此样例见下。

  • 相关阅读:
    <<Java>> 关于进程的那些事
    Vuex详解(五种状态)
    CISP-PTE真题演示
    学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难
    如何在idea中创建一个SpringBoot项目(超详细教学)
    spring5.3 十:推断构造方法源码分析
    求Huffman树的带权路径长度
    写个简单的管理数组指针的智能指针
    VScode仿Ubuntu颜色,配色方案
    nodejs学习笔记
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/125530572