我有一个由n
数组组成的列表(或数组)。每个数组携带从0
到n-1
的任意整数子集(数组中的数字不重复)。n=3
的例子是:
l = [np.array([0, 1]), np.array([0]), np.array([1, 2])]
我想从每个数组中选择一个数字作为它的代表,这样就没有两个数组有相同的代表,并以与数组相同的顺序列出它们。换句话说,为数组选择的数字必须是唯一的,并且整个代表集将是数字0
到n-1
的排列。对于上面的列表,它将是唯一的:
representatives = [1, 0, 2]
有一个保证,这样的代表名单存在我们的名单,但我们如何找到他们。如果有多个可能的代表名单,则可以随机选择其中任何一个。
3条答案
按热度按时间rnmwe5a21#
你所要求的是二分图的最大匹配,它的左集和右集分别由你的数组和它们的唯一元素索引。
networkx
模块知道如何找到这样的最大匹配:范例:
这可以在几秒钟内完成数千个元素:
t2a7ltrp2#
这就是你要找的吗
输出量:
o2rvlv0m3#
你可以使用flow network,这是你怎么做的:
1.你有k个从0到n-1的任意整数子集,你把它们连接到接收器。
1.所有数字1到n-1都连接到源。
1.这些数字连接到相关子集(num_i连接到子集k_i)。
1.图的所有权重都被初始化为1。
在构建流网络之后,你使用已知的算法如Edmonds–Karp algorithm或其他来找到最大流,这给予你O(m^2*n)的时间复杂度。
原因如下:
1.从源到数字有一条路径,从子集到接收器有一条路径,所以你不能从同一个子集中选择相同的数字两次。
1.当该算法在流网络中找到最大流时,其原则是使用所有连接到源的子集。