美文网首页
时间复杂度

时间复杂度

作者: 小星雪 | 来源:发表于2018-04-17 20:43 被阅读0次

    时间复杂度

    算法的时间复杂度,用来度量算法的运行时间,记作: T(n) = O(f(n))。它表示随着 输入大小n 的增大,算法执行需要的时间的增长速度可以用 f(n) 来描述。

    1. 对于一个循环,假设循环体的时间复杂度为O(n),循环次数为m,则这个循环的时间复杂度为O(nxm)
    void aFunc(int n) {
        for(int i = 0; i < n; i++) {         // 循环次数为 n
            printf("Hello, World!\n");       // 循环体时间复杂度为 O(1)
        }
    }
    

    此时时间复杂度为 O(n × 1),即 O(n)

    1. 对于多个循环,假设循环体的时间复杂度为 O(n),各个循环的循环次数分别是a, b, c...,则这个循环的时间复杂度为O(n×a×b×c...)。分析的时候应该由里向外分析这些循环。
    void aFunc(int n) {
        for(int i = 0; i < n; i++) {         // 循环次数为 n
            for(int j = 0; j < n; j++) {       // 循环次数为 n
                printf("Hello, World!\n");      // 循环体时间复杂度为 O(1)
            }
        }
    }
    
    
    

    此时时间复杂度为 O(n × n × 1),即 O(n^2)。

    1. 对于顺序执行的语句或者算法,总的时间复杂度等于其中最大的时间复杂度。
    void aFunc(int n) {
        // 第一部分时间复杂度为 O(n^2)
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                printf("Hello, World!\n");
            }
        }
        // 第二部分时间复杂度为 O(n)
        for(int j = 0; j < n; j++) {
            printf("Hello, World!\n");
        }
    }
    
    

    此时时间复杂度为 max(O(n^2), O(n)),即 O(n^2)。

    1. 对于条件判断语句,总的时间复杂度等于其中时间复杂度最大的路径的时间复杂度
    void aFunc(int n) {
        if (n >= 0) {
            // 第一条路径时间复杂度为 O(n^2)
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    printf("输入数据大于等于零\n");
                }
            }
        } else {
            // 第二条路径时间复杂度为 O(n)
            for(int j = 0; j < n; j++) {
                printf("输入数据小于零\n");
            }
        }
    }
    
    
    

    此时时间复杂度为 max(O(n^2), O(n)),即 O(n^2)。

    时间复杂度分析的基本策略是:从内向外分析,从最深层开始分析。如果遇到函数调用,要深入函数进行分析。

    参考

    十分钟从零搞定时间复杂度(计算算法的时间复杂度)

    [1] 大话数据结构

    [2] 数据结构与算法分析

    相关文章

      网友评论

          本文标题:时间复杂度

          本文链接:https://www.haomeiwen.com/subject/nvnpkftx.html