我可以使用哪种算法将两个排序的数组合并为一个排序数组,最坏情况下的时间复杂度为O(log(m + n))其中n,m是数组的长度?我对算法的经验很少,但我检查了合并排序,合并步骤的时间复杂度似乎是O(n)。在O(log(n))中有不同的合并方法吗?
编辑:我最初没有考虑过,但也许不可能在O(log(n))中合并两个排序的数组?实际目标是找到两个排序数组的中位数。有没有办法在不合并它们的情况下做到这一点?
我唯一的想法是我读到合并两个二项式堆是O(log(n)),但是将数组转换为二项式堆是O(n)我认为这样就不行了。 / p>
Edit2:我要发布一个新问题,因为我已经意识到合并将永远不会足够快。我想我需要在每个数组上执行二进制搜索,以找到log(n)中的中位数。
答案 0 :(得分:6)
我不认为有一种算法会在document.getElementById("id").style.background = "red";
时间内合并两个数组。
当你想到它时,这是有道理的。如果您尝试创建新的O(log(n+m))
元素排序数组,则至少需要n+m
个副本。没有办法解决这个问题。
我认为最好的方法是同时迭代每个数组,并在每次迭代时比较两个元素的值。如果一个小于另一个(如果您希望数组按降序排序),则将该元素复制到该数组并增加该数组的索引指针,反之亦然。如果两个元素相同,则可以将它们都添加到新排序的数组中并递增两个指针。
继续,直到其中一个指针到达其相应数组的末尾,然后一旦有另一个数组的其余部分复制。
那应该是n+m
关于您的修改,有一种方法可以在O(m+n)
时间内找到两个独立数组的中位数。
您可以先找到两个排序数组(中间元素)的中位数并进行比较。如果它们相等,那么这就是中位数。如果第一个中位数大于第二个中位数,则您知道中位数必须位于第一个数组的前半部分或第二个数组的后半部分,反之亦然。 s中位数小于第二个。
此方法在每次迭代时将搜索空间减半,因此log(n + m)
答案 1 :(得分:1)
您需要合并数组。所以,无论如何,你至少需要遍历2个数组,所以复杂度不能小于o(m + n)
答案 2 :(得分:1)
你可能会想到The Selection Algorithm。
对于排序数据结构,找到中位数是O(1)。对于未排序的数据结构(或将数据分类到两个逻辑分区的数据结构),运行时为O(n)。
您可以使用大规模并行缩减算法将其删除,但我认为这是在运行时分析术语中作弊。
所以我不相信有一种算法可以将它降低到O(n)以下(或者,在你的情况下,O(n + m))