배열의 순열
배열의 순열을 생성하는 것은 일반적인 계산 작업입니다. 고유한 요소의 배열이 주어지면 이러한 요소의 가능한 모든 배열을 어떻게 계산할 수 있습니까?
재귀 알고리즘
순열 생성을 위한 고전적인 알고리즘 중 하나는 재귀를 사용합니다. 핵심 아이디어는 배열의 각 요소를 잠재적인 첫 번째 요소로 간주한 다음 나머지 요소를 재귀적으로 순열하여 첫 번째 요소로 시작하는 가능한 모든 조합을 찾는 것입니다.
// 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!