일부 배경 : 내가 가지고있는 문제를 해결하기 위해 다소 힘이있는 검색 알고리즘을 작성하고 있습니다. 이렇게하기 위해서는 어떤 것이 가장 적합한 지 알아 내기 위해 모든 가능성을 생성하고 평가해야합니다. 평가에는 실제로 약간의 시간이 걸리기 때문에 가능한 한 적은 수의 솔루션을 생성하여 내 검색 공간을 완전히 커버하는 것을 선호합니다. 또한, 더 많은 요소를 위해이 작업을 수행 할 수 있습니다. 어떤 숫자 K에 대해서도 보통 K가 있습니다! 순열, 그리고 그들을 모두 생성하는 것은 ~ 10보다 높은 숫자의 경우 어려울 것입니다.미러링 또는 순환 반복이없는 고유 순열
실제 문제 : 검색 공간이 제한 두 가지 요소의 모든 순열 (K = M + N은 EL1 N 시간과 M의 배 EL2)이 포함되어 있어야합니다
- 가 고유 할 필요를 (즉, 단 하나만 [aabbb]을 원한다면)
- 순열이 필요 없다 (예 : [aab]가있는 경우, [baa]도 필요하지 않음)
- 순열이 원형이므로 [aab] = [aba] = [baa]
이렇게 할 수 있다면 가능성이 크게 줄어들 것입니다. K가 이상적으로 크기 때문에 모든 순열을 먼저 생성 한 다음 이러한 기준에 따라 필터링을 수행하는 것은 불가능합니다. 나는 이미 첫 번째 제한 (아래 참조)을 수행했으며 Matlab의 정규 순열 함수 (perms)를 2^K에서 K!/N! M!으로 줄였습니다. 이는 엄청난 승리입니다. 두 번째 제한은 가능한 경우의 수를 절반으로 줄이는 것이지만, 세 번째 방법은 가능성의 수를 줄일 수 있어야한다고 생각합니다.
누구나 할 수있는 방법을 알고 있고 가능한 한 많은 가능성을 계산하는 방법을 알고 있다면 많은 도움이됩니다. 설명을 선호하지만 코드도 훌륭합니다 (C와 유사한 언어, Java (Script), Python, Ruby, Lisp/Scheme을 읽을 수 있습니다). 관심 들어
: 당신은 N-1과 M의 모든 순열이있는 경우
function genPossibilities(n, m, e1, e2)
if n == 0
return array of m e2's
else
possibilities = genPossibilities(n-1, m, e1, e2)
for every possibility:
gain = number of new possibilities we'll get for this smaller possibility*
for i in max(0,(m+n-gain))
if possibility(i) is not e1
add possiblity with e1 inserted in position i
return new possibilities
- , 당신은 할 수 있습니다 여기에 지금까지에만 고유 한 순열을 얻기위한 알고리즘이다 그들을 사용하여 N과 M에 대한 순열을 e1을 삽입하여 찾는다. 당신은 단지 어디에서나 삽입 할 수 없습니다, 왜냐하면 당신은 중복을 얻을 것이기 때문입니다. 이것이 작동하는 이유는 모르겠지만 이전의 것에서 생성 할 수있는 새로운 가능성의 수를 계산할 수 있습니다 (저는 이것을 '이득'이라고 부릅니다). 이 숫자는 첫 번째 이전 순열에 대해 M + 1에서 시작하고 이전 순열에 대해 1 씩 감소하여 0이 될 때까지, 그 시점에서 M 등으로 돌아갑니다 (M> = N 인 경우에만 작동 함). 따라서 N = 3과 M = 3에 대한 순열을 계산하려면 N = 2와 M = 3에 대해 10 개의 순열을 사용하면 그 이득은 [4 3 2 1 3 2 1 2 1 1]이됩니다. 이 이득을 순열의 길이에서 빼면 중복을 만들지 않고 새 요소 삽입을 시작할 수있는 색인이 생성됩니다.
k 요소 쌍이 아닌 2 요소의 k 튜플을 원했습니다. 그래서 2^k가 맞습니다. – job
답장을 보내 주셔서 감사합니다. 사실, 1-3 단계가 첫 번째 시도 였지만 2^k 가능성을 모두 생성합니다. 나머지는 그다지 효율적이지 않습니다. 나는 2^k 가능성 전부를 위해 여전히 무언가를해야만한다. 중요한 일이 추가된다. (거울을 쌓고 몇 차례 옮겨야 할 때마다 결과를 정렬하고 내가 가지고있는 큰 로그와 비교한다. 유지). – Jordi