Mélangez une liste (avec doublons) pour éviter les éléments identiques étant à côté de l'autre

StackOverflow https://stackoverflow.com/questions/358307

Question

Je me demande s'il y a une « meilleure » façon de mélanger une liste d'éléments qui contient des doublons tels que le cas où array [i] == array [i + 1] est évitée autant que possible.

Je travaille sur un écran publicitaire pondéré (je peux régler le nombre d'affichages par rotation pour tout annonceur donné) et je voudrais éviter le même advertister apparaissant deux fois de suite.

Était-ce utile?

La solution 5

Pour référence, mon (très) approche naïve était quelque chose comme ça (en fait à l'aide d'appels LINQ / SQL mais est simplifiée):

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;

Cela évitera les doublons jusqu'à la fin, mais oui, il payerait de vérifier en arrière par la suite returnList et s'il y a des doublons tailing, essayer de les placer dans le mélange précédent.

Autres conseils

Personnellement, je pense que la meilleure façon de remettre ce serait randomiser le tableau, puis itérer jusqu'à ce que vous trouverez 2 éléments avec la même valeur qui sont à côté de l'autre. Lorsque vous trouvez deux des mêmes valeurs à côté eachother, déplacez le plus tard à un autre endroit dans le tableau par itérer sur le tableau jusqu'à ce que vous trouviez un endroit tel qu'il ne soit pas à côté une autre de la même valeur. Si vous ne trouvez pas une valeur, il suffit de laisser là où il est, et continuer avec l'élément suivant du tableau. Ce ne sera probablement pas la solution la plus optimale, mais sera très bien pour petits ensembles de données, et probablement la plus simple à programmer.

Quel est le plus grand nombre de copies que vous pourriez avoir? 2, 3, tout?

scroll top