在O(logn)中找到合并数组中的中间元素

时间:2010-07-30 07:07:09

标签: algorithm

我们有两个相同大小的排序数组n。我们称之为数组a和b。

如何找到由a和b合并的排序数组中的中间元素?

Example:

n = 4
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]

merged = [1, 2, 3, 3, 4, 4, 5, 6]
mid_element = merged[(0 + merged.length - 1) / 2] = merged[3] = 3

更复杂的案例:

案例1:

a = [1, 2, 3, 4]
b = [3, 4, 5, 6]

案例2:

a = [1, 2, 3, 4, 8]
b = [3, 4, 5, 6, 7]

案例3:

a = [1, 2, 3, 4, 8]
b = [0, 4, 5, 6, 7]

案例4:

a = [1, 3, 5, 7]
b = [2, 4, 6, 8]

所需时间:O(log n)。有什么想法吗?

3 个答案:

答案 0 :(得分:10)

查看两个阵列的中间部分。假设一个值较小而另一个值较大。

使用较小的值丢弃数组的下半部分。丢弃具有较高值的​​数组的上半部分。现在我们留下了我们开始时的一半。

冲洗并重复,直到每个阵列中只剩下一个元素。返回那两个中较小的一个。

如果两个中间值相同,则任意选择。

致谢:Bill Li's blog

答案 1 :(得分:1)

非常有趣的任务。我不确定O(logn),但解决方案O((logn)^ 2)对我来说是显而易见的。 如果你知道第一个数组中某个元素的位置,那么你可以找到两个数组中有多少个元素然后这个值(你知道第一个数组中有多少个较小的元素,你可以使用二进制找到第二个数组中较小元素的数量搜索 - 所以只需总结这两个数字)。因此,如果你知道两个数组中较小元素的数量小于N,你应该在第一个数组中查看上半部分,否则你应该移动到下半部分。因此,您将获得内部二进制搜索的一般二进制搜索。总体复杂性将为O((logn)^ 2)

注意:如果您在第一个数组中找不到中位数,则在第二个数组中开始初始搜索。这不会对复杂性产生影响

答案 2 :(得分:0)

所以,拥有 n = 4和a = [1,2,3,4]和b = [3,4,5,6]

你基于n知道结果数组中的第k个位置,它等于n。 结果第n个元素可以是第一个数组或第二个数组。 让我们首先假设元素在第一个数组中 从[l,r]开始二元搜索中间元素,在开头l = 0,r = 3; 因此,使用中间元素,您知道同一数组中有多少元素较小,即中间 - 1。 知道中间1元素较少并且知道你需要第n个元素,你可能会让第二个数组中的[n - (middle-1)]元素更小,更大。如果那个更大且普遍的元素更小,那就是你需要的东西,如果它更大而且之前也更大,我们需要L =中间,如果它更小r =中间。 如果您没有找到第一个解决方案,请为第二个阵列执行相同操作。 总log(n)+ log(n)