Arrays 合并两个大小为n和m的未排序数组的时间复杂性
类似于:但未分类 我想弄清楚这次行动的时间复杂性 您有两个不同大小的数组,您总是合并到更大大小的数组中。所以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表示法忽略了线性常数 我不认为克努特会赞同这种美学,但至少你知道了。:
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所代表的内容的一部分。