> 백엔드 개발 > C++ > 고유 요소와 고유하지 않은 요소를 모두 처리하면서 배열의 가능한 모든 순열을 어떻게 생성할 수 있습니까?

고유 요소와 고유하지 않은 요소를 모두 처리하면서 배열의 가능한 모든 순열을 어떻게 생성할 수 있습니까?

Mary-Kate Olsen
풀어 주다: 2024-12-16 06:32:14
원래의
256명이 탐색했습니다.

How Can We Generate All Possible Permutations of an Array, Handling Both Distinct and Non-Distinct Elements?

배열의 순열

배열의 순열을 생성하는 것은 일반적인 계산 작업입니다. 고유한 요소의 배열이 주어지면 이러한 요소의 가능한 모든 배열을 어떻게 계산할 수 있습니까?

재귀 알고리즘

순열 생성을 위한 고전적인 알고리즘 중 하나는 재귀를 사용합니다. 핵심 아이디어는 배열의 각 요소를 잠재적인 첫 번째 요소로 간주한 다음 나머지 요소를 재귀적으로 순열하여 첫 번째 요소로 시작하는 가능한 모든 조합을 찾는 것입니다.

// Recursive method for permutation generation
public static void permute(int[] arr, int k) {
    for (int i = k; i < arr.length; i++) {
        // Swap elements at positions k and i
        Collections.swap(arr, k, i);
        // Recursively permute the remaining elements
        permute(arr, k + 1);
        // Restore original order of elements
        Collections.swap(arr, k, i);
    }
    if (k == arr.length - 1) {
        // Once all elements are permuted, print the current permutation
        System.out.println(Arrays.toString(arr));
    }
}
로그인 후 복사

이 알고리즘에서 매개변수 k 배열의 현재 위치를 추적합니다. 처음에는 k가 0으로 설정되어 첫 번째 요소를 나타냅니다. 각 위치 k에 대해 나머지 요소를 반복하여 위치 k의 요소와 교체하고 위치 k 1부터 시작하여 나머지 배열을 재귀적으로 순열합니다. 이는 각 요소에서 시작하는 가능한 모든 배열을 효과적으로 고려합니다.

고유 요소에 대한 비재귀 알고리즘

대안, 비재귀 알고리즘은 배열의 모든 요소가 고유한 경우에 잘 작동합니다. 특정 패턴을 달성하기 위해 요소를 반복적으로 교체하여 순열을 구축합니다.

for (int tail = arr.length - 1; tail > 0; tail--) {
    // Find the first decreasing element from the end
    if (arr[tail - 1] < arr[tail]) {
        // Find the last element greater than the decreasing element
        int s = arr.length - 1;
        while (arr[tail - 1] >= arr[s]) {
            s--;
        }
        // Swap the decreasing element with the greater element
        swap(arr, tail - 1, s);
        // Reverse the order of elements after the swap
        reverse(arr, tail);
        break;
    }
}
로그인 후 복사

이 알고리즘은 배열에서 요소의 오름차순 시퀀스로 시작합니다. 배열을 오른쪽에서 왼쪽으로 스캔하여 첫 번째로 감소하는 요소를 찾습니다. 감소하는 요소를 찾으면 배열의 꼬리에서 그보다 큰 가장 작은 요소와 교체합니다. 마지막으로, 다음 순열을 얻기 위해 꼬리에 있는 요소의 순서를 반대로 바꿉니다.

동일 요소에 대한 비재귀 알고리즘

배열의 요소가 고유하지 않으므로 HashMap을 사용하여 요소를 해당 인덱스에 매핑하면 잠재적인 처리가 가능합니다. 반복:

// Create a HashMap to map elements to their indices
Map<E, Integer> map = new HashMap<>();
for (int i = 0; i < arr.length; i++) {
    map.put(arr[i], i);
}
// Sort the array in ascending order
Arrays.sort(arr);
// Initialize the index array
int[] ind = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
    ind[i] = map.get(arr[i]);
}
로그인 후 복사

올바른 매핑과 인덱싱을 사용하면 동일한 비재귀 알고리즘이 모든 순열을 생성하여 반복 요소를 적절하게 처리할 수 있습니다.

위 내용은 고유 요소와 고유하지 않은 요소를 모두 처리하면서 배열의 가능한 모든 순열을 어떻게 생성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