【发布时间】:2013-12-08 07:05:59
【问题描述】:
我有一个重复的字母数组:
AABCCD
我想把它们按伪随机顺序排列。很简单,只需使用 Fisher-Yates => done。但是对输出有限制——我不希望任何运行相同的字母。我希望在同一个角色再次出现之前至少出现两个其他角色。例如:
ACCABD
无效,因为有两个 C 相邻。
ABCACD
也是无效的,因为有两个 C 彼此相邻 (CAC),它们之间只有一个其他字符 (A),我需要至少两个其他字符。
这个简单示例的每个有效序列:
ABCADC ABCDAC ACBACD ACBADC ACBDAC ACBDCA ACDABC ACDACB ACDBAC ACDBCA ADCABC ADCBAC BACDAC BCADCA CABCAD CABCDA CABDAC CABDCA CADBAC CADBCA CADCAB CADCBA CBACDA CBADCA CDABCA CDACBA DACBAC DCABCA
我对这个小数组使用了蛮力方法,但我的实际问题是包含数百个元素的数组。我尝试使用带有一些抑制功能的 Fisher-Yates - 做普通的 Fisher-Yates,然后如果您不喜欢出现的角色,请多尝试 X 次以获得更好的角色。仅在大约 87% 的时间内生成有效序列,而且速度非常慢。想知道是否有更好的方法。显然这对所有数组都是不可能的。仅包含“AAB”的数组没有有效顺序,因此我想针对此类问题尝试使用“ABA”的最佳可用顺序。
【问题讨论】:
-
你应该标记你使用的语言
-
@peeskillet 按要求标记伪代码
-
如果您正在使用某种特定的语言,我会标记它以增加曝光度。我之所以这么说,是因为您的帖子已经发布了一段时间,只有 11 次浏览 :)
-
@peeskillet 我使用的实际语言不常见,因此无济于事。我看到 C# 是最流行的标签,meta.stackexchange.com/questions/23554/tag-trends-by-week,所以我将使用那个标签。感谢您的建议。
-
很难 100% 的时间生成有效数组,因为您可能会在修改后的 Fisher-Yates 例程结束时发现您没有剩余的有效候选人。