algorithm - 元素混合算法

标签 algorithm mixing

不确定标题。

这是我需要的。

例如让这组元素 20*A, 10*B, 5*C, 5*D, 2*E, 1*F 我需要混合它们,这样两个相同的元素就不会彼此相邻,而且我可以说我不希望 B 和 C 彼此相邻。元素必须均匀分布(如果有 2 个 E,一个应该在接近开始/上半场,第二个应该在接近尾声/在下半场。元素的数量当然可以改变。

我还没有做过这样的事情。是否有此类算法的一些知识库,我可以在哪里找到解决此类问题的一些提示和方法,还是我必须自己完成所有数学运算?

最佳答案

我认为解决方案非常简单。

从一个初始化为值的数组x开始,这样您需要放置的每一项都有一个空间。

然后,对于按频率降序排列的每个 (item, frequency) 对,将 item 值分配给 x 从开始的交替槽中第一个 插槽。

以下是您的示例的工作原理:

20*A    A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A
10*B    ABABABABABABABABABABA_A_A_A_A_A_A_A_A_A
 5*C    ABABABABABABABABABABACACACACACA_A_A_A_A
 2*E    ABABABABABABABABABABACACACACACAEAEA_A_A
 1*F    ABABABABABABABABABABACACACACACAEAEAFA_A

此时我们失败了,因为 x 仍然有一个空槽。请注意,我们本可以从一开始就确定这一点,因为我们在 A 之间至少需要 19 个槽位,但我们只有 18 个其他项。

更新

Leonidas 现在解释说元素应该“平均”分配(也就是说,如果我们有 k 个特定种类的元素,并且有 n 个槽位要填充,则 n/k 个槽位的每个“桶”必须包含一个元素那种。

我们可以通过分散分配而不是简单地交替使用插槽来适应这种限制。在这种情况下(假设有 2 个 F,这样我们就可以解决这个问题),我们将有

20*A    A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A_A
10*B    ABA_ABA_ABA_ABA_ABA_ABA_ABA_ABA_ABA_ABA
 5*C    ABACABA_ABACABA_ABACABA_ABACABA_ABACABA
 2*E    ABACABAEABACABA_ABACABAEABACABA_ABACABA
 2*F    ABACABAEABACABAFABACABAEABACABAFABACABA

关于algorithm - 元素混合算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14988458/

相关文章:

java - 存储具有多个查询条件的多个实体时使用哪些数据结构?

java - JFileChooser 在 Linux 下不是模态的

Javascript 无限嵌套数组处理

delphi - 是否有一个简单的 DirectShow 过滤器可以将完全相同格式的音频混合在一起?

c++ - 我可以模仿在 C++ 中重新定义 bool 的 C 头文件吗?

unicode - 如何在 unicode 中管理混合 LTR 和 RTL 语言?

android - 同时播放两种声音-Android

algorithm - 使用多边形的中点是否始终适用于 Painter 的 HSR 算法?

algorithm - 将多边形分成 2 个相等的部分

ruby - 生产者/消费者的特例