java - 객체 배열의 모든 조합

기사 출처 java recursion combinations

기본적으로 25 명의 다른 사람을 포함하는 배열이 있습니다.이 사람 중 5 명을 선택하고 동일한 사람의 중복을 사용하지 않고 가능한 모든 단일 조합을 가져야합니다.

내가 생각할 수있는 유일한 논리적 방법은 5 개의 for 루프를 가지고 사람이 이미 사용되었는지 확인하는 것입니다. 비록 이것이 재귀를 포함하는 더 나은 방법이있는 것처럼 보이지만.

누구든지 도울 수 있다면 매우 감사하겠습니다.

여기 내 수업의 예가 있습니다.

public class Calculator {

    final Person[] people = new Person[25]; //Pretend we have filled in this info already

    public List<Group> generateList()
    {
        final List<Group> possible = new ArrayList<>();
        for (int a = 0; a < 25; a++)
        {
            for (int b = 0; b < 25; b++)
            {
                for (int c = 0; c < 25; c++)
                {
                    for (int d = 0; d < 25; d++)
                    {
                        for (int e = 0; e < 25; e++)
                        {
                            final Group next = new Group();
                            next.set = new Person[] {
                                people[a],
                                people[b],
                                people[c],
                                people[d],
                                people[e]
                            };
                            possible.add(next);
                        }
                    }
                }
            }
        }
        return possible;
    }



    class Group {

        Person[] set = new Person[5];

    }

    class Person {

        String name;
        int age;

    }

}


그러나 나는 이것을하는 가장 좋은 방법과 그것이 모든 조합을 얻을 수 있는지 확실하지 않습니다. 나는 또한 여기에 중복 검사가 없다는 것을 알고 있습니다.

if (b == a) 계속;

기타.

도움을 주시면 감사하겠습니다.
많은 옵션이 있습니다.

(1)

다음을 사용하여 알고리즘을 향상시킬 수 있습니다.

for a = 0 to 25 
  for b = a+1 to 25  // use ascending-order rule 
    for c = b+1 to 25


등-문제의 요인 적 특성을 활용하여 중복 검사를 제거합니다.

(2)

또는 전체 N ^ R 항목에 대한 단일 for 루프로 구현하고 (N에서 R 항목을 선택한 경우) 전체 오름차순이 아닌 순열을 버릴 수 있습니다. R을 미리 모르면 좋습니다. N 진법으로 계산한다고 상상해보세요

for i = 0 to N^R // count in base N
  for digit = 0 to R 
    value[digit] = (i/N^digit) mod (N^(digit+1)) // extract the required digit
    if digit>0 && value[digit]<value[digit-1], SKIP  


즉, 이러한 R 인덱스에서 순차적으로 계산합니다.

(삼)

코딩하는 데 더 길지만 큰 R 및 N에 대해 더 효율적인 마지막 옵션은 인덱스 집합을 사용하는 것입니다.

// i is an array size R, with items ranging from 0 to N
i = int[]{ 0, 1, 2, 3, 4 }; // each is an index of the items in N

while !finished
    j=0; // index to start incrementing at
    i[j] ++;


그런 다음 인덱스에서 N 이상으로 이동하면 j를 늘리고 i[j]를 늘리고 모든 i[k<j][0 1 2 ... j-1]로 설정하고 다시 계산을 시작하십시오!
이것은 모든 조합을 통해 가장 효율적으로 순환합니다.

이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/13916401/

관련 기사
java - Java의 arraylist에 대용량 파일을로드하는 가장 좋은 방법
java - 배포 (게시) 후 Weblogic 오류 : 오류 503-- 서비스를 사용할 수 없음
java - "리소스로 시도"에 문제가 있음
java - Java 인터페이스에 대한 Java 특성 파일 바인딩
java - 날짜 시간 형식 Java로 시간 추가
java - Java의 내부 클래스에서 변수에 액세스
java - ArrayIndexOutOfBoundsException 데이터 액세스 시도
java - charAt ()은 문자열을 반환하지 않습니까?
enums - Java API에서 열거 형 사용
java - 자바에서 정수 비교