算法性能评估

       人工智能兴起得时代,什么神经网络、增强学习、深度学习等诸多牛掰的算法让人云里雾里,在学习各种各样应用不同的算法之前,不如缓一缓来了解一下如何来判断一个算法是好是坏。算法好坏直接影响到程序执行的效率,曾经读过一本关于中国象棋算法设计的书籍,该书算法设计的基本思路就是构建博弈树进行深度遍历搜素。理想的状态就是搜索到可以获胜为止,但是象棋局面的复杂度搜索起来足以让你等到胡子花白。所以作者采用了α-β搜索剪枝的办法来提高执行效率,这就使得博弈算法变得比以往要好的多。

       怎么来评估算法的好坏,主要两个方面的判断:时间复杂度&空间复杂度。不整些花里胡哨牛掰哄哄的,直接上套路。

 

时间复杂度【O】的计算:(本质就是数程序运行次数)

  1. 用常数1取代运行时间中的所有加法常数。
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则改为1。

   这样得到的结果就是大O阶。

 

假设计算机运行一次基础代码需要执行一次运算,那么下面的main函数中运行玩需要执行两次运算。

加上for循环可以看出main函数中两次循环后执行的运算次数为1+2*1+1 = 4次

运算次数的函数f(n) = 4,根据上面时间复杂度的计算规则第一条便知,时间复杂度是O(1),而不是O(4)。

时间复杂度的分类大致分为常数阶、线性阶、平方阶、立方阶、对数阶等。比如某个函数的运算次数函数为f(n)=32 + 2n + 1,则时间复杂度为O(n3)。如下表:

常见的时间复杂度如下:

执行次数函数举例

非正式术语

12

O(1)

常数阶

2n+3

O(n)

线性阶

3n²+2n+1

O(n²)

平方阶

5log2n+20

O(logn)

对数阶

2n+3nlog2n+19

O(nlogn)

nlogn阶

6n³+2n²+3n+4

O(n³)

立方阶

2n

O(2n)        

指数阶

 

时间消耗比较:

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

对于算法的设计,数据量越大,对于时间复杂度的需求便越严格,否则时间的损耗都是不同数量级的差距。

 

空间复杂度【S】的计算:(就是计算算法所需要的存储空间)

        公式:S(n) = O(f(n)),其中,n代表问题的规模,f(n)是语句关于n所占存储空间的函数。

空间复杂度不知道该说些什么好,其实在编写代码的时候,我们要有一种空间使用的概念,而不是说只知道自己在敲代码。尤其涉及到硬件开发,比如STM32,FPGA,嵌入式开发之类,它们不像PC机,由于滥用资源就会导致程序溢出空间不足。

        

        很多时候我们会牺牲空间来换取时间,目的是提高程序的执行效率。假如可以以枚举式

罗列出来的结果,在空间允许的情况下我们就不用其他逻辑关系来计算,而是以查表得方式

直接获得结果。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值