当我们对列表进行排序时,例如
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:在这里选择获胜者是一个艰难的选择,因为许多人都给出了很好的答案。@VincentvanderWeele,@大卫Eisenstat,@Coady,@ enrico.bacis和@srgerg提供完美产生最佳的置换函数。@tobias_k和David也回答了奖金问题(生成所有排列)。大卫还提供了正确性证明。
@VincentvanderWeele的代码似乎是最快的。
慕哥9229398
守着星空守着你