O(n log m)与O(n+m)——哪个更好



嗨,这个时间复杂度中哪一个更好。

O(n log m)O(n + m)

分析这两种算法,哪一种更适合大规模使用practicall?

例如)如果n和m呈指数级大,则变为

O(2e)O(e*(something linear to e))

示例问题:两个数组中的常见元素:

1) 2指针进近

2) 使用二进制搜索

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

  1. "双指针"方法,即O(m+n)
  2. 使用二进制搜索来确定数组N中的项是否在数组M中。这是O(N log M)

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

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

  • 在N中查找M(即在100的数组上进行1000000次搜索)
  • 在M中查找N(即在1000000的数组上进行100次搜索)

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

如果你在M中寻找N,那么复杂度是O(N log M)。CCD_ 7和CCD_。

在这种情况下,你想做什么很清楚。

在实践中,应该使用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",其中采用了特定的示例来计算所查看的元素数或所进行的比较数。

最新更新