代码之家  ›  专栏  ›  技术社区  ›  blazerix

为什么给定的算法是O(n^2)?

  •  1
  • blazerix  · 技术社区  · 6 年前

    我正在研究一个算法,试图将它分解,并为它提出一个大的O符号。但是,我无法推断为什么它是O(n^2)

    我可以看到外环指向n,但内环将我抛向一边。

    int a = 0;
    for (i = 0; i < N; i++) {
        for (j = N; j > i; j--) {
            a = a + i + j;
        }
    }
    

    有人知道如果我在面试中突然出现这些问题,我如何才能最好地处理这些问题吗?我想更好地分析算法

    2 回复  |  直到 6 年前
        1
  •  3
  •   melpomene    6 年前

    外部循环从 0 N-1

    内部循环从 N i+1 .

    这意味着在外循环的第一次迭代中,内循环 n 步骤。在外部循环的第二次迭代中,内部循环 N-1 步骤。在外部循环的第三次迭代中,内部循环 N-2 步骤。…这将一直持续到外部循环的最后一次迭代,其中内部循环 1 步骤。

    因此,步骤总数为 N + (N-1) + (N-2) + ... + 2 + 1 或(重新排列) 1 + 2 + ... + (N-1) + N . 这个和等于 N * (N+1) / 2 ( see here 详细信息),扩展到 0.5 * N^2 + 0.5 * N . 忽略较低的幂和常量因子意味着这是在o(n^2)中。

        2
  •  3
  •   Eric    6 年前

    如果你是一个视觉上的人,你可以把外部循环看作行,而把内部循环看作列。对于外部循环的每个迭代,内部循环中的迭代(列)数减少1。

    通过视觉呈现,您可以获得:

    * * * * * 
      * * * * 
        * * * 
          * * 
            * 
    

    这是半个正方形(三角形),所以大约是(n^2)/2,也就是o(n^2)。