동일한 요소가 서로 옆에 있음을 피하기 위해 목록 (복제) 목록을 셔플하십시오.

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

문제

배열 [i] == 배열 [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;

이것은 끝까지 복제를 피할 수 있지만 예, 나중에 리턴리스트를 통해 뒤로 확인하는 데 지불하고 복제 테일링이 있으면 믹스에 믹스에 배치하십시오.

다른 팁

이것은 매우 비슷합니다 이 질문. 예제에서 A, B 및 C를 광고주로 바꾸면 같은 문제에 도달한다고 생각합니다. 아마도 그 솔루션 중 일부가 당신을 도울 수있을 것입니다.

기본 무작위 화는 큰 세트에서 충분한 분산을 일으켜야합니다.

더 많은 것을 최소화하려면 (세트에 따라 필요하지 않을 수도 있음), 가장 간단한 방법은 무작위 배정 후 듀프에 의해 가까운 곳을 찾아서 움직일 수 있습니다 (그러나 패턴을 만들 수 있음). 더 나은 접근 방식은 나란히 속임수를 포함하는 서브 세트를 만들고 무작위 배정을 다시 만드는 것일 수 있습니다.

더 작은 세트의 경우 속임수의 수에 따라 아무것도 불가능합니다. 따라서 매우 작은 세트에 대한 솔루션은 좋은 기본 무작위 화일뿐입니다 (그리고 우리는 첫 문장으로 돌아 왔습니다).

Dilbert

개인적으로 나는 가장 쉬운 방법은 배열을 무작위 화 한 다음 서로 옆에있는 것과 동일한 값을 가진 2 개의 요소를 찾을 때까지 반복하는 것이라고 생각합니다. 서로 같은 값 중 2 개를 찾으면 동일한 값의 다른 옆에 있지 않도록 지점을 찾을 때까지 배열 위로 반복하여 배열의 다른 지점으로 나중에 다른 지점으로 이동하십시오. 값을 찾을 수 없다면 값을 그대로두고 배열의 다음 요소를 계속 남겨 두십시오. 이것은 아마도 가장 최적의 솔루션은 아니지만 더 작은 데이터 세트에 적합하며 아마도 가장 간단한 프로그램에 적합합니다.

당신이 가질 수있는 가장 큰 복제물은 무엇입니까? 2, 3, 누구입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top