1.前言

一个优秀的算法需要满足正确性、可读性、健壮性、高效性。一般前三个比较容易做到,高效性是不容易被开发人员自己发现的,效率低不可怕,可怕的是写代码的人不知道效率低。不同的算法对性能的影响是很大的,本文就高效性来探讨。

2.通过实际测试得出效率

用测试手段来精确计算出算法执行的时间。

优点:

可以得到算法具体的执行时间。

缺点:

(1)算法受不同设备的影响,不同设备跑出来的时间可能不同,最终导致得到的结果不可信;

(2)如果算法比较耗时,就得一直等着计算完了才能得到结果,比较浪费时间;

3.用理论知识事先分析得出效率

算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间,有时候时间效率与空间效率是相互矛盾的,要时间则要牺牲空间,要空间则要牺牲时间,也就是常说的空间换时间/时间换空间。

在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度,本文主要讲时间复杂度。

3.1.概念:

一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

3.2.表示方法:

用大O符号(Big O notation)描述函数渐进行为,主要有以下几种复杂度:

写算法时,我们应该尽量选择曲线平滑的时间复杂度。

3.2.1.常数型O(1)

  • 常见于赋值和引用等简单操作
  • 算法消耗不随变量增长而增长,性能最佳
  • 无论代码执行多少行,即使有几千几万行,时间复杂度都为O(1)
  • 实际开发过程中,一次递归的时间复杂度也为O(1)。因为O(1^n)无论n为多少都为O(1)
int i = 1;
int j = 2;
i++;
j--;
int k = i + j;

代码分析: i为1,j为2,k为3。 时间复杂度为O(1)。

3.2.2.对数型O(log n)

  • 常用代码执行次数为x,n为目标数字。符合2^x=n,推导出x=log2(n)(log n)的情况
  • 算法消耗随n的增长而增长,性能较好
int i = 100;
int j = 1;
while(j < i){j = j * 2
}

代码分析: j为128。 i为100,时间复杂度为O(log2(100))。 因为Math.log2(100)≈6.64,所以最终的时间复杂度为O(6.65)。

3.2.3.线性型O(n)

  • 常见于一次for循环,while循环
  • 算法消耗随n的增长而增长,性能一般
  • 无论n值有多大,时间复杂度都为O(n)
int n = 100;
int j = 0;
for(int i = 0; i < n; i++){j = i;
}

代码分析: i为100,j为99。 n为100,时间复杂度为O(100)。

3.2.4.线性对数型O(n log n)

  • 常用于一个对时间复杂度为O(log2(n))的代码执行一个n次循环
  • 算法消耗随n的增长而增长,性能较差
int n = 100;
for(int m = 0; m < n; m++){int i = 1;while(i < n){i = i * 2}
}

代码分析: i为128。 m为100,n为100,时间复杂度为O(m log2(n))。 因为100* Math.log2(100)≈664.39,所以最终的时间复杂度为O(664.39)。

3.2.5.平方型O(n^2)、立方型O(n^3)、K次方型O(n^k)

  • 最常见的算法时间复杂度,可用于快速开发业务逻辑
  • 常见于2次for循环,或者3次for循环,以及k次for循环
  • 算法消耗随n的增长而增长,性能糟糕
  • 实际开发过程中,不建议使用K值过大的循环,否则代码将非常难以维护
int n = 100
int v = 0;
for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){v = v + j + i;}
}

代码分析: v为990000,i为100,j为100. n为100,时间复杂度为O(100^2)。 也就是O(10000)。

立方型O(n^3)、K次方型O(n^k)和平方型O(n^2)类似,无非是多了几次循环。

