算法分析基础
1. 何为效率
效率(Efficiency):
1. 当实现一个算法时,如果它在真实的输入实例上运行得更快,那么这个算法是有效的。
2. 在分析的层次上,如果一个算法与蛮力搜索比较,最坏情况下达到质量上更好的性能,它就是有效的
3. 如果一个算法有多项式运行时间,它就是有效的。
2. 渐进阶的增长顺序
渐进上界:upper bounds O(f(n)) 渐进下界:lower bounds (f(n)) 渐进紧界:运行时间T(n)既是渐进上界又是渐进下界 。
性质:
1. 传递性
2. 可加性
3. 运行时间概述
(1)线性时间O(n): 对于输入的 处理仅进行一轮
e.g. 计算最大数
max = ai
for i=2 to n
if ai > max then
max = ai
Endif
Endfor
归并排序好的表
归并排序好的表 A=a1,a2,···,an; B=b1,b2,···,bn:
在每个表中维护一个current指针,初始指向首元素
While 两个表非空时:
设ai和bi为Current指针指向的元素
将这两个元素中较小的元素加到输出表中
在最小元素被选中的表中向前移动Current指针
EndWhile
哈希映射、计数排序等
(2) O(nlogn) 算法将输入分成相同的两块递归对每块进行求解,然后用线性时间组合起来
e.g. 归并排序: 归并排序和堆排序
最大空间隔: 给定n个时间戳x1,x2,···,xn, 文件的副本到达服务器, 没有文件到达的最大时间间隔。
对时间戳进行排序,顺序扫描已排序列表,确定连续连续时间戳最大间隔。
(3)平方时间 O(n2) 枚举所有元素对
e.g. 最近点对欧式距离的蛮力算法
(4)立方时间 更加复杂的嵌套循环,列举所有元素的三元组
e.g. 不相交点集(没有共同元素)
(5)O(n^k) k大小的独立集
给定一个图形,是否存在k个节点使得没有边缘连接。
汉诺塔
(6)超出多项式时间
寻找最大规模独立集 O() 稳定匹配的暴力搜索O(n!) 斐波那契数列
补充知识: 优先队列:对于蛮力搜索的改进
一个优先队列是维护元素集合S的一个数据结构,其中每个元素有一个相关的值key(),它表示元素v的优先权;
较小的数字代表较高的优先权,但是进程不是按照它们的优先权的进程并且运行它。我们在优先队列维护这个进程,用一个进程的关键字表示它的优先权的值,调度这个最高的优先权的进程对应于从优先队列中选出具有最小关键字的元素。与此同时,我们也在新的进程到达按照它们的优先权将它们插入。
实现数据结构:堆
Algothrim Design