在Steinhaus-Johnson-Trotter算法中输出交换列表的算法是什么?

时间:2012-08-06 06:56:39

标签: math permutation

根据this page,可以输出一个排列列表,其中每个新排列只是一个不同于先前排列的单个相邻交换。这是详尽无遗的,它经历了所有的排列。

我很难从描述中理解算法。我想编写一个算法来输出每个排列之间所需的交换。

2 个答案:

答案 0 :(得分:2)

当决定需要交换的下一个元素由置换的当前状态定义时,生成下一个交换并不比生成下一个置换更容易。

如果我必须生成任何一个,我的目标是实现Even's speedup。在那里描述的算法应该相当容易翻译成大多数编程语言。然后,您可以输出排列并标记交换,如果您要求。以下Python代码将执行此操作:

class Elt(object):
    def __init__(self, dir, name):
        self.dir = dir
        self.name = name

n = 6
p = [Elt(0 if i == 0 else -1, i + 1) for i in range(n)]
while(True):
    print(' '.join(str(i.name) for i in p))
    oldpos = None
    for i in range(n):
        if p[i].dir != 0 and (oldpos is None or p[oldpos].name < p[i].name):
            oldpos = i
    if oldpos is None:
        break
    mover = p[oldpos]
    newpos = oldpos + mover.dir
    p[oldpos] = p[newpos]
    p[newpos] = mover
    print(' '*(oldpos + newpos) + 'X')
    if mover.dir == -1 and (newpos == 0 or p[newpos - 1].name > mover.name):
        mover.dir = 0
    if mover.dir == 1 and (newpos == (n - 1) or p[newpos + 1].name > mover.name):
        mover.dir = 0
    for i in range(newpos):
        if p[i].name > mover.name:
            p[i].dir = 1
    for i in range(newpos, n):
        if p[i].name > mover.name:
            p[i].dir = -1

答案 1 :(得分:0)

可以找到这个算法的简单解释,以及Java代码here