繁体   English   中英

O(n log m) vs O(n+m) - 哪个更好?

[英]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) 使用二分查找

我认为您要问的是如何最好地找到两个排序数组中的公共元素。 您可以选择两种算法:

  1. “双指针”方法,即 O(m + n)。
  2. 使用二分查找来确定数组 N 中的项是否在数组 M 中。这是 O(n log m)。

如果数组接近于相同的大小,那么第一个严格线性的算法是可取的。

如果其中一个数组比另一个大得多,那么您可能需要考虑二分查找方法。 您需要在较大的数组中搜索较小数组中的项目。 例如,如果您有数组 M 和 N,其中 M 有 1,000,000 个项目,N 有 100 个项目,您有一个选择:

  • 在 N 中查找 M(即对 100 的数组进行 1,000,000 次搜索)
  • 在 M 中查找 N(即对 1,000,000 的数组进行 100 次搜索)

如果你在 N 中寻找 M,那么复杂度是 O(m log n)。 这里, m=1000000log(n)=7 (大约)

如果你在 M 中寻找 N,那么复杂度是 O(n log m)。 n=100log(m)=20 (大约)。

在那种情况下你想要做什么很清楚。

在实践中,是否应该使用 O(m+n) 或 O(n log m)(其中 n 小于 m)算法之间的界限只能凭经验确定。 这不仅仅是确定是否(m + n) < (n log m) ,因为二分搜索涉及一些双指针方法没有的开销。 即使(m + n)是两倍或三倍(n log m) ,双指针方法也很可能会更快。

两者都不是更好,因为它取决于nm的相对值。

如果您假设它们相等,则您有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM