Python算法系列(一):衡量算法好坏的标准

只谈情不闲聊 提交于 2019-12-03 13:35:57

Python以它特有的优雅、简洁,深深的吸引着我,对我而言用Python写算法是一件无比快乐的事情,我乐在其中


算法的开销

我眼中的好算法,首先要能正确的解决问题,这是基础,如果100次的实验有20次的较大偏差,即使代码写得再漂亮也是徒劳;其次,要有良好的可读性,并且考虑到后期维护的可能,一个好算法还要有足够好的可维护性;最后也是本文、本系列介绍的重点,就是算法的时间性能

一个算法的运行,会产生两种开销:
1)处理时间
2)空间或内存

当选择算法的时候,必须解决时间和空间的平衡问题

衡量算法的运行时间

衡量算法的运行时间有三种方法:基准评价、统计指令,以及复杂度分析

基准评价(Benchmarking)

操作

衡量算法时间代价的一种方法是,使用计算机的时钟来获取一个实际的运行时间,这个过程叫基准评价(benchamrking)或探查(profiling)

其方法是首先确定几个具有相同大小的不同数据集合的时间,然后计算出平均的时间;接下来针对越来越大的数据集合,收集相似的数据,在进行几次这样的测试后,就有了足够的数据能够预测算法对任何大小的一个数据集合的表现了

这里写图片描述

这里写图片描述

缺陷

1)不同的硬件平台的处理速度不同,因此一个算法的运行时间在不同机器上是不同的,此外程序的运行时间在不同类型的操作系统和硬件上也是不同的,最后不同的编程语言和编译器也会得到性能不同的代码

2)对于很大的数据集合,使用基准评价实际检测算法的运行时间是不切实际的

统计指令(Counting Command)

操作

估算算法性能的另一种技术,是统计对不同问题规模所要执行的指令的数目,不管在什么平台上运行这个统计数字对于算法要执行的抽象工作量给出了一个很好的预计

当统计指令的时候,所统计的是用于编写算法的较高级代码中的指令数目,而不是指令机器语言的程序中的指令数目

当以这种方式分析算法时,需要区分两类指令:
1)不管问题规模多大,都执行相同次数的指令
2)根据问题的规模,执行不同次数的指令

其中第一类指令对于性能的影响可以忽略,第二类指令在循环、递归中可以找到

这里写图片描述

这里写图片描述

缺陷

虽然统计指令没有平台依赖性,但是对于较大数据规模的问题仍然不同很好解决

复杂度分析(Complexity Analysis)

使用复杂度分析,将彻底摆脱平台依赖或不切实际的统计大量数据的尴尬

我们使用『大O表示法』(Big-O Notation)进行复杂度分析——关于大O的定义这里不再赘述,基础请自行百度之

一些常见的复杂度实例:

为了进行比较,我们让问题规模n从100开始同步变化
0)问题规模:n

100
1000
1000000

1)常数阶:C

C
C
C

2)对数阶:log2n

7
10
20

3)线性阶:n

100
1000
1000000

4)平方阶:n2

10000
1000000
1000000000000

5)指数阶:2n

OVERFLOW
OVERFLOW
OVERFLOW

下一讲介绍Python的搜索和排序算法(基本篇),敬请期待……

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!