第k个置换的第i个元素
问题内容:
是否有一种快速算法来计算序列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
问题答案:
您可能无法获得O(n)时间或空间中n个元素的第k个排列的第i个数字,因为代表数字k本身需要O(log(n!))= O(n log
n)位,并且对其进行的任何操作都具有相应的时间复杂度。