【问题标题】:Min swaps for sorting list of consecutive integers连续整数排序列表的最小交换
【发布时间】:2019-12-20 18:52:02
【问题描述】:

问题:

给定一个由连续整数[1, 2, 3, ..., n] 组成的无序数组,没有任何重复。您可以交换任何两个元素。您需要找到按升序对数组进行排序所需的最小交换次数。

我的解决方案/问题:

我的代码做了它应该做的;但是,对于大型数组,运行时间比允许的要长。

def minimumSwaps(arr):
    swaps = 0
    for num in range(1, len(arr)):
        if num != arr.index(num)+1: 
            arr[arr.index(num)] = arr[num-1]
            arr[num-1] = num
            swaps+=1
    return swaps

关于如何优化它的任何想法/建议?

【问题讨论】:

  • 换位的最小数量似乎需要将您尝试做的排列表示为不相交循环的产物,然后将每个循环表示为换位的产物(其中一个长度为 @ 987654327@ 可以表示为k-1 转置的乘积,但不会更少)。
  • 您似乎在寻求解决此问题的方法Hackerrank problem
  • 请参阅this quesion from Theoretical Computer Science 了解更多信息。
  • Solution with Python code 满足 Hackerrank 时间限制。

标签: python sorting optimization


【解决方案1】:

由于 list.index 方法的时间复杂度为 O(n),因此在列表长度上循环调用它会导致 O(n ^ 2) em> 时间复杂度。

您可以将列表中的数字作为 dict 映射到它们各自的索引,以便查找数字索引的平均成本为 O(1),从而导致整体时间复杂度O(n) 代替。每当执行交换时相应地更新索引:

def minimumSwaps(arr):
    index = {v: i for i, v in enumerate(arr)}
    swaps = 0
    for num in range(1, len(arr)):
        if num != index[num] + 1:
            arr[index[num]] = arr[num - 1]
            index[arr[num - 1]] = index[num]
            arr[num - 1] = num
            index[num] = arr[num - 1]
            swaps += 1
    return swaps

【讨论】:

  • 很好,该解决方案可以满足source of the posters problem 的时间限制,因此我赞成。
  • 啊,谢谢!我不知道 list.index 方法的成本为 O(n)。直到最近,我才开始特别注意效率。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2015-02-18
  • 2022-11-10
  • 2013-02-15
  • 2020-09-19
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多