打乱列表(包含重复项)以避免相同的元素彼此相邻
-
21-08-2019 - |
题
我想知道是否有一种“最佳”方法来打乱包含重复项的元素列表,以便尽可能避免 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,我认为您会遇到同样的问题。也许为此建议的一些解决方案可以帮助您。
基本随机化应以大组引起足够的分散体。
如果您希望尽量减少甚至更多(视台这甚至可能不是必要的),最简单的方法是将一定找到随机后附近受骗者和移动它们(但你可以创建模式)。一种更好的方法可能是创建包含由侧愚弄侧子集和重做随机化。
有关较小的一组没有什么是可能的,这取决于愚弄的数量。因此,对于一个非常小的一套解决办法只能是良好的基本随机化(而且我们回到了第一句)。
我个人认为手,这将是随机化数组,然后遍历它直到找到2个元素是彼此相邻的相同值的最简单方法。当找到海誓山盟旁边的相同的值的2,移动至后一个到另一个点阵列中通过迭代阵列上,直到找到一个点,使得它不是另一个相同的值的旁边。如果你不能找到一个值,只要把它它在哪里,并继续与数组的下一个元素。这可能不会是最优化的解决方案,但将是罚款较小的数据集,也可能是最简单的编程。
什么是你可能有重复的数量最多? 2,3,任何?
不隶属于 StackOverflow