【发布时间】: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]
我也有兴趣通过归纳查看正确性证明(即找到中位数)。
【问题讨论】:
标签: algorithm divide-and-conquer