[英]O(n log m) vs O(n+m) - which is better?
嗨,这个时间复杂度哪个更好。
O(n log m)
vs O(n + m)
分析这两种算法,哪一种更适合大规模使用?
例如)如果 n 和 m 呈指数级大,则变为
O(2e)
vs O(e*(something linear to e))
示例问题: 2 个数组中的公共元素:
1) 2 指针方法
2) 使用二分查找
我认为您要问的是如何最好地找到两个排序数组中的公共元素。 您可以选择两种算法:
如果数组接近于相同的大小,那么第一个严格线性的算法是可取的。
如果其中一个数组比另一个大得多,那么您可能需要考虑二分查找方法。 您需要在较大的数组中搜索较小数组中的项目。 例如,如果您有数组 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)
,双指针方法也很可能会更快。
两者都不是更好,因为它取决于n
和m
的相对值。
如果您假设它们相等,则您有O(n log n)
与O(n)
,因此第二个( O(n + m)
)更快。 另一方面,如果n
实际上是常数而m
快速增长,那么您正在查看O(log m)
与O(m)
,因此第一个更好。
基本上,第一个对于大m
更好,第二个对于它们都很大的情况更好。 (如果n
在方程中占主导地位,那么它们都只是线性的。)
总之,根据您选择的两个数组的长度,结果是 m+n 与(mlogn 或 nlogm 之一)的值。 虽然 Big-O 复杂度分析没有考虑对数的“底数”,但对于这些值决定更好复杂度的问题,需要注意的一点是对数的底数是“2”而不是“10”,具体例子用于计算查看的元素数量或完成的比较数量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.