线性时间常数空间置换发生器

时间:2014-10-02 05:58:06

标签: algorithm random permutation

是否存在生成函数f(i,j,n),其在确定的常数时间和空间中返回第j个排列的第i个元素(0 <= i

这个问题与此问题有关:Create a random permutation of 1..N in constant space 但是,在这种情况下,我们希望能够生成每个排列,这取决于我们对j的选择,而不仅仅是特定的或任意的。

它也与此相关:Random access random permutations (事实上​​,这可能就是那个问题的作者希望拥有的那种东西,尽管我不能确定这不是更具体和有限。无论如何,我对并行化不感兴趣。)< / p>

如果可能,那么我也想知道我们是否可以消除参数j(因为它的长度是O(n))并且只是生成一个随机选择的排列,而不必先命名它。

如果不可能,那么我想知道是否可能在概率上(但仍然在确定性线性时间和恒定空间中)产生均匀选择的置换。例如,一种产生统一选择序列的方法,该序列恰好也是> 1%的排列。

我问的是这个问题,因为我知道用于生成排列的所有方法都需要存储要明确置换的值范围,或者至少存储到目前为止生成的所有数字。

1 个答案:

答案 0 :(得分: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)

复杂性仍取决于n,但不取决于ij(如果我没有记错的话)。