C3 Algorithm Analysis

第三章 算法分析

数据结构:组织和访问数据的一种系统化方式
算法:是在有限的时间里一步步执行某些任务的过程

3.1实验研究

*算法时间必须要有限,这样才有意义,算法时间的长短对于评价一个算法好坏也至关重要

from time import time
start_time = time()
run algorithm
end_time = time()
elapsed = end_time-start_time   #记录运行秒数
上面这个方法并不完美,他记录的是cpu的运行时间,由于计算机往往不可能只运行当前算法,所以还有一种更公正的方法就是度量算法使用的CPU周期的数量。

算法的运行时间一般认为依赖于输入的大小和结构,所以有时候我们可以将不同输入的算法运行性能可视化,这样可以帮助我们在对实验数据进行统计分析时,以寻找出核试验数据的最好的输入大小函数
*算法分析的三个局限性:
1.很难直接比加两个算法的试验时间
2.实验不包含在实验中的输入的运行时间
3.算法必须完全实现才有意义
*计算原子操作
原子操作包括给对象指定标识符;给这个标识符的关联变量确定出来;将其直接进行的算术运算;比较运算;索引访问;函数调用;返回函数。
我们考虑算法执行,就是看其包含了多少原子操作。

3.2本书的7种函数

3.2.1 常数函数

f n = c f(n)=c(直接赋值)

3.2.2 对数函数

x = l o g b n     o r   s a y      b x = n x=log_bn\ \ \ or\ say\ \ \ \ b^x=n
一般在计算机科学中,我们令b=2,应为计算机储蓄整数用的是二进制,所以在计算机科学,我们把 l o g log 默认为 l o g 2 log_2 (不同于计算器上的log一般默认以十为底)
l o g b n log_bn 有时候用近似值来取代,那就是 l o g b n \lceil{log_bn}\rceil (向上取整)。
(注: l o g b a = l o g d a / l o g d b     ,   b l o g d a = a l o g d b log_ba=log_da/log_db\ \ \ ,\ b^{log_da}=a^{log_db}

3.2.3 线性函数

f ( n ) = n f(n)=n

3.2.4 nlog n函数

f ( n ) = n l o g n f(n)=nlogn
(函数特点:增长速度快鱼线性函数,慢于二次函数)

3.2.5 二次函数

f ( n ) = n 2 f(n)=n^2
(嵌套循环中内外层循环操作次数)

3.2.6 三次函数和其他多项式

f ( n ) = n 3 f(n)=n^3
f ( n ) = a 0 + a 1 n + . . . + a d n d f(n)=a_0+a_1n+...+a_dn^d

3.2.7 指数函数

f ( n ) = b n f(n)=b^n

3.2.8 比较增长率

leanote

3.3渐近分析

3.3.1大○符号

若函数f(n)恒小于等于c*g(n),存在c为实型常量,那么我们就称f(n)为g(n)的大○.其中,大○符号意味着给定常数因子且在渐近意义上n趋于无穷时,函数 f ( n ) g ( n ) f(n)\leq g(n)
大Ω:与大○相反,表示的是一个函数的增长速率大于或等于零一个函数,即 f ( n ) c g ( n ) f(n)\geq cg(n) ,则f(n)为g(n)的大Ω
大θ:增长速率相同,即 c g ( n ) f ( n ) c ( n ) c'g(n)\leq f(n) \leq c''(n)

3.3.2比较分析

我们通过算法运行时间来描述高效与不高效算法,

3.3.3算法分析示例

(看不下去了。。。)

猜你喜欢

转载自blog.csdn.net/qq_23129193/article/details/84790076