算法是计算机程序的一个基本的构建模块,描述了最终能够解决一个问题的计算过程。
算法评价:正确性;可读性;易维护性
评估算法的性能
度量算法的运行时间
A 使用计算机的时钟获取一个实际的运行时间(基准评价/探查):
1 确定几个具有相同大小的不同数据集合的时间
2 针对越来越大的数据集合,收集相似的数据
大小和对应的时间对应的翻倍
嵌套循环后,size翻倍后,time也翻倍
问题:
1 不同硬件平台的处理速度不同
2 对于很大的数据集合而言,确定某些算法的运行时间是不切实际的
B 统计指令
用于估算算法性能:统计对不同问题规模所要执行的指令的数目
- 统计指令时,所统计的是用于编写算法的教高级代码中的指令数目,而不是执行机器语言的程序中的指令书目
- 需要区分:无论问题规模大小都执行相同次数的指令(影响不显著);根据问题规模执行不同次数的指令(循环和递归等函数)
在循环中还要注意在任何的嵌套循环中都执行的指令(只要记住一个嵌套循环所执行的迭代次数即可)
迭代的次数是问题规模的平方
问题:
1 规模非常大时,计算机无法足够快
2 需要求助于逻辑和数学推理,才有完整的分析方法
度量算法所使用的内存
随问题规模而潜在的使用内存的增长率
复杂度分析
摆脱依赖平台的时间统计和不切实际的指令数
1 复杂度的阶
对任何问题规模都需要相同的操作次数 | 常数阶 | 列表索引 |
工作量和log2[问题规模]成比例 | 对数阶 | |
工作量增加和问题规模成比例 | 线性阶 | O(n) |
工作量按照n^k的速率增加 | 多项式阶 | |
指数阶 | 2^n |
大O表示法:一个算法的总工作量通常是多项式的数项之和,有一个是主项(渐近分析)
常量比例的作用:在大O分析中通常被忽略的项和系数可能在这些项很大的时候影响算法(较小的数据集合)
仔细识别没有隐藏在循环中却依赖于可变问题规模的任何指令
搜索算法
搜索最小值 O(n)
顺序搜索一个列表O(n)
最好1,最坏O(n),平均每一个可能位置找到目标所需要的迭代次数相加,总和/n (n+1)/2,即O(n)
最好情况、最坏情况和平均情况的性能
部分算法的性能取决于所处理的数据的放置方式
有序列表的二叉搜索O(log2n)
仅有一个循环,无嵌套/隐藏的循环
最坏的情况:目标不在列表中,进行n/2/2…=1所进行的除法的次数 也即2^k = n,则k=log2n
比较数据项
二叉搜索和搜索最小项,都假设列表中的项是可以相互比较的(相同类型,且都识别比较运算符)
若需 允许算法对 一个新对象的类 使用 比较运算符,应在这一类中添加方法。
现在就可以将账户放置在列表中并按照名称对其排序了