【问题标题】:Given n and a particular permutation s, find the next permutation in lexicographic order of elements 1-n (python)给定 n 和特定排列 s,按照元素 1-n 的字典顺序找到下一个排列(python)
【发布时间】:2021-02-08 20:20:49
【问题描述】:

例如,假设我们有NextInOrder(10,(1,2,4,7)),然后将这两个作为函数的输入,我希望编写一个 python 函数,通过查找排列元素所在的字典顺序中的下一个排列来返回 (1,2,4,8)范围1-10

作为另一个例子,NextInOrder(10, (5,3,2,10)) 将返回 (5,3,4,1)

【问题讨论】:

  • 也许en.wikipedia.org/wiki/Permutation 会提供答案(按字典顺序排列的下一个排列)。接近文章结尾。
  • @ChrisCharley 仅处理排列长度与元素范围相同的情况,例如(1, 3, 2, 4, 5) 不是我想要的 (1, 9, 4)
  • 抱歉,我没有仔细阅读规格。 10P4 用于从数字 1 到 10 的长度为 4 的排列。我不确定维基百科的文章是否显示了这一点。我会再读一遍,看看它是否显示了这种情况。

标签: python permutation lexicographic lexicographic-ordering


【解决方案1】:

您可以使用从最后一个位置开始的数字计数器方法。将最后一个位置增加到一个不在先前位置中的值。当下一个值超出范围时回溯到上一个位置。

例如:

def nextPerm(N,P):
    result = list(P)           # mutable permutation
    i = len(P)-1               # position to advance (start with last)
    while i in range(len(P)):  # advance/backtrack loop
        result[i] += 1         # next value at position
        if result[i] > N:      # value beyond range
            result[i]=0
            i -= 1             # backtrack
        elif result[i] not in result[:i]: # distinct values only
            i += 1             # next position to advance
    return None if i<0 else tuple(result)

输出:

P = (1,2,4,7)
while P:
    P = nextPerm(10,P)
    print(P)

(1, 2, 4, 8)
(1, 2, 4, 9)
(1, 2, 4, 10)
(1, 2, 5, 3)
(1, 2, 5, 4)
(1, 2, 5, 6)
(1, 2, 5, 7)
(1, 2, 5, 8)
(1, 2, 5, 9)
(1, 2, 5, 10)
(1, 2, 6, 3)
...

【讨论】:

  • 非常感谢。就是最后的elif语句我搞不定!
【解决方案2】:

你可以使用itertools:

from itertools import permutations

def NextInOrder(n, current):
    perms = permutations(range(1, n+1), len(current))
    for perm in perms:
        if perm == current:
            return next(perms)

演示:

>>> NextInOrder(10,(1,2,4,7))
(1, 2, 4, 8)
>>> NextInOrder(10, (5,3,2,10))
(5, 3, 4, 1)

【讨论】:

  • 可能应该提到这是我研究的一部分,他们希望我们自己编写函数而不导入任何函数,但我不知道如何。
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 2014-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多