先决条件:算法分析
1.以下代码的时间,空间复杂度是多少:
int a = 0, b = 0;
for (i = 0; i < N; i++) {
a = a + rand();
}
for (j = 0; j < M; j++) {
b = b + rand();
}
选项:
- O(N * M)时间,O(1)空间
- O(N + M)时间,O(N + M)空间
- O(N + M)时间,O(1)空间
- 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;
}
}
选项:
- 上)
- O(N * log(N))
- O(N *平方数(N))
- 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;
}
}
选项:
- 上)
- O(nLogn)
- O(n ^ 2)
- 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更有效时,这是什么意思?
选项:
- 对于小输入,X永远是更好的选择
- 对于大量输入,X永远是更好的选择
- 对于小输入,Y永远是一个更好的选择
- 对于所有输入,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;
}
选项:
- 上)
- O(平方(N))
- O(N / 2)
- O(对数N)
输出:
4. O(log N)
说明:我们必须找到最小的x使得N / 2 ^ x N
x =对数(N)