【数据结构实战C++】6 算法效率的度量

【数据结构实战C++】6 算法效率的度量

作者 CodeAllen ,转载请注明出处


常见的时间复杂度

在这里插入图片描述

常见时间复杂度的比较

O(1)< O(logn)<O(n)<O(n*logn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

基本身算法时间复杂度是O(2n)O(n!)O(nn)
的时候,运行时间就是不可接受的了

实例分析
在这里插入图片描述

分最好情况和最坏情况
在这里插入图片描述

一般没有特殊说明,分析算法的时间复杂度都是指最坏时间复杂度

算法的空间复杂度(space complexity)

-S(n) = S(f(n))
n为算法的问题规模
f(n)是空间使用函数,与n有关

空间复杂度实例
在这里插入图片描述
在这里插入图片描述

所需要的单位内存 : n +4
空间复杂度 :S(n + 4) = S(n)

空间与时间的策略

  • -多数情况下,算法的时间复杂度更关注
  • -有必要的话,可以通过增加额外的空间降低时间复杂度
  • -同理,也可以通过增加算法的耗时降低空间复杂度

实例分析:空间换时间

/*
    问题:
    在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。
    设计一个算法,找出出现次数最多的数字。
*/


#include <iostream>

using namespace std;

void search(int a[], int len)     // O(n)
{
    int sp[1000] = {0};
    int max = 0;
    
    for(int i=0; i<len; i++)    //遍历数组元素,作为下表统计,空间换时间
    {
        sp[a[i] - 1]++;
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max < sp[i] )
        {
            max = sp[i];
        }
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max == sp[i] )
        {
            cout << i + 1 << endl;
        }
    }
}


int main(int argc, char* argv[])
{
    int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
    
    search(a, sizeof(a)/sizeof(*a));


    return 0;
}

面试题:当两个算法的的大O表示法相同时,是够意味着两个算法的效率完全一样?

只能说明是同一个级别的,但是不能说明复杂度相同

小结
一般工程中,时间复杂度不超过0(n^3)
算法分析中,重点考虑的是最坏时间复杂度,时间复杂度也是最关注的
大O表示法童谣适合算法的空间复杂度
空间换时间是工程中经常用的策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章