第三章算法分析
数据结构:组织和访问数据的一种系统化方式
算法:在有限的时间内一步步执行某些任务的过程
实验研究
实验分析的挑战
使用算法分析的3个局限性:
- 很难直接比较两个算法的实现运行时间,除非实验在相同的硬件和软件环境中执行
- 实验只有在有限的一组测试下才能完成,因此他们忽略了不包括在实验中的输入的运行时间
- 为了在实验上执行算法来研究它的执行时间,算法必须完全实现
进一步的实验分析
开发一种分析算法效率的方法:
- 在软硬件环境独立的情况下,在某种程度上允许我们评价任意两个算法的相对效率
- 通过研究不需要实现的高层次算法描述来执行算法
- 考虑所有可能的输入
计算原子操作
定义了一系列原子操作:
- 给对象指定一个标识符
- 确定与这个标识符相关联的对象
- 执行算术运算(如:两个数相加)
- 比较两个数的大小
- 通过索引访问Python列表的一个元素
- 调用函数
- 从函数返回
随着输入函数的变化进行测量操作
把每一个算法和函数f(n)联系起来,其中把执行的原子操作的数量描述为输入大小n的函数f(n)
最坏情况输入的研究
把算法的运行时间表示为所有可能的相同大小输入的平均值的函数
最坏情况分析比平均情况分析容易很多
最坏情况的设计会使得算法更加健壮,(一个飞毛腿总是在斜坡上练习跑步)
本书使用的7种函数
常数函数
最简单的函数
f ( n ) = c f(n)=c f(n)=c(c为常数)
对数函数
x = l o g b n x=log_bn x=logbn 当且仅当 b x = n b^x=n bx=n
对数规则:(给定实数a>0,b>1,c>0,d>1)
- l o g b ( a c ) = l o g b a + l o g b c log_b{(ac)}=log_ba+log_bc logb(ac)=logba+logbc
- l o g b ( a / c ) = l o g b a − l o g b c log_b(a/c)=log_ba-log_bc logb(a/c)=logba−logbc
- l o g b ( a c ) = c l o g b a log_b(a^c)=clog_ba logb(ac)=clogba
- l o g b a = l o g d a / l o g d b log_ba=log_da/log_db logba=logda/log