2012-08-15 5 views
0

일부 연구를 위해 일부 Java 코드에서 작업 중이며 ArrayList의 모든 순열을 반복하는 방법이 필요합니다. 나는 이전에 제기 된 몇 가지 질문을 살펴 보았지만, 대부분은 내가하고 싶은 일이 아니었고, 가까운 사람들은 Perl로 작성된 문자열과 예제 코드를 다루는 해답을 얻었고, 보였던 구현의 경우에는 작동 할 것 같은 ... 실제로 작동하지 마십시오.배열의 순열 반복

이상적으로 필자는 함수 permute (list, i)를 작성하는 데 유용한 팁/코드 스 니펫을 찾고 있는데, 0에서 list.size()로갑니다! 내 ArrayList의 모든 순열을 제공합니다.

+0

n! 꽤 빠르다. 당신의 목록은 얼마나 큰가요? – GriffeyDog

+0

순열에 대해 이야기 할 때 문자열의 문자와 목록의 노드간에 차이가 없습니다. –

+0

당신은'모든 순열의 alforithm'에 구글을 시도 했습니까? 실제로 당신이 필요로하는 것 – maks

답변

2

0부터 (n! - 1)까지 계산하여 n 개의 요소 목록의 모든 순열을 나열합니다. 아이디어는 factorial number system을 사용하고 번호를 사용하여 어떤 순열을 사용할지 결정하는 인코딩 된 방법으로 해석하여 숫자를 다시 쓰는 것입니다. 궁금하신 분은 a C++ implementation of this algorithm입니다. 나 또한 한 번 gave a talk에 대해, 당신이 주제에 대한 영상을 원할 경우에 대비해.

희망이 도움이됩니다.

+0

프리젠 테이션을 통해 나는 건너 뜁니다. 철저히 읽는 OP 질문을 구현하는 것이 더 쉽습니다! 아마도 프레젠테이션에 대한 약간의 소개와 도움이되는 방법이 있습니다. 재미있을 것 같습니다. – Cratylus

+0

+1 - 이것은 알려져 있습니다. '순열 매핑'으로 - Google은 다른 구현으로 이어져야합니다 – dfb

2

모든 순열을 반복하면 충분합니다. 자세한 내용은 Stepping through all permutations one swap at a time을 참조하십시오. 주어진 n의 경우 반복기는 숫자 0에서 (n-1)까지 모든 순열을 생성합니다. 숫자의 순열을 배열 요소의 순열로 변환하는 다른 반복기로 간단히 포장 할 수 있습니다. (이터레이터 내에서 int[]을 임의의 배열 /리스트로 바꿀 수는 없으며, 알고리즘은 숫자로 작업해야합니다.)

+0

감사합니다. 이것은 내가 필요로하는 것을해야한다. –