【问题标题】:Is there an efficient algorithm to find the permutation of a given string with the worst swap distance?是否有一种有效的算法来找到具有最差交换距离的给定字符串的排列?
【发布时间】:2016-05-08 01:21:18
【问题描述】:

给定在问题Counting the adjacent swaps required to convert one permutation into another 中定义的交换距离(即我们有一个字符串,并且从该字符串的排列到该字符串的交换距离是返回到原始字符串)。

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

【问题讨论】:

  • 这不等同于“冒泡排序的最坏情况是什么?”的问题
  • 一个有趣的问题。我坦率地承认我可能是错的,但从表面上看,这似乎类似于寻找最佳排序序列的问题。 (即在 7 个比较中对 5 个项目进行排序)。对于小列表有已知的最佳序列,但对于较大的列表,我们依赖于相当有效的算法,这些算法可以生成好的但不能证明是最优的排序网络。我怀疑找到最高成本的订单也是如此。

标签: string algorithm permutation swap


【解决方案1】:

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

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

一篇题为“On Generate Worst-Cases for the Insertion Sort”的论文 (link) 在这里可能会有所帮助。

【讨论】:

  • 再次感谢!我认为如果序列中的每个字母都是唯一的,则反转字符串只是最坏的情况。例如。考虑“ABA” - 反向排列是“ABA”并且交换距离为 0,但“AAB”的交换距离为 1(我认为在这种情况下这是最大值)
  • 请注意,在这种特殊情况下,反转的字符串等于排序后的字符串。插入排序解决了 O(N) 交换中的排序列表(而 O(N^2) 用于明显反转的列表),因此您的发现并不意外。最好的起点是与反转字符串“接近”的地方。这有助于限制要搜索的排列数量。
  • 我认为 OP 提到了相邻的交换——据我所知,这是否意味着最坏情况下的冒泡排序而不是插入排序?
【解决方案2】:

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

"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"

这不是一个完整的方法,但也许它是一个有用的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2023-02-12
    • 2015-10-16
    • 1970-01-01
    相关资源
    最近更新 更多