📜  时间复杂度的杂项问题

📅  最后修改于: 2022-05-13 01:56:10.193000             🧑  作者: Mango

时间复杂度的杂项问题

先决条件:渐近符号

时间复杂度:
时间复杂度是算法所需的时间,表示为问题大小的函数。它也可以定义为运行程序完成所需的计算机时间量。当我们解决时间复杂度问题时,这个定义最有帮助——
“它是算法为完成与输入大小相关的任务而执行的操作数。”

以下是一些时间复杂度的杂项问题,这些问题总是在不同类型的测验中经常被问到。

1. 以下代码的时间复杂度是多少——

C++
void function(int n)
{
    int i = 1, s = 1;
    while (s < n) {
        s = s + i;
        i++;
    }
}
 
// This code is contributed by Shubham Singh


C
void function(int n)
{
    int i = 1, s = 1;
    while (s < n) {
        s = s + i;
        i++;
    }
}


Java
public static void function(int n)
{
    int i = 1, s = 1;
    while (s < n) {
        s = s + i;
        i++;
    }
}
 
// This code is contributed by Shubham Singh


Python3
def function(n):
    i = 1
    s = 1
    while (s < n):
        s = s + i
        i+=1
     
# This code is contributed by Shubham Singh


C#
public static void function(int n)
{
    int i = 1, s = 1;
    while (s < n) {
        s = s + i;
        i++;
    }
}
 
// This code is contributed by Shubham Singh


Javascript


C++
void fun(int n)
{
    if (n < 5)
        cout << "GeeksforGeeks";
    else {
        for (int i = 0; i < n; i++) {
            cout << i;
        }
    }
}
 
// This code is contributed by Shubham Singh


C
void fun(int n)
{
    if (n < 5)
        printf("GeeksforGeeks");
    else {
        for (int i = 0; i < n; i++) {
            printf("%d", i);
        }
    }
}


Java
public static void fun(int n)
{
    if (n < 5)
        System.out.print("GeeksforGeeks");
    else {
        for (int i = 0; i < n; i++) {
            System.out.print(i + " ");
        }
    }
}
 
// This code is contributed by Shubham Singh


Python3
def fun(n):
    if (n < 5):
        print("GeeksforGeeks", end ="")
    else:
        for i in range(n):
            print(i, end= " ")
             
# This code is contributed by Shubham Singh


C#
public static void fun(int n)
{
    if (n < 5)
        Console.Write("GeeksforGeeks");
    else {
        for (int i = 0; i < n; i++) {
            Console.Write(i + " ");
        }
    }
}
 
// This code is contributed by Shubham Singh


Javascript


C++
void fun(int a, int b)
{
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
}
 
// This code is contributed by Shubham Singh


C
void fun(int a, int b)
{
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
}


Java
public static void fun(int a, int b)
{
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
}
 
// This code is contributed by Shubham Singh


Python3
def fun(a, b):
     
    while (a != b):
        if (a > b):
            a = a - b
        else:
            b = b - a
             
# This code is contributed by Shubham Singh


C#
public static void fun(int a, int b)
{
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
}
 
// This code is contributed by Shubham Singh


C++
void fun(int n)
{
  for(int i=0;i*i


C
void fun(int n)
{
  for(int i=0;i*i


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";
}
 
//This code is contributed by Shubham Singh


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)
        print("GeeksforGeeks");
}


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";
}


C
void fun(int n)
{
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j = j + i)
            cout << "GeeksforGeeks";
}


C
void fun(int n)
{
    for (int i = 0; i <= n / 3; i++)
        for (int j = 1; j <= n; j = j + 4)
            cout << "GeeksforGeeks";
}


C++
void fun(int n)
{
    int i = 1;
    while (i < n) {
        int j = n;
        while (j > 0) {
            j = j / 2;
        }
        i = i * 2;
    }
}
 
//This code is contributed by Shubham Singh


C
void fun(int n)
{
    int i = 1;
    while (i < n) {
        int j = n;
        while (j > 0) {
            j = j / 2;
        }
        i = i * 2;
    }
}


C
void fun(int n)
{
    int j = 1;
    while (j <= n) {
        j = j * 2;
    }
}



解决方案 -
时间复杂度 = O(√n)。

解释 -
我们可以根据关系 S i = S i-1 + i 定义“S”项。令k是程序所进行的总迭代次数

i              S
11
22
32 + 2
42 + 2 + 3
k2 + 2 + 3 + 4 + ……+ k 

当 S >= n 时,循环将在第 k迭代处停止,
⇒ S>=n ⇒ S=n
⇒ 2 + 2 + 3 + 4 + ……+ k = n
⇒ 1 + (k * (k + 1))/2 = n
⇒ k 2 = 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;
        }
    }
}
 
