我想知道是否有一种“最佳”方法来打乱包含重复项的元素列表,以便尽可能避免 array[i] == array[i+1] 的情况。

我正在研究加权广告显示(我可以调整任何给定广告商的每次旋转的显示数量),并且希望避免同一广告商连续出现两次。

有帮助吗?

解决方案 5

有关参考,我的(非常)幼稚的做法是这样的(实际使用LINQ / SQL调用,但这简化):

var advertisers = getAdvertisers();
var returnList = new List();
int totalWeight = sumOfAllAdvertisersWeight();
while (totalWeight > 0)
{
    for (int i=0; i<advertisers.Count; i++)
    {
        if (advertisers[i].Weight > 0)
        {
            returnList.add(advertisers[i]);
            advertisers[i].Weight--;
            totalWeight--;
        }
    }
}
return returnList;

这将避免重复直到结束,但耶它将支付通过returnList事后向后检查,如果有任何重复拖尾,试图将它们放置在混合较早。

其他提示

这非常类似于 这个问题. 。如果您用广告商替换示例中的 A、B 和 C,我认为您会遇到同样的问题。也许为此建议的一些解决方案可以帮助您。

基本随机化应以大组引起足够的分散体。

如果您希望尽量减少甚至更多(视台这甚至可能不是必要的),最简单的方法是将一定找到随机后附近受骗者和移动它们(但你可以创建模式)。一种更好的方法可能是创建包含由侧愚弄侧子集和重做随机化。

有关较小的一组没有什么是可能的,这取决于愚弄的数量。因此,对于一个非常小的一套解决办法只能是良好的基本随机化(而且我们回到了第一句)。

“Dilbert的randon数发生器”

我个人认为手,这将是随机化数组,然后遍历它直到找到2个元素是彼此相邻的相同值的最简单方法。当找到海誓山盟旁边的相同的值的2,移动至后一个到另一个点阵列中通过迭代阵列上,直到找到一个点,使得它不是另一个相同的值的旁边。如果你不能找到一个值,只要把它它在哪里,并继续与数组的下一个元素。这可能不会是最优化的解决方案,但将是罚款较小的数据集,也可能是最简单的编程。

什么是你可能有重复的数量最多? 2,3,任何?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top