嗨,这次复杂度哪个更好。
O(n log m)
vs O(n + m)
分析这两种算法,哪种算法更适合大规模使用?
例如)如果n和m指数大则变为
O(2e)
vs O(e*(something linear to e))
示例问题: 2个数组中的常用元素:
1)2指针逼近
2)使用二进制搜索
答案 0 :(得分:4)
两者都没有明确的更好,因为它取决于n
和m
的相对值。
如果您认为他们相同,那么您有O(n log n)
vs O(n)
,因此第二个(O(n + m)
)更快。另一方面,如果n
在m
快速增长时实际上保持不变,那么您正在查看O(log m)
与O(m)
,因此第一个更好。
基本上,第一个对于大m
更好,而第二个对于它们都很大的情况更好。 (如果n
支配等式,那么它们都只是线性的。)
答案 1 :(得分:3)
我认为您要问的是如何最好地找到两个排序数组中的公共元素。您可以选择两种算法:
如果数组接近相同的大小,那么第一个算法(严格是线性的)更可取。
如果其中一个阵列比另一个大得多,那么您可能需要考虑二进制搜索方法。您将要在较大的数组中搜索较小数组中的项目。例如,如果你有数组M和N,其中M有1,000,000项,N有100项,你可以选择:
如果你在N中寻找M,则复杂度为O(m log n)。在此,m=1000000
和log(n)=7
(大约)
如果在M中寻找N,则复杂度为O(n log m)。 n=100
和log(m)=20
(约)。
在这种情况下,你想要做的很清楚。
实际上,只能凭经验确定是否应使用O(m + n)或O(n log m)(其中n小于m)算法之间的截止值。它不仅仅是确定是否(m + n) < (n log m)
的问题,因为二进制搜索涉及双指针方法没有的一点开销。即使(m + n)
是(n log m)
的两倍或三倍,两指针方法也很可能更快。
答案 2 :(得分:1)
总而言之,取决于您选择的两个数组的长度,得出的结果是m + n与(mlogn或nlogm中的一个)的值。尽管Big-O复杂度分析并未考虑对数的“底数”,但对于此类值确定更好的复杂度的问题,要注意的一点是对数的底数是“ 2”,而不是“ 10”(在特定示例中)用来计算查看的元素数或完成的比较数。