这个问题适用于我正在尝试编写的程序,该程序涉及将物理部分链连接在一起。我相信我已将其提炼成最简单的问题形式。如果有人知道描述这个问题的任何其他词语,我也会感激,因为大约30分钟的搜索相关问题甚至没有找出这个问题的名称。
你有N个向量。如果您从每个向量中选择一个值并且不允许任何重复,那么您将找到我想要找到的类型的一个排列。什么是伪代码算法,可以在没有强制执行的情况下找到所有这些算法?
例:
你有矢量
v1=[1 2] v2=[1 2 3] v3=[1 2 3 4]
(编辑注释:向量的嵌套是无意的,无法在算法中使用。) 您从每个向量中选择值并且不允许重复。
Value 1 is from v1 ---> 2
Value 2 is from v2 ---> 1
Value 3 is from v3 ---> 4
Resulting permutation is [2 1 4].
这是一种允许的排列。这是一个不允许的排列的例子,因为它重复了。
Value 1 is from v1 ---> 2
Value 2 is from v2 ---> 1
Value 3 is from v3 ---> 2
Resulting permutation is [2 1 2], which is invalid due to repeats.
查找所有有效排列的算法是什么?
如果您可以在计算之前计算出有多少排列,则可以获得奖励积分。
如果我能在别人可以之前拿出答案,我一定要回复。
答案 0 :(得分:4)
您给出的示例包含嵌套向量,这意味着v_i
中的条目是v_{i+1}
中的条目的子集。如果这确实是您的应用程序的一般情况,那么解决方案的数量就是:
n_1 * (n_2 - 1) * ... * (n_k - (k-1))
其中n_i
是v_i
的长度,并且有k
个嵌套向量。
就算法而言,如果你想生成所有可能的解决方案,那么在删除已经选择的条目之后,我看不到比从每个连续向量中选择更好的方法。
如果您没有嵌套,那么可视化此问题的一种好方法是Marriage Problem,具体如下。使k
个顶点对应于给定的k
向量
v_1 v_2 ... v_k
和另一个m
个顶点对应于组合向量的不同条目
a_1 a_2 ... a_m
当且仅当a_i
出现v_j
时,才a_i
与v_j
联系。目标是在v
和a
之间找到maximum matching,它们会触及所有v
。也就是说,选择k
边,以便每个v_i
都是恰好一条边的端点。
任何标准算法,例如使用增强路径,可以找到一个解决方案或生成所有解决方案。
答案 1 :(得分:1)
我认为你可以逐步解决这个问题。设s1,s2,s3,..,sk为涉及v1,v2,..,vn的解。现在每个当前解决方案si和元素j(在vn + 1中为j)使用vn + 1,看看j是否已经在si中,如果没有,则将其添加到新集合中(对应于n + 1)。