类似于:Time complexity for merging two sorted arrays of size n and m但未分类。
我正在试图弄清楚这次行动的时间复杂性。
您有两个不同大小的数组,您总是合并到更大的数组中。所以 n总是大于m 。您正在基于每个数组元素的单个属性进行合并,每次合并到Array 1
时,都会从Array 2
中移除该元素,从而缩短Array 2
。
Big O符号会是什么?
答案 0 :(得分:1)
如果log(n) > m
,最好进行愚蠢的线性搜索,并且O(m * n)
复杂度为O(n log n)
。
否则,对数组1进行排序,然后您可以快速查找并将其保存在O(m log n)
中(仅限排序时间)。插入仍然是if (results != null)
,可能占主导地位。
答案 1 :(得分:1)
对两个数组进行排序。可以假设O(nlogn + mlogm) = O(nlogn)
(因为n > m
),但如果键是整数或具有您可以利用的其他属性,则可能更接近{{1的理论下界对于排序部分。
然后,对于合并,您只需花费O(n + m) = O(n)
,因为您只需要扫描一次数组以合并已排序的数组。
换句话说,排序所需的时间占主导地位,但只有在您选择采用此算法时才会占用。
答案 2 :(得分:0)
在我看来,您必须为每个 n 线性搜索 m 。平均而言,您将在中途找到 m 中的适当位置。这使你的复杂性
O(mn)
正如评论中所提到的,虽然操作次数接近n * m / 2,但是大O符号忽略了线性常数。
我不认为Knuth会赞同美学,但至少你会明白这一点。 :-)