第三章 算法分析
数据结构:组织和访问数据的一种系统化方式
算法:是在有限的时间里一步步执行某些任务的过程
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(直接赋值) 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
x=logbn or say bx=n
一般在计算机科学中,我们令b=2,应为计算机储蓄整数用的是二进制,所以在计算机科学,我们把
l
o
g
log
log默认为
l
o
g
2
log_2
log2(不同于计算器上的log一般默认以十为底)
l
o
g
b
n
log_bn
logbn有时候用近似值来取代,那就是
⌈
l
o
g
b
n
⌉
\lceil{log_bn}\rceil
⌈logbn⌉(向上取整)。
(注:
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}
logba=logda/logdb , blogda=alogdb)
3.2.3 线性函数
f ( n ) = n f(n)=n f(n)=n
3.2.4 nlog n函数
f
(
n
)
=
n
l
o
g
n
f(n)=nlogn
f(n)=nlogn
(函数特点:增长速度快鱼线性函数,慢于二次函数)
3.2.5 二次函数
f
(
n
)
=
n
2
f(n)=n^2
f(n)=n2
(嵌套循环中内外层循环操作次数)
3.2.6 三次函数和其他多项式
f
(
n
)
=
n
3
f(n)=n^3
f(n)=n3
f
(
n
)
=
a
0
+
a
1
n
+
.
.
.
+
a
d
n
d
f(n)=a_0+a_1n+...+a_dn^d
f(n)=a0+a1n+...+adnd
3.2.7 指数函数
f ( n ) = b n f(n)=b^n f(n)=bn
3.2.8 比较增长率
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)≤g(n)
大Ω:与大○相反,表示的是一个函数的增长速率大于或等于零一个函数,即
f
(
n
)
≥
c
g
(
n
)
f(n)\geq cg(n)
f(n)≥cg(n),则f(n)为g(n)的大Ω
大θ:增长速率相同,即
c
′
g
(
n
)
≤
f
(
n
)
≤
c
′
′
(
n
)
c'g(n)\leq f(n) \leq c''(n)
c′g(n)≤f(n)≤c′′(n)
3.3.2比较分析
我们通过算法运行时间来描述高效与不高效算法,
3.3.3算法分析示例
(看不下去了。。。)