温故知新之数据结构算法复杂度

1、影响算法效率的主要因素

    算法采用的策略和方法

    问题的输入规模

    编译器所产生的代码

    计算机执行速度


2、时间复杂度

// 时间复杂度:2n + 5
long sum1(int n)
{
    long ret = 0;  \\1
    int* array = (int*)malloc(n * sizeof(int)); \\1
    int i = 0; \\1
    
    for(i=0; i<n; i++) \\n
    {
        array[i] = i + 1;
    }
    
    for(i=0; i<n; i++) \\n
    {
        ret += array[i];
    }
    
    free(array); \\1
    
    return ret; \\1
}


\\时间复杂度: n + 3
long sum2(int n)
{
    long ret = 0; \\1
    int i = 0; \\1
    
    for(i=1; i<=n; i++) \\n
    {
        ret += i;
    }
    
    return ret; \\1
}

\\时间复杂度: 3
long sum3(int n)
{
    long ret = 0; \\1
    
    if( n > 0 )
    {
        ret = (1 + n) * n / 2; \\1
    }
    
    return ret; \\1
}

    随着问题规模n的增大,它们操作数量的差异会越来越大,因此实际算法在时间效率上的差异也会变得非常明显!

    


     判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略。

    

    在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度。

    温故知新之数据结构算法复杂度_第1张图片


    3、空间复杂度

     

//空间复杂度:12 + n
long sum1(int n)
{
    long ret = 0;  \\4
    int* array = (int*)malloc(n * sizeof(int)); \\4 + 4 * n
    int i = 0; \\4
    
    for(i=0; i<n; i++)
    {
        array[i] = i + 1;
    }
    
    for(i=0; i<n; i++)
    {
        ret += array[i];
    }
    
    free(array);
    
    return ret;
}


\\空间复杂度: 8
long sum2(int n)
{
    long ret = 0; \\4
    int i = 0; \\4
    
    for(i=1; i<=n; i++)
    {
        ret += i;
    }
    
    return ret;
}

\\空间复杂度: 4
long sum3(int n)
{
    long ret = 0; \\4
    
    if( n > 0 )
    {
        ret = (1 + n) * n / 2;
    }
    
    return ret;
}
    多数情况下,算法执行时所用的时间更令人关注,如果有必要,可以通过增加空间复杂度来降低时间复杂度,同理,也可以通过增加时间复杂度来降低空间复杂度,具体问题,具体分析。

你可能感兴趣的:(温故知新之数据结构算法复杂度)