【问题标题】:Transitive closure传递闭包
【发布时间】:2021-10-21 17:26:45
【问题描述】:

我想在python中创建一个TransitiveClosure()函数,可以输入一个字典,输出一个传递闭包的新字典。

例如R = {1: [3], 2: [4], 3: [], 4: [1]} 将输出R R = {1 : [3], 2 : [1, 3, 4], 3 : [], 4 : [1, 3]}

我知道传递属性是a->bb->c,而不是a->c

我不能使用矩阵,实际上我需要创建一个新字典。我尝试将字典转换为包含集合的列表,但这也有问题。有人可以帮忙吗?

谢谢!

def transitiveClosure(r):
  d ={}
  R = list(r.items())
    # loop for a,b
  for a, b in R:
    #loop for c, d
    for c, d in R:
      # checks if b = c and if a, d are in R
      if b == c and ((a, d) not in R):
        print("Not Transitive")
        return False
  print("is Transitive")
  return True

这将告诉我字典是否可传递,我很难尝试使用此逻辑创建新字典。由于我将输入字典转换为集合列表,我需要将元素添加到列表然后将其转换回字典吗?

【问题讨论】:

  • 请分享您尝试的一些代码
  • 我添加了告诉我是否传递的代码,我正在尝试使用此逻辑来创建字典
  • 在第二个 for 循环中,我尝试追加到一个空列表,然后将该列表添加一个空字典,但我只是得到一个错误对象,无法尝试追加

标签: python function dictionary discrete-mathematics transitive-closure


【解决方案1】:

我可以想到以下使用递归函数的解决方案

def reachable_items(R,k):
    ans = R[k]
    if ans != []:
        for v in ans:
            ans = ans + reachable_items(R,v)
    return ans
    
def transitive_closure(R):
    ans = dict()
    for k in R.keys():
        ans[k] = reachable_items(R,k)
    return ans

例子:

>>> R1 = {1: [3], 2: [4], 3: [], 4: [1]}
>>> transitive_closure(R1)
{1: [3], 2: [4, 1, 3], 3: [], 4: [1, 3]}

>>> R2 = {1:[2],2:[],3:[4,5],4:[1],5:[]}
>>> transitive_closure(R2)
{1: [2], 2: [], 3: [4, 5, 1, 2], 4: [1, 2], 5: []}

【讨论】:

  • 所以reachable_method 是从R 中获取k,然后添加下一个k(如果与R 可传递)?
  • 这段代码非常有用,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多