码迷,mamicode.com
首页 > 编程语言 > 详细

第六课、算法效率的度量

时间:2017-05-03 22:01:10      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:工程   strong   bsp   pre   using   eof   使用   arch   额外   

一、常见的时间复杂度

技术分享

常见时间复杂度的比较

技术分享

二、算法分析

技术分享

定义一个数组

技术分享

此算法最好的情况时执行一次

技术分享

而最坏的情况却要执行n次

技术分享

注意:数据结构课程中,在没有特殊说明时,所分析算法的时间复杂度都是指最坏时间复杂度

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

(1)、定义:S(n) = S(f(n))

n为算法的问题规模

f(n)为空间使用函数,与n相关

注:推导时间复杂度的方法同样适应空间复杂度

如:当算法所需空间是常数时,空间复杂度为S(1)

(2)、空间复杂度计算练习

技术分享

四、时间与空间算法策略

(1)、多数情况下,算法的时间复杂度令人关注

(2)、如果有必要,可以通过增加额外空间降低时间复杂度

(3)、同理,也可以通过增加算法的耗时降低空间复杂度

时间换空间的例子

/*
    问题: 
    在一个由自然数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]++;//将对应数字的总数按顺序存储起来,如将1的个数存在sp[0]的位置,将2的个数存在sp[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;
}

五、小结

(1)、一般而言,工程中使用的算法,时间复杂度不超过O(n^3)

(2)、算法分析设计时,重点考虑最坏情况下的时间复杂度

(3)、数据结构课程中重点关心算法的时间复杂度

(4)、空间换时间是工程开发中常用的策略

 

第六课、算法效率的度量

标签:工程   strong   bsp   pre   using   eof   使用   arch   额外   

原文地址:http://www.cnblogs.com/gui-lin/p/6803940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!