خلط قائمة (مع التكرار) لتجنب عناصر متطابقة يجري بجانب بعضها البعض

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

سؤال

وأنا أتساءل عما اذا كان هناك طريقة "أفضل" لخلط قائمة من العناصر التي تحتوي على التكرارات بحيث الحالة التي يكون فيها مجموعة [أنا] == مجموعة [ط + 1] تجنبها قدر الإمكان.

وأنا أعمل على عرض الإعلانات المرجح (I يمكن ضبط عدد من العروض في دوران لأي معلن معين)، وأود أن تجنب نفسها advertister الظهور مرتين على التوالي.

هل كانت مفيدة؟

المحلول 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 بعد ذلك، وإذا كان هناك أي التكرارات المخلفات، ومحاولة وضعها في مزيج وقت سابق.

نصائح أخرى

وهذا مشابه جدا ل<لأ href = "https://stackoverflow.com/questions/344860/good-algorithm-for-combining-items-from-n-lists-into-one-with-balanced-distribu "> هذا السؤال . إذا قمت باستبدال A، B، C وفي المثال المذكور هناك مع المعلنين، وأعتقد أن وصولك إلى نفس المشكلة. ربما بعض الحلول المقترحة لذلك يمكن للمرء أن تساعدك.

والتعشئة أساسية يجب أن تؤدي ما يكفي من التشتت في مجموعة كبيرة.

إذا كنت ترغب في تقليل ان اكثر حتى (التي قد لا تكون حتى لزم الأمر اعتمادا على مجموعات)، وأبسط طريقة ستكون للعثور بالتأكيد بالقرب من المغفلين بعد التوزيع العشوائي ونقلها حول (ولكن قد خلق أنماط). قد يكون طريقة أفضل لخلق مجموعات فرعية تحتوي على جنبا إلى جنب المغفلين وإعادة التوزيع العشوائي.

لمجموعة لا شيء أصغر قد يكون ممكنا، وهذا يتوقف على عدد من المغفلين. وبالتالي فإن الحل لمجموعة صغيرة جدا من شأنه أن يكون جيدا إلا العشوائي الأساسي (ونعود في الجملة الأولى).

وشخصيا أعتقد أن أسهل طريقة لتسليم هذا من شأنه أن يكون بطريقة عشوائية على مجموعة، ثم تكرار أكثر من ذلك حتى تجد 2 العناصر بنفس القيمة التي هي بجانب بعضها البعض. عندما تجد 2 من نفس القيم بجانب بعضنا البعض، نقل في وقت لاحق واحد إلى آخر بقعة في مجموعة من بالتكرار عبر مجموعة حتى تجد بقعة مثل أنه ليس من جانب آخر من نفس القيمة. إذا لم تتمكن من العثور على قيمة، مجرد ترك الأمر حيث هو، وعلى تواصل مع العنصر التالي للصفيف. هذا ربما لن يكون الحل الأمثل الأكثر، ولكن سيكون على ما يرام لمجموعات البيانات أصغر، وربما أبسطها إلى البرنامج.

ما هو أكبر عدد من التكرارات قد تكون لديكم؟ 2، 3، أي؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top