我们有一组A_1,..,A_n。目标是为每个旧集合找到新集合。
newA_i = {a_i in A_i such that there exist (a_1,..,a_n) in (A1,..,An) with no a_k = a_j for all k and j}
所以在单词中这说明我们从A_i中删除了所有不能用来形成元组(a_1,..,a_n)的元素(a_1,..,a_n)的元素,这样元组就不会t包含重复项。
我的问题是如何快速计算这些新集。如果你只是通过生成所有可能的v来实现这个定义,那将需要指数时间。你知道更好的算法吗?
编辑:这是一个例子。拿
A_1 = {1,2,3,4}
A_2 = {2}.
现在新的套装看起来像这样:
newA_1 = {1,3,4}
newA_2 = {2}
2已从A_1中删除,因为如果您选择它,元组将始终为(2,2),这是无效的,因为它包含重复项。另一方面,1,3,4是有效的,因为(1,2),(3,2)和(4,2)是有效元组。
另一个例子:
A_1 = {1,2,3}
A_2 = {1,4,5}
A_3 = {2,4,5}
A_4 = {1,2,3}
A_5 = {1,2,3}
现在新的套装是:
newA_1 = {1,2,3}
newA_2 = {4,5}
newA_3 = {4,5}
newA_4 = {1,2,3}
newA_5 = {1,2,3}
从第2组和第3组中删除了1和2,因为如果从这些集合中选择1或2,那么第1组,第4组和第5组将只剩下2个值,因此在元组中总是会有重复的值看起来像(_,1,_,_,_)
或类似(_,_,2,_,_)
。
这个问题似乎很难,但如果有多项式时间算法会很好。
另一种看待这种情况的方法是拍摄左边的集合A_i和右边的值,如果值在集合中,则用一条线连接一个集合和一个值。
答案 0 :(得分:2)
我认为分配算法可能对此有所帮助。基本步骤是固定一个Ai中的数字,然后查看该数字是否可以与从Aj中选择的其他人一起使用,从而不重复从每个集合中选择一个数字。将数字视为人,将Aj中的数字视为可能用于执行任务j的人。然后,从每个Aj中找到不同代表的问题是为每个任务分配不同的人的问题。
维基百科将分配问题视为可能的所有分配和每个http://en.wikipedia.org/wiki/Assignment_problem的费用。在我们的例子中,我们可以使用0和1来表示可以做和不能做的成本,并查看是否存在零成本答案。
答案 1 :(得分:2)
我还在考虑如何解决这个问题,但我决定尝试重写这个问题,看看它是否给了我任何灵感。
给定一组N组:
A_i = {a_i0, a_i1, ..., a_ij, ...}
查找
B_i such that x is in B_i if and only if:
x is in A_i and
there exists {c_0, c_1, c_2, c_3, ..., c_N} such that
c_i = x and
c_k is in A_k for all k and
c_k != c_l for all k != l