要点概论:
1. 算法概述
2. 算法的时间复杂度分析
3. 增长量级
4. 算法的空间复杂度分析
1. 算法概述
算法是指解决问题的一种方法或一个过程。算法通常使用计算机程序来实现。算法接手待处理的输入数据,然后执行相应的处理过程,最后输出处理的结果。如图所示:
算法的实现为若干指令的有穷序列,具有如下性质。
1)输入数据:算法可以接收用于处理的外部数据
2)输出结果:算法可以产生输出结果
3)确定性:算法的组成指令必须准确无歧义
4)有限性:算法指令的执行次数必须是有限的,执行的时间也必须是有限的。
再计算机上执行一个算法,会产生内存开销和时间开销,算法的性能分析包括以下两个方面。
1)时间性能分析
2)空间性能分析
2. 算法的时间复杂度分析
衡量算法有效性的一个指标是运行时间。算法的运行时间长度与算法本身的设计和所求解的问题的规模(即算法求解问题的输入量,通常以一个整数表示)有关。
算法的时间性能分析,又称为算法的时间复杂度分析。
对于问题规模较大数据,如果算法的时间复杂度呈指数分布,完成算法的时间可能趋向于无穷大,即无法完成。
一个算法运行的总时间取决于以下两个主要因素:
1)每条语句的执行成本。
2)每条语句的执行次数(频度)。
算法中语句的频度之和示例:
total = 0 for i in range(n): for j in range(n): total += a[i][j] print(total) #内循环语句运行了 n * n 次,总算发执行语句频度为: n*2 + 2
3. 增长量级
对于问题规模 n ,假如算法 A 中所有语句的频度之和为 100n + 1 ;算法 B 中所有语句的频度之和为 n*2 + n + 1。则算法 A 和 B 对于不同问题规模的运行时间对照如表所示:
问题规模 n | 算法 A的运行时间 | 算法 B 的运行时间 |
10 | 1001 | 111 |
100 | 10 001 | 10 101 |
1000 | 100 001 | 1 001 001 |
10 000 | 1 000 001 | 100 010 001 |
由表可以看出,随着问题规模 n 的增长,算法的运行时间主要取决于最高指数项。
在算法分析中,通常使用增长量级来描述。
增长量级用于描述函数的渐进增长行为,一般使用大O符号表示。
例如, 2n ,100n 与 n + 1属于相同的增长量级,记为 O(n),表示函数随 n 线性增长。
算法分析中常用的增长量级如表所示:
函数类型 | 增长量级 | 举例 | 说明 |
常量型 | 1 | count -= 1 | 语句(整数递减) |
对数型 |
㏒₂n
|
while n > 0: n = n//2 count += 1 |
除半(二分查找法等) |
线性型 | n |
for i in range(n): if i / 2 != 0: #奇数 sum_odd += i |
单循环(统计奇数的个数,顺序查找法等) |
线性对数型 |
n㏒₂n
|
(待补充) | 分而治之算法(归并排序法等) |
二次型 | n**2 |
for i in range(l,n): s = '' for j in range(l,n): s += str.format('{0:l}*{l:l}={2:2}',i,j,i*j) print(s) |
两重嵌套循环(打印九九乘法表,冒泡排序算法,选择排序算法,插入排序算法等) |
三次型 | n**3 |
for i in range(n): for j in range(i+l,n): for k in range(j+l,n): if ( a[i] + a[j] + a[k] ) == 0: count += 1 |
三重嵌套循环 |
4 . 算法的空间复杂度分析
衡量算法有效性的另一个指标是内存消耗。对于复杂的算法,如果其消耗的内存超过运行该算法的计算机的可用物理内存,则算法无法正常执行。
算法的内存消耗分析,又称为算法的空间复杂度( Space Cconplexity)分析。
python语言面向对象特性的主要代价之一是内存消耗。
python的内存消耗与其在不同计算机上的实现有关。不同版本的python有可能使用不同方法实现同一种数据类型。
确定一个python程序内存使用的典型方法是,先统计程序使用的对象的数量,然后根据对象的类型乘以各对象占用的字节数。示例如下:
import sys >>>sys.getsizeof(100) # 28 >>>sys.getsizeof('abc') # 52 >>>sys.getsizeof(True) # 28