合并大小为 n 和 m 的两个未排序数组的时间复杂度

Time complexity for merging two unsorted arrays of size n and m

类似于:Time complexity for merging two sorted arrays of size n and m但未排序。

我想弄明白这个操作的时间复杂度。

你有两个不同大小的数组,你总是合并到更大的数组中。所以n总是大于m。您基于每个数组元素的单个 属性 进行合并,每次合并到 Array 1 时,您都会从 Array 2 中删除该元素,从而使 Array 2 更短。

这个的 Big O 表示法是什么?

在我看来你必须为每个 n 线性搜索一次 m。平均而言,您会在 m 中途找到合适的位置。这让你的复杂性

O(mn)

如评论中所述,虽然运算次数接近n*m/2,但big-O表示法忽略了线性常数。

我认为 Knuth 不会赞同这种美学,但至少你明白了。 :-)

如果 log(n) > m,最好做一个愚蠢的线性搜索并且有 O(m * n) 复杂度。

否则,对数组 1 进行排序,然后您可以进行快速查找并将其放入 O(n log n)(仅排序时间)。插入仍然是O(m log n),可能占主导地位。

对两个数组进行排序。人们可以为此假设 O(nlogn + mlogm) = O(nlogn)(因为 n > m),但是如果键是整数或具有您可以利用的其他属性,您可能会更接近 [=12 的理论下限=] 排序部分。

然后对于合并,你只需要花费 O(n + m) = O(n) 因为你只需要扫描一次数组来合并排序的数组。

换句话说,排序所花费的时间将占主导地位,但前提是您选择采用此算法。