时间复杂度的其他问题
先决条件: 渐近符号
时间复杂度: 时间复杂度是算法所需的时间,表示为问题大小的函数。也可以定义为运行一个程序到完成所需的计算机时间。当我们解决一个时间复杂度的问题时,这个定义帮助最大– “它是算法相对于输入大小完成任务的操作数。”
以下是一些时间复杂性的杂七杂八的问题,在不同类型的测验中经常被问到。
1。以下代码的时间复杂度是多少–
C
void function(int n)
{
int i = 1, s = 1;
while (s < n) {
s = s + i;
i++;
}
}
解– 时间复杂度= O(√n)。
解释– 我们可以根据关系 S i = S i-1 + i 来定义‘S’术语,让 k 为程序的迭代总次数
| **i** | **S** | | one | one | | Two | Two | | three | 2 + 2 | | four | 2 + 2 + 3 | | … | … | | k | 2 + 2 + 3 + 4 + ……+ k | 当 S **> =** n 时,则循环将停止在 k 第次迭代, S>= n S = n 2+2+3+4+……+k = n 1+(k *(k+1))/2 = n k2= n k =√n 因此,时间复杂度为 O(√n)。 **2。以下代码的时间复杂度是多少:** ## C++void fun(int n)
{
if (n < 5)
cout << "GeeksforGeeks";
else {
for (int i = 0; i < n; i++) {
cout << i << " ";
}
}
}
**解–**
时间复杂度=最佳情况下为 O(1),最差情况下为 O(n)。
**解释–**
这个程序包含 if 和 else 条件。因此,时间复杂性有两种可能性。如果 n 的值小于 5,那么我们只得到 *GeeksforGeeks* 作为输出,其时间复杂度为 O(1)。
但是,如果 n > =5,则 for 循环将执行,时间复杂度变为 O(n),这被认为是最坏的情况,因为它需要更多的时间。
**3。以下代码的时间复杂度是多少:**
## C++
void fun(int a, int b)
{
while (a != b) {
if (a > b)
a = a - b;
else
b = b - a;
}
}
**解–**
时间复杂度=最佳情况下 O(1),最差情况下 O(max(a,b))。
**解释–**
如果 a 和 b 的值相同,则不会执行 while 循环。因此,时间复杂度将为 0(1)。
但是如果一个!=b,则将执行 while 循环。设 a=16,b = 5;
| **迭代次数** | **一** | **b** |
| one | Sixteen | five |
| Two | 16-5=11 | five |
| three | 11-5=6 | five |
| four | 6-5=1 | five |
| five | one | 5-1=4 |
| six | one | 4-1=3 |
| seven | one | 3-1=2 |
| eight | one | 2-1=1 |
对于这种情况,while 循环执行了 8 次(a/2 16/2 8)。
如果 a=5,b=16,那么循环也将执行 8 次。所以我们可以说时间复杂度是 O(max(a/2,b/2))**O(max(a,b)) **,因为耗时比较多,所以被认为是最坏的情况。****
****4。以下代码的时间复杂度是多少:****
## **C++**
void fun(int n)
{
for(int i=0;i*i<n;i++)
cout<<"GeeksforGeeks";
}
****解–**
时间复杂度= O(√n)。**
****解释–**
让 **k** 成为循环的迭代次数。**
| **i** | **i*i** |
| one | one |
| Two | 2 2 |
| three | 3 2 |
| four | 4 2 |
| … | … |
| k | k 2 |
****当 i * i > =n 即 I * I = n
**I * I = n k2= n
**k =√n
时循环停止,因此时间复杂度为 O(√n)。********
********5。以下代码的时间复杂度是多少:********
## ****C++****
**void fun(int n, int x)
{
for (int i = 1; i < n; i = i * x) //or for(int i = n; i >=1; i = i / x)
cout << "GeeksforGeeks;
}**
******解–**
时间复杂度= O(log x n)。****
******解释–**
让 **k** 成为循环的迭代次数。****
| **itr 数量** | **i=i*x** |
| one | 1*x=x |
| Two | x*x=x 2 |
| three | x 2 *x=x 3 |
| … | … |
| k | x k-1 *x= x k |
******当 I>= n xk= n
xk= n(两边取对数)
k =对数 x n
时循环将停止因此,时间复杂度为 O(对数 x n)。******
********6。以下代码的时间复杂度是多少:********
## ****C++****
**void fun(int n)
{
for (int i = 0; i < n / 2; i++)
for (int j = 1; j + n / 2 <= n; j++)
for (int k = 1; k <= n; k = k * 2)
cout << "GeeksforGeeks";
}**
******解–**
时间复杂度= O(n 2 log 2 n)。****
******解释–**
1ST的时间复杂度为 loop = O(n/2)O(n)。
循环的 2 和的时间复杂度= 0(n/2)0(n)。
循环= 0 的 3 rd 的时间复杂度(log 2 n)。(参考问题编号–5)
因此,函数的时间复杂度将变为 O(n 2 log 2 n)。****
******7。以下代码的时间复杂度是多少:******
## ****C++****
**void fun(int n)
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j = j + i)
cout << "GeeksforGeeks";
}**
******解–**时间复杂度= O(nlogn)。****
******解释–**
循环 1 的时间复杂度= 0(n)。2 nd 循环对 i.
的每个值执行 n/i 次,其时间复杂度为 O(≘nT8】I = 1n/I)O(logn)。
因此,函数的时间复杂度= 0(nlogn)。****
******8。以下代码的时间复杂度是多少:******
## ****C++****
**void fun(int n)
{
for (int i = 0; i <= n / 3; i++)
for (int j = 1; j <= n; j = j + 4)
cout << "GeeksforGeeks";
}**
******解–**时间复杂度= O(n 2 )。****
******解释–**
第一个 for 循环的时间复杂度= O(n/3)O(n)。
第二个 for 循环的时间复杂度= O(n/4)O(n)。
因此,函数的时间复杂度将变为 O(n 2 ) **。******
******9。以下代码的时间复杂度是多少:******
## ****C++****
**void fun(int n)
{
int i = 1;
while (i < n) {
int j = n;
while (j > 0) {
j = j / 2;
}
i = i * 2;
}
}**
******解–**时间复杂度= 0(对数 2 n)。****
******解释–**
在每次迭代中,我变成两次(T.C=O(logn)),j 变成一半(T.C=O(logn))。所以,时间复杂度会变成 O(log 2 n)。
我们可以把这个 while 循环转换成 for 循环。
为(int I = 1;I0;j = j / 2)。****
****以上对于循环的时间复杂度也是 O(log 2 n)。****
******10。考虑下面的 C 代码,** **在循环的执行中进行了多少次比较?******
## ****C++****
**void fun(int n)
{
int j = 1;
while (j <= n) {
j = j * 2;
}
}**
******解决方案–**T2】天花板(原木 2 n)+1。****
******解释–**
让 **k** 成为循环的迭代次数。第 kth 步后,j 的值为 2 k 。因此,k=log 2 n,这里我们用 log 2 n 的 *ceil,因为 log 2 n 可能是小数。因为我们要为退出循环再做一次比较。
那么,答案是 ceil(log 2 n)+1。*****
版权属于:月萌API www.moonapi.com,转载请注明出处