Arrays 具有最小数量相等相邻值的数组洗牌

Arrays 具有最小数量相等相邻值的数组洗牌,arrays,algorithm,sorting,shuffle,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]或任何相邻值不相等的othrt组合 谢谢 我们假设max\u cnt是所有元素中出

嗨,我在寻找一个算法,给定一个数组作为输入,它将重新排列,以便有尽可能少的相等相邻值

我会尽力解释:

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]
或任何相邻值不相等的othrt组合


谢谢

我们假设
max\u 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\u cnt>ceil(n/2)
positions,则可以使用上述算法构造可能最长且相邻元素不相等的前缀,然后用剩余值填充后缀。例子:
a=[1,1,1,1,2,3]。前缀是[1,2,1,3,1]。剩下的部分用剩下的部分填充:[1,2,1,3,1,1,1]。相等相邻元素的数量为
2*max\u cnt-n-1

很好的答案,但均匀分布真的是混乱吗?(我知道在你的例子中没有其他方法来放置这些元素,但是你如何随机分配,比如说,4个元素,但在长度为10的数组中不相邻?@MOehm根据我对这个问题的理解,作者希望重新排列数组(以确定的方式),而不是随机地洗牌它。)(是的,这个问题中的术语shuffle看起来很混乱)。是的,也许你是对的。“任何命令都可以”听起来不像是shuffling。