2014-10-02 1 views
1

j 번째 순열의 i 번째 요소 (0 < = i < n)를 결정적으로 일정한 시간과 공간에서 반환하는 생성 함수 f (i, j, n) 0 < = j < n!)의 첫 번째 n 정수 중? 그렇다면 어떻게 작동합니까? 그렇지 않다면 반발을 볼 수 있습니까?선형 시간 상수 공간 순열 생성기

이 질문은이 일에 관련이있다 : Create a random permutation of 1..N in constant space 그러나,이 경우, 우리는 일본의 우리의 선택이 아니라 특정 또는 임의의 하나에 따라 마다 순열을 생성 할 수 있어야합니다.

Random access random permutations (사실,이 질문의 작성자가 갖고 싶어했을만한 것일 수도 있습니다. 더 구체적이고 제한적이지는 않습니다. 어떤 경우에는 병렬화에 관심이 없습니다.)

그렇다면 매개 변수 j (길이가 O (n)이므로)를 제거하고 순열을 생성 할 수 있는지 알고 싶습니다. 먼저 이름을 지정하지 않고 무작위로 일정하게 선택합니다.

만약 가능하지 않다면, 확률 적으로 (하지만 여전히 결정론적인 선형 시간과 일정 공간에서) 균일하게 선택된 순열을 생성 할 수 있는지 궁금합니다. 예를 들어, 일률적으로 선택된 시퀀스를 생성하는 방법으로, 순열이 1 %보다 큰 경우도 있습니다.

내가 순열을 생성하기 위해 알고있는 모든 방법은 값의 범위를 명시 적으로 저장하거나 적어도 지금까지 생성 된 모든 숫자를 저장해야하기 때문에이 질문을하고 있습니다.

+0

https://en.wikipedia.org/wiki/Factorial_number_system – phs

+1

@phs 나는 factoriadics에 대해 알고 있고 그것들을 포함하는 해결책을 고려해 봤지만, 이것을 반전 벡터로 사용하는 방법을 생각할 수 없었습니다. 스택 상에 이미 생성 된 순열의 모든 부분을 저장하지 않고 특정 순열을 생성한다. 여기서 목표는 순열의 다른 요소를 알지 않고/치환하지 않고/찾을 수 있다는 것이다. – quintopia

답변

2

나는 얼마 전에 this problem와 비슷한 것을 시도했다.

문제를 약간 수정하면 j 번째 순열을 직접 생성 한 다음 i 번째 요소를 선택합니다.

#!/usr/bin/env python3 

from math import factorial 

def getJthPermutation(initList, j): 
    j -= 1 

    result = "" 
    fac = factorial(len(initList) - 1) 
    for div in range(len(initList) - 1, 0, -1): 
     k = j // fac 
     result += initList[k] 
     del initList[k] 

     j %= fac 

     fac //= div 
    result += initList[0] 

    return result 


def fct(i, j, n): 
    list = [str(k) for k in range(n+1)] 

    permutation = getNPermutation(list[:], j) 

    return permutation[i] 


if __name__ == "__main__": 
    print(fct(3,1000000,9)) 
    print(fct(3,1,9)) 
    print(fct(1,factorial(9), 9)) 

(if you don't have python installed)

여전히하지만 ijn에 따라 달라 것이다 복잡성 (I 착각하지 않다 경우).

+2

보기 좋게, 단일 계승 계산은 O (n)이므로 O (n^2)가됩니다. 루프 전에 한 번만 계승을 계산하고 각 루프 사이클의 끝에서'fac'를'div '로 나누면 문제를 해결할 수 있습니다. –

+1

당신은 완전히 옳습니다, 나는 나의 대답을 업데이트 할 것입니다! – ZomZom

+1

더 큰 문제는 명시 적으로 n! 결과를 저장하기 위해 O (n * lg (n)) 공간이 필요합니다. 나는 일정한 공간 해결책을 찾고있다. – quintopia