首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在用于排列的Steinhaus-Johnson-Trotter算法中,输出交换列表的算法是什么?

在用于排列的Steinhaus-Johnson-Trotter算法中,输出交换列表的算法是什么?
EN

Stack Overflow用户
提问于 2012-08-06 14:56:39
回答 2查看 595关注 0票数 1

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-06 16:48:39

由于决定下一个需要交换的元素是由排列的当前状态定义的,因此生成下一个交换并不比生成下一个排列更容易。

如果我必须生成其中任何一个,我的目标是实现Even's speedup。这里描述的算法应该很容易翻译成大多数编程语言。然后,如果愿意,您可以输出排列并标记掉期。下面的Python代码就是这样做的:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2015-02-12 16:34:51

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11823733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档