Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在列表列表中查找重叠列表_Python_Algorithm_Computer Science_Graph Algorithm - Fatal编程技术网

Python 在列表列表中查找重叠列表

Python 在列表列表中查找重叠列表,python,algorithm,computer-science,graph-algorithm,Python,Algorithm,Computer Science,Graph Algorithm,我有一个列表,需要根据列表项的常见情况进行合并。共享元素的列表需要合并在一起以形成集群 我考虑使用广度优先遍历来实现这一点,但由于列表的排列方式,很难实现遍历 列表示例列表: input: [ [1,2,3], [2,4,5], [4,6,8], [9,10,16], [16,18,19], [20,21,22] ] 前三个列表需要合并为一个列表(第一个列表和第二个列表有2个,第二个和第三个列表共享4个),第四个和第五个列表需要合并,因为两个列表共享16个。第三个列表不会与任何其

我有一个列表,需要根据列表项的常见情况进行合并。共享元素的列表需要合并在一起以形成集群

我考虑使用广度优先遍历来实现这一点,但由于列表的排列方式,很难实现遍历

列表示例列表:

input: 
[
 [1,2,3],
 [2,4,5],
 [4,6,8],
 [9,10,16],
 [16,18,19],
 [20,21,22]
]
前三个列表需要合并为一个列表(第一个列表和第二个列表有2个,第二个和第三个列表共享4个),第四个和第五个列表需要合并,因为两个列表共享16个。第三个列表不会与任何其他列表合并,因为它不会与其他列表共享任何元素

虽然这可以在O(n^2)时间内完成(n是列表的数量),但我正在尝试找到最有效的方法。

您可以在O(n*logn)时间内完成,其中n是所有列表中的项目总数

使用Union Find数据结构的想法很简单:

  • 首先,让我们为输入中的每个唯一项创建N个不相交集
  • 合并每个列表中所有相邻项的不相交集
  • 从不相交集收集结果
  • 示例代码:

    def Find(id,P):
        if P[id]<0 : return id
        P[id]=Find(P[id],P)
        return P[id]
    
    def Union(id1, id2, p):
        id1 = Find(id1,P)
        id2 = Find(id2,P)
        if id1 != id2:
            P[id2]=id1
    
    input=[
     [1,2,3],
     [2,4,5],
     [4,6,8],
     [9,10,16],
     [16,18,19],
     [20,21,22]
    ]
    
    P = {}
    
    for list in input :
        for item in list :
            P[item] = -1
    
    for list in input :
        for i in range(1,len(list)):
                Union(list[i-1], list[i], P)
    
    ans = {}
    for list in input :
        for item in list :
            if Find(item,P) not in ans:
                ans[Find(item,P)] = []
            ans[Find(item,P)].append(item)
    
    ans = [set(x) for x in ans.values()]
    print(ans)
    
    def Find(id,P):
    
    如果P[id]

    您的内部列表没有重复的元素。如果这是一般情况,那么Rosetta代码上的任务有一个Python解决方案可以工作。

    内部列表是否总是排序([1,2,3])?我们还需要注意其他限制/规则吗?内部列表未排序。但是,在创建列表的过程中,这是可以完成的。这个问题没有任何其他限制。关于“很难实现遍历”,你是说你没有用图形寻找解决方案,还是说你接受了它们但还没有找到一个简单的解决方案?那些内部列表可以被认为是集合吗?它们似乎没有重复,而且代码也存在,用于对集合执行此操作。是的,没有重复谢谢,这就是我一直在寻找的答案
    def Find(id,P):
        if P[id]<0 : return id
        P[id]=Find(P[id],P)
        return P[id]
    
    def Union(id1, id2, p):
        id1 = Find(id1,P)
        id2 = Find(id2,P)
        if id1 != id2:
            P[id2]=id1
    
    input=[
     [1,2,3],
     [2,4,5],
     [4,6,8],
     [9,10,16],
     [16,18,19],
     [20,21,22]
    ]
    
    P = {}
    
    for list in input :
        for item in list :
            P[item] = -1
    
    for list in input :
        for i in range(1,len(list)):
                Union(list[i-1], list[i], P)
    
    ans = {}
    for list in input :
        for item in list :
            if Find(item,P) not in ans:
                ans[Find(item,P)] = []
            ans[Find(item,P)].append(item)
    
    ans = [set(x) for x in ans.values()]
    print(ans)