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

Arrays 合并两个大小为n和m的未排序数组的时间复杂性,arrays,merge,big-o,Arrays,Merge,Big O,类似于:但未分类 我想弄清楚这次行动的时间复杂性 您有两个不同大小的数组,您总是合并到更大大小的数组中。所以n总是大于m。您正在基于每个数组元素的单个属性进行合并,每次合并到array 1时,您都会从array 2中删除该元素,使array 2更短 这个的大O表示法是什么?在我看来,对于每个n,你必须线性搜索m一次。平均来说,你会在中途找到合适的位置。这让你变得复杂 O(mn) 如注释中所述,尽管操作数接近n*m/2,但大O表示法忽略了线性常数 我不认为克努特会赞同这种美学,但至少你知道了。:

类似于:但未分类

我想弄清楚这次行动的时间复杂性

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


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

在我看来,对于每个n,你必须线性搜索m一次。平均来说,你会在中途找到合适的位置。这让你变得复杂

O(mn)
如注释中所述,尽管操作数接近n*m/2,但大O表示法忽略了线性常数

我不认为克努特会赞同这种美学,但至少你知道了。:-)

如果
log(n)>m
,最好执行哑线性搜索并具有
O(m*n)
复杂性


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

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

然后对于合并,您只需花费
O(n+m)=O(n)
,因为您只需扫描数组一次即可合并已排序的数组


换句话说,排序所需的时间将占主导地位,但这只有在您选择使用此算法时才有效。

需要更多关于此问题的信息,因为另一个q中的“合并”。特别是指从其他两个排序数组中生成一个排序数组。您是希望对输出进行排序,还是关心顺序?您希望两个数组中出现的项目在输出中只出现一次,还是两次?您能稍微限制一下这个问题吗?例如,我可以分配额外的辅助数据结构并使用它们来帮助合并,还是不允许这样做?@twotwo输出不需要排序。我正在将较小数组中的对象合并到较大数组中的对象(不增加数组1的长度),然后从数组2中删除元素。想象一下,它有两个名字列表,一个列表有生日,另一个列表有最喜欢的颜色。我会根据名称合并对象。明白了--“joining”是该操作的常用名称。您不需要在big-O表示法中指定“除以2”部分。常量乘数不是big-O所代表的内容的一部分。