String 是否有一种有效的算法来寻找交换距离最差的给定字符串的排列?

String 是否有一种有效的算法来寻找交换距离最差的给定字符串的排列?,string,algorithm,permutation,swap,String,Algorithm,Permutation,Swap,给定问题中定义的交换距离(即,我们有一个字符串,该字符串排列的交换距离是返回原始字符串所需的“相邻字符交换”的最小数量) 我想要一个算法来找到给定字符串的最大可能交换距离。当然,我们可以枚举所有置换并检查每个置换的交换距离,但这是非常低效的。有更快的方法吗?允许您执行的基本操作是交换字符串的两个元素。这也是唯一允许您在中执行的操作,因此似乎您可以从排序文献中提取已确定的结果来解决问题 根据插入排序的wiki页面,最坏的情况是输入顺序相反。根据相同的逻辑,反转目标字符串应该产生一个按交换距离距离距

给定问题中定义的交换距离(即,我们有一个字符串,该字符串排列的交换距离是返回原始字符串所需的“相邻字符交换”的最小数量)


我想要一个算法来找到给定字符串的最大可能交换距离。当然,我们可以枚举所有置换并检查每个置换的交换距离,但这是非常低效的。有更快的方法吗?

允许您执行的基本操作是交换字符串的两个元素。这也是唯一允许您在中执行的操作,因此似乎您可以从排序文献中提取已确定的结果来解决问题

根据插入排序的wiki页面,最坏的情况是输入顺序相反。根据相同的逻辑,反转目标字符串应该产生一个按交换距离距离距离距离目标最远的字符串


一篇题为“关于生成插入排序的最坏情况”的论文可能会在这里有所帮助。

如果字母是不同的,我们有一个简单的场景,在序列中位置较高的字母与顺序可能不正确的更多字母相关联:

"abcde":
'e' can be out of order with 4 letters, 'd' with 3, etc.
"edcba", the reversed string, is the worst case where each letter is at max disorder
但是,当存在重复的字母时,位置较高的字母只能与不同的较早字母顺序不同:

"abbaba":
a3 max 3, b3 max 2
a2 max 2, b2 max 1
a1 max 0, b1 max 1
"aaabbb"

"aba"
a2 max 1, b1 max 1
a1 max 0
"aab" or "baa"

这不是一个完整的方法,但可能是一个有用的方向。

再次感谢!我认为,如果序列中的每个字母都是唯一的,则反转字符串只是最坏的情况。例如,考虑“ABA”-反向排列是“ABA”,并且具有交换距离0,但是“AAB”具有交换距离1(在这种情况下是最大值,我想)注意到,在这种特殊情况下,反向字符串等于排序字符串。插入排序在O(N)交换中解决已排序列表(而O(N^2)用于明显反转的列表),因此您的发现并不意外。最好的开始位置是“接近”反向字符串的位置。这可能有助于限制要搜索的排列的数量。我认为OP提到了相邻交换——从我所知的一点来看,这不是意味着最坏情况下的冒泡排序而不是插入排序吗?这是否等同于“冒泡排序的最坏情况是什么?”这是一个有趣的问题。我坦率地承认我可能错了,但从表面上看,这似乎类似于寻找最佳排序序列的问题。(即在7个比较中对5个项目进行排序)。对于较小的列表,有已知的最佳序列,但对于较大的数字,我们依赖于合理有效的算法,这些算法可以生成良好但不可证明最优的排序网络。我怀疑找到成本最高的订单也是如此。