📜  时间复杂度分析的实践问题

📅  最后修改于: 2021-05-08 17:50:03             🧑  作者: Mango

先决条件:算法分析

1.以下代码的时间,空间复杂度是多少:

int a = 0, b = 0;
for (i = 0; i < N; i++) {
    a = a + rand();
}
for (j = 0; j < M; j++) {
    b = b + rand();
}

选项:

  1. O(N * M)时间,O(1)空间
  2. O(N + M)时间,O(N + M)空间
  3. O(N + M)时间,O(1)空间
  4. O(N * M)时间,O(N + M)空间

输出:

3. O(N + M) time, O(1) space

说明:第一个循环为O(N),第二个循环为O(M)。由于我们不知道哪个更大,所以我们说这是O(N + M)。这也可以写为O(max(N,M))。
由于没有使用额外的空间,因此空间复杂度为常数/ O(1)

2.以下代码的时间复杂度是多少:

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

选项:

  1. 上)
  2. O(N * log(N))
  3. O(N *平方数(N))
  4. O(N * N)

输出:

4. O(N*N)

解释:
上面的代码总运行次数
= N +(N – 1)+(N – 2)+…1 + 0
= N *(N +1)/ 2
= 1/2 * N ^ 2 + 1/2 * N
O(N ^ 2)次。

3.以下代码的时间复杂度是多少:

int i, j, k = 0;
for (i = n / 2; i <= n; i++) {
    for (j = 2; j <= n; j = j * 2) {
        k = k + n / 2;
    }
}

选项:

  1. 上)
  2. O(nLogn)
  3. O(n ^ 2)
  4. O(n ^ 2Logn)

输出:

2. O(nLogn)

说明:如果您注意到,j会不断加倍,直到小于或等于n。次数,我们可以将数字加倍,直到小于n等于log(n)。
让我们在这里举个例子。
对于n = 16,j = 2,4,8,16
对于n = 32,j = 2,4,8,16,32
因此,j将运行O(log n)个步骤。
我跑了N / 2步。
因此,总步数= O(n / 2 * log(n))= O(n * logn)

4.当我们说算法X渐近地比Y更有效时,这是什么意思?
选项:

  1. 对于小输入,X永远是更好的选择
  2. 对于大量输入,X永远是更好的选择
  3. 对于小输入,Y永远是一个更好的选择
  4. 对于所有输入,X永远是更好的选择
2. X will always be a better choice for large inputs

说明:在渐进分析中,我们考虑输入大小来提高算法的效率。如果在所有输入大小n大于值n0(其中n0> 0)的情况下,X花费的时间都比y短,则算法X的渐近性优于Y。

5.以下代码的时间复杂度是多少:
int a = 0, i = N;
while (i > 0) {
    a += i;
    i /= 2;
}

选项:

  1. 上)
  2. O(平方(N))
  3. O(N / 2)
  4. O(对数N)

输出:

4. O(log N)

说明:我们必须找到最小的x使得N / 2 ^ x N
x =对数(N)