【发布时间】:2020-01-17 13:27:30
【问题描述】:
所以我在大约 2 个月前给了我一个练习,内容如下:
给定 n (n>=4) 个不同的元素,设计一个分治算法来计算第 4 个最小的元素。在最坏的情况下,您的算法应该在线性时间内运行。
我遇到了这个问题非常困难,只能找到在最坏情况 O(n*k) 下运行的相关算法。经过几周的尝试,我们在老师的帮助下设法“解决”了这个问题。最终算法如下:
Rules: The input size can only be of size 2^k
(1): Divide input into n/2. One left array, one right array.
(2): If input size == 4, sort the arrays using merge sort.
(2.1) Merge left array with right array into a new result array with length 4.
(2.2) Return element at index [4-1]
(3): Repeat step 1
This is solved recursively and our base case is at step 2. Step 2.2 means that for all
of our recursive calls that we did, we will get a final result array of length 4, and at that
point, we can justr return the element at index [4-1].
使用这个算法,我的老师声称它在线性时间内运行。我对该语句的问题是,我们正在挖掘输入,直到我们到达输入大小为 4 的子数组,然后对其进行排序。因此,对于 8 的输入大小,我们将对 2 个长度为 4 的子数组进行排序,因为 8/4 = 2。无论如何,这如何是线性时间?我们仍在对整个输入大小进行排序,但不是按块排序吗?这对我来说真的没有意义。如果我们对整个输入大小进行排序,或者将其划分为大小为 4 的子数组,然后像这样对它们进行排序,这并不重要?还会是 O(n*log(n)) 的最坏时间吗?
希望对此有一些解释!
【问题讨论】:
-
第 2.2 步中的
[4-1]是什么? -
您的算法不完整。您错过了 (2) 中的 else 情况。如果输入大小大于 4,你会返回什么?你在哪里进行递归调用,你如何处理结果?
-
如果超过 4 个,我们也对它进行左右递归!
-
@Raj 返回索引 4-1 处的元素
标签: algorithm sorting time-complexity