当我们整理列表的时候,比如
a = [1,2,3,3,2,2,1]
sorted(a) => [1, 1, 2, 2, 2, 3, 3]
结果列表中的相等元素总是相邻的。
我怎样才能完成相反的任务——重新组合列表,使相等的元素永远不会(或尽可能少地)相邻?
例如,对于上面的列表,其中一个可能的解决方案是
p = [1,3,2,3,2,1,2]
更正式的说法是,给定一个列表 a
,生成它的排列 p
,使得对 p[i]==p[i+1]
的数目最小化。
由于列表很大,因此不能生成和过滤所有排列。
附加问题: 如何有效地生成所有这些排列?
这是我用来测试解决方案的代码: https://gist.github.com/gebrkn/9f550094b3d24a35aebd
UPD: 在这里选择一个获胜者是一个艰难的选择,因为许多人发布了出色的答案。@ Vincent VanderWeele、 @ David Eisenstat、 @ Coady、 @ Enrico Bacis和 @ srgerg提供的功能可以完美地产生最佳的排列。@ Tobias _ k和 David 也回答了奖金问题(生成所有排列)。对大卫的正确性证明的附加要点。
来自@VincentvanderWeele 的代码似乎是最快的。