繁体   English   中英

BIG O循环分析

[英]BIG O Analysis of Loops

有人可以提供一些示例,例如:多项式O O(n ^ 2),指数O(2 ^ n)和阶乘O(n1)。 我似乎无法绕过它。

我了解
for (int i=0; i<=10; i=i*2) OR for (int i=0; i<=10; i=i/2) O(log n) for (int i=0; i<=10; i=i*2) OR for (int i=0; i<=10; i=i/2) O(log n for (int i=0; i<=10; i=i*2) OR for (int i=0; i<=10; i=i/2)
for (int i=0; i<=10; i++)(int i=10; i<=0; i--) O(n (int i=10; i<=0; i--)
O(n ^ 2)`

 for (int i=0; i<=10; i++) { for (int i=0; i<=10; i++) { //DO SOMETHING } } 

O(n ^ 2):

int count = 0;
for (int i = 0; i < n; i++){
  for (int j = 0; j < n; j++){
    count++;
  }
}

这非常简单,对于每个嵌套循环,您都可以提高功能。 因此,如果您有3个for循环而不是2个,那么它将是O(n^3)

O(2 ^ n):

public int fibonacci(int n){
    if (n<= 1) return n;
    return fibonacci(n- 2) + fibonacci(n- 1);
}

对于此方法的每次迭代,将创建另外两个“分支”(直到n <= 1),因为它具有两个递归调用。 因此,每次迭代增长都会翻倍。

上!):

public int factorialRuntime(int n) {
  int count = 0;
  for(int i=0; i<n; i++) {
    count += factorialRuntime(n-1);
  }
  return count;
}

这个例子是从这里拉出来的。

一个更明显的O(2^N)示例是:

public int count2PowerN(int n) {
  if (n <= 1) {
     return n;
  } else {
     return count2PowerN(n - 1) +  count2PowerN(n - 1);
  }
}

笔记:

  1. O(2^N)等效于c为常数的任何O(c^N) 通常使用e作为标称常数。 i,e O(e^N)
  2. 您无法通过简单的嵌套循环获得超多项式复杂度。 您需要递归或动态数据结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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