获得1到n的第k个排列

时间:2015-02-07 18:34:00

标签: algorithm sequence permutation

我从网站上查看过,这称为单峰排列,它定义为只有一个局部最大值的序列。例如n = 5:

12345
12354
12453
12543
13452
13542
14532
15432
23451
23541
24531
25431
34521
35421
45321
54321

是否有算法来获得第k个单峰排列?

1 个答案:

答案 0 :(得分:8)

这里的技巧是将序列索引为二进制

       1234
       ----
12345 (0000)
12354 (0001)
12453 (0010)
12543 (0011)
13452 (0100)
13542 (0101)
14532 (0110)
15432 (0111)
23451 (1000)
23541 (1001)
24531 (1010)
25431 (1011)
34521 (1100)
35421 (1101)
45321 (1110)
54321 (1111)

然后观察数字1..4出现在5之前,当且仅当它们的位为0.在Python中:

def kth_unimodal(n, k):  # k is 0-indexed
  left = []
  right = []
  for j in range(1, n):  # 1..n-1
    if k & (1 << (n - 1 - j)):
      right.append(j)
    else:
      left.append(j)
  left.append(n)
  left.extend(reversed(right))
  return left