Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Class_Partitioning_Equivalent - Fatal编程技术网

用python检测等价类

用python检测等价类,python,list,class,partitioning,equivalent,Python,List,Class,Partitioning,Equivalent,如果给出了两个数字列表,那么检测等效类的快速(est)方法是什么 在列表list1=[1,1,2,3,3,4]和list2=[5,6,7,7,8,6]的情况下 应该是两个等价的类:eqclass=[[1,4,5,6],[2,3,7,8]在您的情况下,如果两个元素出现在两个数组中的同一位置,则两个元素是等价的 如果你重新设计这个问题,它归结为寻找连通子图。您可以将这两个列表转换为一个对等数字对的列表。每个数字都可以看作是图中的一个顶点,每对数字都定义了它们之间的边。可以使用简单的广度或深度优先搜索

如果给出了两个数字列表,那么检测等效类的快速(est)方法是什么

在列表
list1=[1,1,2,3,3,4]
list2=[5,6,7,7,8,6]
的情况下
应该是两个等价的类:
eqclass=[[1,4,5,6],[2,3,7,8]
在您的情况下,如果两个元素出现在两个数组中的同一位置,则两个元素是等价的

如果你重新设计这个问题,它归结为寻找连通子图。您可以将这两个列表转换为一个对等数字对的列表。每个数字都可以看作是图中的一个顶点,每对数字都定义了它们之间的边。可以使用简单的广度或深度优先搜索来查找连通子图。说:

在任何一种情况下,从某个特定顶点v开始的搜索都会在返回之前找到包含v(不再包含v)的整个连接组件。若要查找图形的所有连接组件,请在其顶点之间循环,每当循环到达尚未包含在先前找到的连接组件中的顶点时,开始新的宽度优先或深度优先搜索

如果您需要一个实用的解决方案,可以使用提供这些算法的软件包。请查看。

您可以使用。(我总是在附近有一个实现,因为它非常有用。)只要“联合”不同的压缩数字对,然后得到“组”作为具有相同“leader”的数字

独立于问题的实施:

class UnionFind:
    def __init__(self):
        self.leaders = collections.defaultdict(lambda: None)

    def find(self, x):
        l = self.leaders[x]
        if l is not None:
            l = self.find(l)
            self.leaders[x] = l
            return l
        return x

    def union(self, x, y):
        lx, ly = self.find(x), self.find(y)
        if lx != ly:
            self.leaders[lx] = ly

    def get_groups(self):
        groups = collections.defaultdict(set)
        for x in self.leaders:
            groups[self.find(x)].add(x)
        return list(groups.values())
应用程序:

list1 = [1,1,2,3,3,4]
list2 = [5,6,7,7,8,6]

uf = UnionFind()
for a, b in zip(list1, list2):
    uf.union(a, b)

print(uf.get_groups())
# [{8, 2, 3, 7}, {1, 4, 5, 6}]

你所说的同等等级是什么意思?什么是等价关系?在我的例子中,你可以把它(等价类)看作是相关数字的集合/列表。更准确地说,这两个列表(list1和list2)表示相关的数字。因此,1与5和6相关,2与7相关,3与7和8相关,4与6相关。结果是相互关联的数字列表。感谢您的贡献,sauerburger!不幸的是,如果要使用以下输入尝试您的算法,它将无法正常工作:list1=[1,1,2,2,3,3,4,4,5,5]和list2=[6,7,8,9,10,11,12,8,10,6]。正确的答案是[[1,3,5,6,7,10,11],[2,4,8,9,12]]很好。我完全错过了这个。我已经更新了答案。