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

时间:2016-05-24 16:18:12

标签: algorithm time-complexity

嗨,这次复杂度哪个更好。

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

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

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

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

示例问题: 2个数组中的常用元素:

1)2指针逼近

2)使用二进制搜索

3 个答案:

答案 0 :(得分:4)

两者都没有明确的更好,因为它取决于nm的相对值。

如果您认为他们相同,那么您有O(n log n) vs O(n),因此第二个(O(n + m))更快。另一方面,如果nm快速增长时实际上保持不变,那么您正在查看O(log m)O(m),因此第一个更好。

基本上,第一个对于大m更好,而第二个对于它们都很大的情况更好。 (如果n支配等式,那么它们都只是线性的。)

答案 1 :(得分:3)

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

  1. "双指针"方法,即O(m + n)。
  2. 使用二进制搜索来确定数组N中的项是否在数组M中。这是O(n log m)。
  3. 如果数组接近相同的大小,那么第一个算法(严格是线性的)更可取。

    如果其中一个阵列比另一个大得多,那么您可能需要考虑二进制搜索方法。您将要在较大的数组中搜索较小数组中的项目。例如,如果你有数组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)的两倍或三倍,两指针方法也很可能更快。

答案 2 :(得分:1)

总而言之,取决于您选择的两个数组的长度,得出的结果是m + n与(mlogn或nlogm中的一个)的值。尽管Big-O复杂度分析并未考虑对数的“底数”,但对于此类值确定更好的复杂度的问题,要注意的一点是对数的底数是“ 2”,而不是“ 10”(在特定示例中)用来计算查看的元素数或完成的比较数。