伪码算法用于计算从N个不等向量中选择的N个值的所有排列而不重复

时间:2012-09-11 04:19:49

标签: algorithm set permutation pseudocode

这个问题适用于我正在尝试编写的程序,该程序涉及将物理部分链连接在一起。我相信我已将其提炼成最简单的问题形式。如果有人知道描述这个问题的任何其他词语,我也会感激,因为大约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.

查找所有有效排列的算法是什么?

如果您可以在计算之前计算出有多少排列,则可以获得奖励积分。

如果我能在别人可以之前拿出答案,我一定要回复。

2 个答案:

答案 0 :(得分:4)

您给出的示例包含嵌套向量,这意味着v_i中的条目是v_{i+1}中的条目的子集。如果这确实是您的应用程序的一般情况,那么解决方案的数量就是:

n_1 * (n_2 - 1) * ... * (n_k - (k-1))

其中n_iv_i的长度,并且有k个嵌套向量。

就算法而言,如果你想生成所有可能的解决方案,那么在删除已经选择的条目之后,我看不到比从每个连续向量中选择更好的方法。

如果您没有嵌套,那么可视化此问题的一种好方法是Marriage Problem,具体如下。使k个顶点对应于给定的k向量

v_1  v_2 ...  v_k

和另一个m个顶点对应于组合向量的不同条目

a_1 a_2 ... a_m

当且仅当a_i出现v_j时,才a_iv_j联系。目标是在va之间找到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)。

  1. 初始化S = {{j} for j in v1}
  2. 对于n = 2..m:
    1. newS = {}
    2. for v in vn
      1. 表示s中的s
        1. 如果j没有在s中添加sU {j}到newS S = newS
  3. return S