算法的时间复杂度

    科技2022-08-07  117

    文章目录

    时间复杂度常数阶线性阶平方阶实例分析常见的时间复杂度


    时间复杂度

    在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况

    常数阶

    int sum =0; n =100; /执行一次/

    sum = (1+n)*n/2; /执行一次/

    printf("%d",sum); /执行一次/ 时间复杂度只有O(1)

    线性阶

    int count =1;

    while(count < n){

    count = count *2;

    /时间复杂度为O(1)的程序/

    } 这个循环是2^x = n --> x = log2^n ,即时间复杂度为O(logn)

    平方阶

    int i;

    for(i =0; i < n ; i++){

    for(j =0; j < n ; j++){

    /时间复杂度为O(1)的程序/ }

    }

    上面的程序中,对于对于内层循环,它的时间复杂度为O(n),但是它是包含在外层循环中,再循环n次,因此这段代码的时间复杂度为O(n^2)。

    int i;for(i =0; i < n ; i++){

    for(j =0; j < m ; j++){

    /时间复杂度为O(1)的程序/ }

    }

    但是,如果内层循环改成了m次,时间复杂度就为O(n*m)

    int i;

    for(i =0; i < n ; i++){

    for(j = i ; j < n ; j++){

    /时间复杂度为O(1)的程序/ }

    }

    上面的内层循环j = i ;而不是0,因为i = 0时,内层循环执行了n次,当i=1时,执行了n-1次……当i=n-1时,执行了1次,所以总的执行次数为:n+(n-1)+(n-1)+…+1 = n(n+1)/2 = n^2/2 + n/2 根据大O推导方法,保留最高阶项,n*n/2 ,然后去掉这个项相乘的常数,1/2因此,这段代码的时间复杂度为O(n^2)

    实例分析

    int i,j;

    void function(int count){

    print(count);

    }

    for(i =0; i < n ; i++){

    function (i)

    } 时间复杂度为O(n)

    int i,j;

    void function(int count){

    int j;

    for(j = count ; j < n ;j++){

    /时间复杂度为O(1)的程序/ }

    }

    for(i =0; i < n ; i++){

    function (i)

    }

    和第一个的不同之处在于把嵌套内循环放到了函数中,因此最终的时间复杂度为O(n^2)

    void function(int count){

    int j;

    for(j = count ; j < n ;j++){

    /时间复杂度为O(1)的程序/ }

    }

    n++; /执行次数为1/

    function(n); /执行次数为n/

    int i,j; for(i =0; i < n ; i++){ /执行次数为n*n/

    function(i);

    }

    for(i =0; i < n ; i++){ /执行次数为n(n+1)/2/

    for(j = i ; j < n ; j++){

    /*时间复杂度为O(1)的程序*/

    }

    }

    它的执行次数f(n) = 1 + n +n2 + n(n+1)/2 + 3/2n*n+3/2 n+1,最终它的时间复杂度为:O(n^2)

    常见的时间复杂度

    常用的时间复杂度所耗费的时间从小到大依次是:

    参考 https://www.cnblogs.com/fanchangfa/p/3868696.html

    Processed: 0.009, SQL: 8