分而治之 - 在包含唯一元素的两个大小相等的数组之间找到中位数?
Posted
技术标签:
【中文标题】分而治之 - 在包含唯一元素的两个大小相等的数组之间找到中位数?【英文标题】:divide and conquer - find median between two arrays of equal size that contain unique elements? 【发布时间】:2014-03-25 13:22:28 【问题描述】:我正在尝试解决一个完全像这样的问题: nth smallest number among two databases of size n each using divide and conquer
据我所知,“比较中位数/中位数的中位数”算法会给我们解决方案吗? 我的问题是我是否理解正确。
array 1: [7 8 6 5 3]
array 2: [4 10 1 2 9]
首先,找到每个的中位数。我们可以通过查询 k=n/2 来做到这一点,其中 n 是该数组的大小。在这种情况下,作为第 3 个最小的元素,这为第一个数组提供了 6(称为m1
),为第二个数组提供了 4(称为m2
)。
由于m1 > m2
,使用该数组中小于 m1 和大于 m2 的元素创建 2 个数组。
array 1: [5 3]
array 2: [10 9]
^ 我们如何找到小于 m1 和大于 m2 的元素? 我们是否只取 m1 和 m2 并将它们与各自数组中的每个元素进行比较?我知道这在两个数组都排序时有效,但是首先对它们进行排序是否允许我们仍然获得 O(log(n)) 查询?
我假设我们可以继续使用我们的特殊查询 (can we?) 来获取该特定数组的 k=n/2 最小元素(中位数)。如果是这种情况,我们查询 k=n/2=1,留下新的m1 = 3
、m2 = 9
。
m1 < m2
,因此我们使用该数组中大于 m1 且小于 m2 的元素创建 2 个数组。
由于数组 2 中没有小于 m2 = 9
的元素,因此我们只剩下一个数组,其中一个元素大于 m1 = 3
。
[5]
我也有兴趣通过归纳查看正确性证明(即找到中位数)。
【问题讨论】:
【参考方案1】:中值算法的O(n) meidan实际上是对数组进行分区,使得它之前的元素小于它,它之后的元素大于它。
当您使用中位数的中位数作为枢轴进行递归时,您正在对数组进行分区,使其看起来像
(小于中位数的元素) - p - (大于中位数的元素)
关于正确性,当您第一次查询 k = n/2 时。你得到 m1 和 m2(m1 > m2)。现在您知道有超过 n 个元素小于 m1。所以它后面的元素永远不会成为中位数的候选者。 m2 之前的类似元素。它们前面有超过 n 个元素,因此它们永远不会成为中位数的候选者。所以中位数必须位于第二个数组的后半部分和第一个数组的前半部分。
但是现在当你递归时,你应该记住你有第二个数组的 n/2 个元素计算在内,所以你需要在两个数组的排序联合中找到占据第 n/2 个位置的元素(下半场和上半场)。
这似乎是渐近最优的,因为您总是将递归数组的大小减半。 类似于 O(n) + O(n/2) + O(n/4) ... = O(n)。
对于已排序的数组,您可以这样做是 O(logn)。
【讨论】:
以上是关于分而治之 - 在包含唯一元素的两个大小相等的数组之间找到中位数?的主要内容,如果未能解决你的问题,请参考以下文章