一尘不染

第k个置换的第i个元素

algorithm

是否有一种快速算法来计算序列0..n-1 (0 <= i < n)的第k个排列(0 <= k < n!)的第i个元素?

可以选择排列的任何顺序,而不必按词典顺序排列。有一些算法可以构造第-
k个置换O(n)(请参见下文)。但是,这里不需要完整的排列,只需i第-个元素即可。有没有比这更好的算法O(n)

是否有一种算法的空间复杂度小于O(n)?

有一些算法可以k通过处理大小数组来构造第n
个置换n(请参见下文),但是空间需求对于large可能是不希望的n。是否有一种算法需要较少的空间,尤其是仅i需要-th元素时?


算法构建k序列的排列第0..n-1一个时间 空间的复杂性O(n)

def kth_permutation(n, k):
    p = range(n)
    while n > 0:
        p[n - 1], p[k % n] = p[k % n], p[n - 1]
        k /= n
        n -= 1
    return p

资料来源:http
:
//webhome.cs.uvic.ca/~ruskey/Publications/RankPerm/MyrvoldRuskey.pdf


阅读 262

收藏
2020-07-28

共1个答案

一尘不染

您可能无法获得O(n)时间或空间中n个元素的第k个排列的第i个数字,因为代表数字k本身需要O(log(n!))= O(n log
n)位,并且对其进行的任何操作都具有相应的时间复杂度。

2020-07-28