// 立方型O(n^3)
for(int i =0; i < n; i++){for(int j = 0; j < n; j++){for(int m = 0; m < n; m++){}}
}
// K次方型O(n^k)
for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){for(int m = 0; m<n; m++){for(int p = 0; p < n; p++){... // for循环继续嵌套下去,k值不断增大}}}
}

3.2.6.阶乘型O(n!)

  • 极其不常见
  • 算法消耗随n的增长而增长,性能极其糟糕
void method(n) {for(int i = 0; i < n; i++) {method(n-1);}
}

阶乘型O(n!)的时间复杂度按照(n!+(n-1)!+(n-2)!+ ··· + 1) +((n-1)!+(n-2)!+ ··· + 1)··· 的方式去计算。

如何判断一个算法的好坏相关推荐

  1. 邓俊辉数据结构学习心得系列——如何正确衡量一个算法的好坏

    数据结构这门课主要关注如何设计合理的数据结构和算法,来简化时间复杂度和空间复杂度. 想要科学的解决这样一个优化的问题,最核心的思想也是最基础的,就是要量化问题.这也是将数学运用在实际问题中的一个基石. ...

  2. python量化交易alpha策略_【邢不行|量化小讲堂系列11-Python量化入门】如何判断一个策略的好坏?(建议收藏)...

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. 个人微信:xingbuxing0807,有问题欢迎 ...

  3. 【邢不行|量化小讲堂系列11-Python量化入门】如何判断一个策略的好坏?(附代码)

    引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总]请点击此处 [必读文章]EOS期现 ...

  4. 如何衡量一个算法的好坏?

    目录 一.前言 二.时间复杂度 三.空间复杂度 一.前言 算法是解决一类问题准确而完整的描述,它是程序设计的灵魂.如何衡量一个算法的好坏呢?是不是实现的代码越简洁算法越好呢? 算法在编写成可执行程序运 ...

  5. 如何衡量一个算法的好坏

    算法的衡量从两个方向出发:时间复杂度和空间复杂度.本文主要是不讲具体算法,只将算法的衡量,重点讲解如何衡量算法的复杂度,解决平时见到的XX算法时间复杂是 O(logn)O(logn),其中这个结果是怎 ...

  6. HR教你如何判断一个公司的好坏?

    版本声明:本文转载于公众号TeachPlus 昨天晚上,接到了一位朋友打来的电话,问我到底应该怎样去判断一家公司的好坏,因为这位朋友已经在工作两年了,也可以说是一位职场老鸟了,所以我很好奇他为什么会这 ...

  7. 真格基金 · 王强:判断一个项目的好坏,我会做的五个思考

    [转] http://36kr.com/p/5060493.html 天使阶段你并不需要展示你未来宏观的设想有多么伟大,更不要展示什么几年就能上市,这基本都是不靠谱的.相反,你要多强调团队和做这个事情 ...

  8. 如何评价一个算法的好坏

    首先,这个算法必须是正确的 其次,好的算法应该是友好的,便于人们理解和交流,并且是机器可执行的. 这个算法还需要足够健壮,即当输入的数据非法或不合理时,也能适当的做出正确的反应或进行相应的处理 最后它 ...

  9. 怎样判断电饭锅温度传感器的好坏?_怎样判断一个线束胶带的好坏?

    小编语:线束胶带的市场好比血海,打的热火朝天.甚至很多OEM与线束厂甚至牺牲线束的质量而换取价格,其实这样是不可取的.判断一个胶带的好坏很简单,从性能方面逐一对比,在满足OEM标准的前提下,价格最便宜 ...

最新文章

  1. Python traceback 模块, 打印异常信息
  2. 开发一个用户喜欢的ABAP接口日志程序
  3. rockbox主题包安装_DUX主题
  4. 腾讯基于全时态数据库技术的数据闪回
  5. linux7 语言包,Centos 7中文语言包的安装及中文支持
  6. db2数据库还原找不到文件_db2数据库还原
  7. python for everybody作业和测试答案_Python第九,十章练习题 (第五周作业)
  8. 如何配置 Linux ipv6 6RD隧道
  9. 计蒜客 2019 蓝桥杯省赛 A 组模拟赛(一) B:炮台实验
  10. GlusterFS集群文件系统
  11. python面对对象实验_实验题目:python面向对象程序设计
  12. SPSS常用的几种统计分析
  13. iNavFlight之MSP DJI协议分析
  14. 数据库导出换行mysql_数据库导出excel 换行
  15. 数据库应用技术课程设计之商城管理系统
  16. 中国联通、华为联合举办国内首例5G异地合奏音乐会
  17. mysql是如何保证持久性的?
  18. 只需7步,魔方6面即刻还原!
  19. gb 28181的20位编码简介
  20. 常见的代码编辑器有哪些?

热门文章

  1. 树莓派多线程c语言,在树莓派上用Make来入门简单的并行计算
  2. Eyeshot Ultimate 2021.2 Crack
  3. Tomcat部署多个Web项目
  4. 五、项目作业流程(华为项目管理法-孙科炎读书摘要)
  5. 软考和 PMP 的含金量哪个更高?
  6. android-为手机设置全局代理
  7. 数据库表设计(一)——基本原则和概念
  8. 2019国内手机市场研判:道路千万条,健康第一条
  9. 计算机网络-学习交换机
  10. 计算机毕业设计Java春之梦理发店管理源码+系统+数据库+lw文档