【问题标题】:Steinhaus–Johnson–Trotter algorithm with an arbitrary initial state具有任意初始状态的 Steinhaus-Johnson-Trotter 算法
【发布时间】:2018-04-05 18:28:04
【问题描述】:

如果初始数组中的值未排序,那么在标准 Steinhaus–Johnson–Trotter 中必须更改什么?比如我的初始数组是312,我想生成如下结果:

312
321
231
213
123
132

我可以引入一个额外的数组来定义每个数字的初始权重,例如w[3]=1, w[1]=2, and w[2]=3 然后比较算法中的权重而不是值,但是是否可以不这样做 - 我想将算法应用于问题这个额外的数组哪里不方便?我正在寻找 C 中的解决方案。

【问题讨论】:

  • 如果您特别想要 SJT 生成的订单,您必须跟踪每个元素的位置以及它的移动方向,所以我认为您至少需要 O (n) 额外空间。 (还有其他算法可以为您提供所有排列,但它们不会给出完全相同的顺序。)
  • 我可以接受任何顺序,其中连续排列的差异仅在于彼此相邻的元素交换一次。我对最终排列没有要求,即最终排列与第一个排列的不同之处在于一次交换是不必要的。
  • 这样的话,看看Heap的算法:en.wikipedia.org/wiki/Heap%27s_algorithm
  • 不幸的是,Heap 的算法不能通过交换相邻元素来工作,不是吗?
  • 哦,相邻的,没有。我忽略了那部分,抱歉。

标签: c algorithm permutation


【解决方案1】:

只需照常将 Johnson-Trotter 算法应用于索引数组即可。但是,不是显示索引,而是在包含任意顺序的任意元素的单独数组中显示每个相应索引处的项目。

作为一个简单的例子(不是C,但思路是一样的):

from trotter import Permutations

index_permutations = Permutations(3, [0, 1, 2])

items = [3, 1, 2]

print("Indices -> Items")
for indices in index_permutations:
    print("{} -> {}".format(indices, [items[i] for i in indices]))

输出:

Indices -> Items
[0, 1, 2] -> [3, 1, 2]
[0, 2, 1] -> [3, 2, 1]
[2, 0, 1] -> [2, 3, 1]
[2, 1, 0] -> [2, 1, 3]
[1, 2, 0] -> [1, 2, 3]
[1, 0, 2] -> [1, 3, 2]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2017-12-23
    相关资源
    最近更新 更多