代码之家  ›  专栏  ›  技术社区  ›  Matt Mitchell

无序排列列表(有重复项),以避免相同的元素相邻

  •  1
  • Matt Mitchell  · 技术社区  · 16 年前

    我想知道是否有一种“最佳”的方法来对包含重复项的元素列表进行无序排列,从而尽可能避免数组[i]==数组[i+1]的情况。

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

    5 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    7 年前

    这和 this question . 如果你用你的广告商替换上面给出的例子中的A、B和C,我认为你也会遇到同样的问题。也许为这个建议的一些解决方案可以帮助你。

        2
  •  2
  •   Community CDub    8 年前

    基本随机化应该在一个大的集合中引起足够的分散。

    如果您想将其最小化(根据集合的不同,甚至可能不需要这样做),最简单的方法是在随机分组后确定找到靠近的重复对象,然后移动它们(但您可能会创建模式)。更好的方法可能是创建包含并排重复的子集,并重新进行随机化。

    对于一个较小的集合,可能没有任何可能,这取决于重复次数。所以一个非常小的集合的解决方案只能是很好的基本随机化(我们回到第一句)。

    Dilbert's randon number generator

        3
  •  1
  •   Kibbee    16 年前

    就我个人而言,我认为最简单的方法是随机化数组,然后迭代它,直到找到两个值相同的元素彼此相邻。当在每个点旁边找到2个相同的值时,通过对数组进行迭代,将后面的一个点移动到数组中的另一个点,直到找到一个点,使其不在相同值的另一个点旁边。如果找不到值,只需将其留在原处,然后继续使用数组的下一个元素。这可能不是最理想的解决方案,但对于较小的数据集,可能是最简单的编程。

        4
  •  0
  •   MK_Dev    16 年前

    你可能拥有的最大数量的副本是什么?2, 3,有吗?

        5
  •  0
  •   Matt Mitchell    16 年前

    作为参考,我(非常)幼稚的方法是这样的(实际上使用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;
    

    这将避免重复,直到结束,但是的,它将支付向后检查返回列表后,如果有任何重复的尾,尝试把他们放在混合较早。