合并大小为 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)
因为你只需要扫描一次数组来合并排序的数组。
换句话说,排序所花费的时间将占主导地位,但前提是您选择采用此算法。
类似于: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)
因为你只需要扫描一次数组来合并排序的数组。
换句话说,排序所花费的时间将占主导地位,但前提是您选择采用此算法。