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

为什么使用list.add的嵌套循环会带来O(n^4)的时间复杂性?

  •  3
  • user3437460  · 技术社区  · 6 年前

    我遇到这个问题是因为这段代码的复杂性很大:

    ArrayList<Integer> list = new ArrayList<Integer>();
    
    for(int i = n; i>=1; i--)           //n 
        for(int j = 1; j<=i; j++)       //n     
            if(!list.contains(i*j))     //n?    
                list.add(i*j);          //1?
    

    我的问题 :为什么是O(n^4)而不是O(n^3)?

    2 回复  |  直到 6 年前
        1
  •  7
  •   k5_    6 年前

    list 有大约 n^2/2 条目[*],因此查找 list.contains(i*j) O(n^2) O(n)

    n^2

        2
  •  0
  •   pr0p    6 年前

    list.contains(i*j) 发生在 O(n^2) O(n^4) .