【发布时间】:2017-10-27 05:19:54
【问题描述】:
我有一个 V 的列表或向量 n 非负整数。有一些相等且相邻的正整数,例如V=[2, 3, 3, 0, 0]。 (我不关心零整数。)
我想找到V 的所有唯一 排列,以使所有相同的正整数保持相邻。如何为此编写算法? (对于实现,您可以选择 Python 或 Matlab 或任何其他语言。)
在 Matlab 下,以V=[2, 3, 3, 0, 0] 为例,我得到的所有唯一排列如下:
V = [2, 3, 3, 0, 0];
unique(perms([2, 3, 3, 0, 0]), 'rows')
我得到:
0 0 2 3 3
0 0 3 2 3
0 0 3 3 2
0 2 0 3 3
0 2 3 0 3
0 2 3 3 0
0 3 0 2 3
0 3 0 3 2
0 3 2 0 3
0 3 2 3 0
0 3 3 0 2
0 3 3 2 0
2 0 0 3 3
2 0 3 0 3
2 0 3 3 0
2 3 0 0 3
2 3 0 3 0
2 3 3 0 0
3 0 0 2 3
3 0 0 3 2
3 0 2 0 3
3 0 2 3 0
3 0 3 0 2
3 0 3 2 0
3 2 0 0 3
3 2 0 3 0
3 2 3 0 0
3 3 0 0 2
3 3 0 2 0
3 3 2 0 0
如您所知,我得到30 这样的排列。在这些30中,有18不尊重邻接约束。例如,[3, 2, 3, 0, 0] 不能出现在最终结果中,因为3 不再与3 相邻。最后,所有唯一排列可以由下式给出:
0 0 2 3 3
0 0 3 3 2
0 2 0 3 3
0 2 3 3 0
0 3 3 0 2
0 3 3 2 0
2 0 0 3 3
2 0 3 3 0
2 3 3 0 0
3 3 0 0 2
3 3 0 2 0
3 3 2 0 0
我想到的第一个想法(也是最简单的)是像这样生成所有唯一的排列,然后为每个排列验证约束。但是还有其他有效的算法吗?
【问题讨论】:
-
你希望所有的正数都在一起还是只有相同的正数在一起?
-
我希望所有相同且相邻的正数都在一起(保持相邻)。
-
将相邻元素的每个“运行”视为一个元素,然后使用任何标准排列算法。