使用最小数量的相等相邻值进行数组混洗

时间:2014-10-25 10:30:32

标签: arrays algorithm sorting shuffle

嗨我正在寻找一种算法,给定一个数组作为输入将重新洗牌,以便可能存在最小数量的相等相邻值。

我会试着解释一下:

in:[4,4,4,4,5,5,5,5] -> out: [4,5,4,5,4,5,4,5] or [5,4,5,4,5,4,5,4]

in:[1,2,3,4,5,6,7,8] -> out:任何订单都会执行,因为所有值都不同

in:[1,1,2,2,3,3,1,1] -> out: [1,2,1,3,1,2,3,1]或任何其他没有相邻值的组合

谢谢!

1 个答案:

答案 0 :(得分:1)

假设max_cnt是所有元素中出现的最大次数,n是数组的大小。

如果没有元素出现超过ceil(n / 2)次,则可以使所有相邻元素不同,因为可以以这样的方式排列它们:具有相同值的元素之间的距离至少为2例如:
a = [1,1,1,1,2,2,3]。我们可以重新排列它:[1,2,1,2,1,3,1]。 重新排列的算法很简单:在位置i, i + 2, i + 4, ...上放置相等的元素,依此类推。

如果max_cnt > ceil(n / 2)位置,那么您可以使用上述算法构造最长可能的前缀,没有相等的相邻元素,然后用剩余值填充后缀。例: a = [1,1,1,1,2,3]。前缀是[1,2,1,3,1]。剩下的就是其余的:[1,2,1,3,1,1,1]。相等的相邻元素的数量是2 * max_cnt - n - 1