// This code is contributed by Shubham Singh

C

void fun(int n)
{
    if (n < 5)
        printf("GeeksforGeeks");
    else {
        for (int i = 0; i < n; i++) {
            printf("%d", i);
        }
    }
}

Java

public static void fun(int n)
{
    if (n < 5)
        System.out.print("GeeksforGeeks");
    else {
        for (int i = 0; i < n; i++) {
            System.out.print(i + " ");
        }
    }
}
 
// This code is contributed by Shubham Singh

Python3

def fun(n):
    if (n < 5):
        print("GeeksforGeeks", end ="")
    else:
        for i in range(n):
            print(i, end= " ")
             
# This code is contributed by Shubham Singh

C#

public static void fun(int n)
{
    if (n < 5)
        Console.Write("GeeksforGeeks");
    else {
        for (int i = 0; i < n; i++) {
            Console.Write(i + " ");
        }
    }
}
 
// This code is contributed by Shubham Singh

Javascript


解决方案 -
时间复杂度在最佳情况下 = 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;
    }
}
 
// This code is contributed by Shubham Singh

C

void fun(int a, int b)
{
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
}

Java

public static void fun(int a, int b)
{
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
}
 
// This code is contributed by Shubham Singh

Python3

def fun(a, b):
     
    while (a != b):
        if (a > b):
            a = a - b
        else:
            b = b - a
             
# This code is contributed by Shubham Singh

C#

public static void fun(int a, int b)
{
    while (a != b) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }
}
 
// This code is contributed by Shubham Singh


解决方案 -
最佳情况下时间复杂度 = O(1),最坏情况下时间复杂度 = O(max(a, b))。

解释 -
如果 a 和 b 的值相同,则不会执行 while 循环。因此,时间复杂度将为 O(1)。
但是如果 a!=b,那么 while 循环将被执行。设a=16,b=5;

no. of iterations     a   b
1165
216-5=115
311-5=65
46-5=15
515-1=4
614-1=3
713-1=2
812-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

C

void fun(int n)
{
  for(int i=0;i*i

解决方案 -
时间复杂度 = O(√n)。

解释 -
k为否。循环的迭代。

 i i*i 
11
222
332
442
k k2

当 i * i >=n 即 i*i=n 时,循环将停止
i*i=n ⇒ k 2 = 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";
}
 
//This code is contributed by Shubham Singh

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)
        print("GeeksforGeeks");
}


解决方案 -
时间复杂度 = O(log x n)。

解释 -
k为否。循环的迭代。

no. of itr   i=i*x
11*x=x
2x*x=x2
3x2 *x=x3
kxk-1 *x= xk

当 i>=n ⇒ x k = n 时循环将停止
⇒ x k =n(两边取log)
⇒ k=log x n
⇒因此,时间复杂度为 O(log 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)。

解释 -
一个 for 循环的时间复杂度 = O(n/2) ⇒ O(n)。
2 nd for 循环的时间复杂度 = O(n/2) ⇒ O(n)。
第 3for 循环的时间复杂度 = O(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)。

解释 -
第一个 for 循环的时间复杂度 = O(n)。第二个循环对 i 的每个值执行 n/i 次。
它的时间复杂度是 O(∑ n i=1 n/i) ⇒ O(logn)。
因此,函数的时间复杂度 = O(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;
    }
}
 
//This code is contributed by Shubham Singh

C

void fun(int n)
{
    int i = 1;
    while (i < n) {
        int j = n;
        while (j > 0) {
            j = j / 2;
        }
        i = i * 2;
    }
}

解决方案 –时间复杂度 = O(log 2 n)。

解释 -
在每次迭代中,i 变为两次 (TC=O(logn)),j 变为一半 (TC=O(logn))。因此,时间复杂度将变为 O(log 2 n)。
我们可以将此while循环转换为for循环。
for(int i = 1; i < n; i = i * 2)
for(int j=n;j > 0;j = j / 2)。

上述 for 循环的时间复杂度也是 O(log 2 n)。

10. 考虑以下 C 代码,在循环执行中进行的比较次数是多少?

C

void fun(int n)
{
    int j = 1;
    while (j <= n) {
        j = j * 2;
    }
}

解决方案 -
细胞(log 2 n)+1。

解释 -
k为否。循环的迭代。在第 k 步之后, j 的值为 2 k 。因此,k=log 2 n。在这里,我们使用log 2 n 的 ceil ,因为 log 2 n 可能是十进制的。因为我们正在为退出循环进行另一次比较。
所以,答案是 ceil(log 2 n)+1。