繁体   English   中英

使用O(log(n + m))最差情况合并两个排序数组

[英]Merging Two Sorted Arrays with O(log(n+m)) Worst Case

我可以使用什么样的算法将两个排序的数组合并为一个排序的数组,最坏情况下的时间复杂度为O(log(m + n))其中n,m是数组的长度? 我对算法的经验很少,但我检查了合并排序,合并步骤的时间复杂度似乎是O(n)。 是否有不同的方法在O(log(n))中合并?

编辑:我最初没有考虑过,但也许不可能在O(log(n))中合并两个排序的数组? 实际目标是找到两个排序数组的中位数。 有没有办法在不合并它们的情况下做到这一点?

我唯一的想法是我读到合并两个二项式堆是O(log(n)),但将数组转换为二项式堆是O(n)我认为这样就行不通了。

编辑2:我将发布一个新问题,因为我已经意识到合并将永远不会足够快。 我想我需要在每个数组上执行二进制搜索,以找到log(n)中的中位数。

我不认为有一种算法会在O(log(n+m))时间内合并两个数组。

当你想到它时,这是有道理的。 如果您正在尝试创建一个新的n+m元素排序数组,则需要至少执行n+m副本。 没有办法解决这个问题。

我认为最好的方法是同时迭代每个数组,并在每次迭代时比较两个元素的值。 如果一个小于另一个(如果您希望数组按降序排序),则将该元素复制到该数组并增加该数组的索引指针,反之亦然。 如果两个元素相同,则可以将它们都添加到新排序的数组中并递增两个指针。

继续,直到其中一个指针到达其相应数组的末尾,然后一旦有指针就复制到另一个数组的其余部分。

那应该是O(m+n)

关于编辑 ,有一种方法可以在log(n + m)时间内找到两个独立数组的中位数。

您可以先找到两个排序数组(中间元素)的中位数并进行比较。 如果它们相等,那么这就是中位数。 如果第一个中位数大于第二个中位数,你知道中位数必须在第一个数组的前半部分或第二个数组的后半部分,反之亦然,如果第一个中位数小于第二个数组。

这种方法在每次迭代中将搜索空间减半,因此是log(n + m)

您需要合并数组。 所以,无论如何,你至少需要遍历2个数组,因此复杂度不能小于o(m + n)

您可能正在考虑选择算法

对于排序数据结构,找到中位数是O(1)。 对于未排序的数据结构(或将数据分类到两个逻辑分区的数据结构),运行时为O(n)。

您可以使用大规模并行缩减算法将其拉出来,但我认为这是在运行时分析术语中作弊。

所以我不相信有一种算法将它降低到O(n)以下(或者,在你的情况下,O(n + m))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM