【发布时间】:2018-07-08 02:12:23
【问题描述】:
问题来自这里:https://www.geeksforgeeks.org/minimum-number-swaps-required-sort-array/
我将在下面重复: 给定一个包含 n 个不同元素的数组,找出对数组进行排序所需的最小交换次数。
例子:
输入:{4, 3, 2, 1} 输出:2 解释 : 将索引 0 与 3 和 1 与 2 交换为 形成排序数组 {1, 2, 3, 4}。
输入:{1, 5, 4, 3, 2} 输出:2
我已经通过执行以下操作解决了这个问题。
- 对数组排序 (n log(n)) 时间
- 当我比较排序后的数组和原始数组时,创建一个散列来跟踪所需的交换。这应该是另一个 O(n) 时间
总时间复杂度应该是:O(n + (n log n)) = O(n log(n))
以下是我为此编写的代码,它适用于提供的测试用例。
def solution(array)
sorted = array.sort
puts array.inspect
puts sorted.inspect
counter_parts_that_have_been_seen = {}
number_of_swaps_required = 0
array.each_with_index do | val, idx |
if counter_parts_that_have_been_seen[val] == true
next
end
array_val = val
sorted_val = sorted[idx]
if array_val != sorted_val
puts "A swap will be required: array val is #{array_val} and sorted_array_val is #{sorted_val}"
number_of_swaps_required += 1
counter_parts_that_have_been_seen[sorted_val] = true
end
end
puts "Number of swaps required are: #{number_of_swaps_required}"
end
现在,我的问题是,如何验证正确性?我不知道这种方法是正确的。
有人能解释一下吗?
【问题讨论】:
-
我还没有真正理解您的代码,但它适用于 {3,1,2} 吗?请注意,该输入需要两次交换位置和值。
-
好吧,对于那个输入,它提供了 2 次交换。现在,即使在技术上这是正确的。我不知道我的代码是否以正确的方式到达那里。因为,我的代码假定一旦进行交换,交换的元素就处于正确的位置。但 {3, 1, 2} 并非如此。所以换句话说,让我们扩展这个问题:如何证明一个特定的答案是正确的?
-
Nswaps = Nout_of_place - Ncycles。所以问题可以归结为寻找 out_of_place 元素和循环次数。
-
您是只想找到最少的交换次数,还是以最有效的方式进行排序?
-
@FDavidov 只是问题状态的最小交换次数。以最有效的方式排序将是 O(n log(n))。数组是什么样的并不重要。
标签: algorithm sorting correctness