找到最少使用的排列

pow*_*tte 6 c# algorithm permutation

我需要根据历史数据随时间均匀分布一组数据,以使每个数字在每个位置随时间呈现相等(或接近相等)的次数.问题是,给定过去使用的排序列表,看起来像这样(但可以有任意数量的元素):

1,2,5,3,4
4,1,5,2,3
1,3,5,2,4
4,1,2,3,5
2,4,1,3,5
5,1,4,3,2
1,5,3,2,4
5,1,3,2,4
3,2,5,4,1
4,3,1,5,2
Run Code Online (Sandbox Code Playgroud)

如何找到最少使用的值的排序,并将导致"更平衡"的排序组.显而易见的答案是我可以分组并计算它们并选择最少使用的一个,但问题是可能从未使用过的最少使用的排列,例如这里,排序"1,2,3,4,5"是最少使用的候选人,因为它根本没有出现.

简单的答案似乎是确定哪个位置"1"出现在最不频繁的位置,并将该位置设置为"1",依此类推每个数字.我怀疑这是有效的,但我觉得有一个更优雅的解决方案,我没有考虑过可能有交叉连接,所以包括所有可能的组合.

有任何想法吗?

LBu*_*kin 1

这里有一个直方图平整问题。

从这个角度考虑问题:您有一组 N 个直方图,表示离散范围 {1..N} 上 N 个值的出现频率。您想要做的是将一组新值添加到数据总体中,使所有直方图更接近水平。鉴于问题的性质,我们知道每个值总体上与其他值出现的次数相同。

一种方法是找出哪些值 N 在任何位置出现频率最低- 并将其分配给该位置。接下来,在剩余的直方图中,找到任意位置中出现频率最低的下一个值,并将该值分配给该位置。继续重复此过程,直到所有值都被分配了唯一的位置。这将为您提供下一组值。现在,您可以迭代地重复此操作以继续生成新的值集,这些值集将尝试在每次迭代中重新平衡值的分布。

如果您在分配值时维护直方图,这将成为一种相对有效的操作(您不必不断地重新扫描数据集)。

但请记住,对于任何足够小的值群体,您总是会在某种程度上“失去平衡”。没有办法解决这个问题。