Mische eine Liste (mit Dubletten) zu vermeiden, um identische Elemente nebeneinander zu sein

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

Frage

Ich frage mich, ob es eine „beste“ Art und Weise ist eine Liste von Elementen zu mischen, die Duplikate, so dass der Fall, in dem Array enthält [i] == array [i + 1] wird so weit wie möglich vermieden werden.

ich auf einer gewichteten Werbeanzeige arbeite (ich die Anzahl der Anzeigen pro Umdrehung für einen bestimmten Werbetreibenden einstellen kann) und möchte das gleiche advertister vermeiden, zweimal in einer Reihe erscheinen.

War es hilfreich?

Lösung 5

Als Referenz mein (sehr) naiver Ansatz war so etwas wie (eigentlich LINQ / SQL-Aufrufe verwenden, aber dies vereinfacht):

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;

Dies wird Dubletten bis zum Ende vermeiden, aber ja würde es bezahlen rückwärts durch den returnList danach zu überprüfen und, wenn es irgendwelche Duplikate holend, versuchen Sie und legen Sie sie in der Mischung früher.

Andere Tipps

Ich persönlich denke, der einfachste Weg, dies zu Hand wäre das Array randomisieren, und dann über sie iterieren, bis Sie 2 Elemente mit dem gleichen Wert zu finden, die nebeneinander sind. Wenn Sie 2 von den gleichen Werten neben einander zu finden, in der Anordnung, die später eine an eine andere Stelle verschieben, indem Sie über das Array iterieren, bis Sie einen Platz finden, so dass es neben dem anderen nicht den gleichen Wert. Wenn Sie keinen Wert finden, lass es einfach, wo es ist, und weiter mit dem nächsten Element des Arrays. Dies wird wahrscheinlich nicht die optimale Lösung, wird aber für kleinere Datenmengen in Ordnung sein, und wahrscheinlich am einfachsten zu programmieren.

Was ist die größte Anzahl von Duplikaten können Sie haben? 2, 3, welche?

scroll top