【问题标题】:Sorting an array which is split into x sorted parts对一个数组进行排序,该数组被分成 x 个已排序的部分
【发布时间】:2021-10-05 19:29:07
【问题描述】:
我收到了两个关于排序数组的真/假问题。问题如下-
问题 A
给定一个包含 3n 个键的数组 A,其中包含三个相等的部分
A[1,n]、A[n+1,2n] 和 A[2n+1,3n],每个都有 n 个键。每个部分都是
排序。可以将 A 的键排序为
O(n) 步中的新数组 B(最坏情况)?
问题 B
给定一个具有 10n 个键的数组 A,可以使用返回哪个元素的二进制函数进行比较
更大或者元素是否相等。数组被分成 n 个相等的部分,每个
有 10 个键。每个部分都进行了排序。是否可以对的键进行排序
在 O(n) 步中将 A 放入一个新数组 B(最坏情况)?
问题A的解决方法是我们可以使用MergeSort中的merge()函数对数组进行排序。
问题 B 的解决方案是不可能的,因为它违反了基于比较的排序算法的 Ω(nlog(n)) 下限
而且我看不出这两个问题之间的区别。是因为在问题 B 中我们首先需要应用函数吗?为什么它也禁止我们使用 merge() ?我看不出这两种情况不同的假设背后的逻辑,我觉得我遗漏了一些重要的东西。
【问题讨论】:
标签:
arrays
algorithm
sorting
merge
mergesort
【解决方案1】:
根据问题A:
很容易在 O(n) 时间内对其进行排序。
算法工作如下 ->
1. You assign 3 pointers to the start of each sequence
2. You compare the element that pointers show to
3. Select one you needed (smallest or greatest) and push it to new array
4. Increase the pointer you have selected and continue from the first step till all 3 of the pointers reached end of the array
这就是归并排序的原理,你是对的。
问题 B。
实际上是一样的,不同之处在于在计算大 O 时问题反过来。在第一个问题中,我们将n 作为数组中的元素数量,constant 作为检查数量,所以它变成了到O(3n)=>O(n)。
在第二种情况下,我们将 constant 作为元素数,数组数等于 n,因此计算将遵循 => O(n * 10)=>O(n)。
最后,我们得到了绝对相同的 O(n) 值,因为不管你有 3 数组 n 元素还是 n 3 个元素数组,但前提是你不考虑比较。比较使总复杂度乘以log(number of arrays),因为它是比较所有内容的最少步骤数。
在第一种情况下,log(const) 可以忽略不计,在第二种情况下,数组的数量是n,所以我们得出nlog(n) 的复杂度。
这就是这个任务的重点。