算法设计与分析
视频指路:【北大公开课】 算法设计与分析 屈婉玲教授 (76p)
https://www.bilibili.com/video/BV1Ls411W7PB?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=e094efdd3063cf10d20b43f659f855a6
第一部分:算法设计和分析的数学和定理基础
算法设计的两个例子
调度问题
贪心法的解:按照加工时间从小到达安排,即3,5,8,10,15
贪心算法的反例:
按照贪心算法:单位重量价值最大的优先,按照 价值/重量 从大到小排序
然而存在更优的解:
算法设计:
投资问题
对问题进行建模:
蛮力算法(枚举):将每一种可能的分配方案计算出结果,选择最优的解
蛮力算法的效率:
数学的求解过程:(可只关注结论)
结果的推导过程参考:stirling公式
结论:蛮力算法的效率为指数函数,效率极低.因此有些问题容易找到好的算法,有些问题需要设计更好的算法
问题计算复杂度的界定:以排序问题为例
以上算法的具体过程见数据结构
问题计算复杂度的分析:同一个问题的不同种算法同时考虑分析
哪个排序算法的效率最高?
排序问题的难度?
货郎问题与计算复杂性理论
货郎问题:
问题的建模:
0-1背包问题:
问题的建模:
双机调度问题:
问题的分析:
以上问题都没有找到有效的算法可以解决,被称为NP-Hard问题
NP-Hard问题:
存在大量的这类问题
至今没有找到有效算法:现有算法的运行时间是输入的指数或更高级别
至今没有人能证明不存在这类问题的多项式时间的算法
从多项式时间的算法角度来看,这类问题等价,这类问题的难度处于可有效计算的边界
课程内容:
算法及其时间复杂度
问题及实例的概念
算法的概念
基本运算与输入规模
输入规模:
基本运算:
算法的两种时间复杂度
平均时间复杂度的计算
算法的伪码表示
算法的伪码描述
求最大公约数:欧几里得算法
小结
函数渐进的界
大O符号:可以接触到的上界,fn阶数不高于gn
大Ω符号:可以接触到的下界,fn阶数不低于gn
小o符号:接触不到的上界,fn阶数低于gn
小Ω符号:接触不到的下界,fn阶数高于gn
Θ符号:既是可接触的上界又是可接触的下界,fn和gn阶数相同
时间复杂度:O(n1/2) //可接触的上界
有关函数渐进界的定理(计算时间复杂度时使用)
用于判断fn和gn的阶数高低
推论:
用于判断时间复杂度为对数,幂函数,指数函数时的关系大小
用于判断各函数的阶数大小关系
用于判断一个算法中不同基本运算次数在时间复杂度上取哪个(算法的时间复杂度是各步操作之和,在常数步的情况下取最高阶的函数即可)
几类重要函数
基本函数类
指数>多项式>对数多项式,每一级都相对于上一级爆炸增长
指数级的算法是不可运算的!
对数函数
简写说明:
性质:
1.在考虑算法的复杂度时不需要考虑对数底的大小
2.对数要小于幂函数
3.此情况下对数指数函数和幂函数相等
指数函数与阶乘
阶乘要小于nn,要大于2n,阶乘的对数和nlogn同阶
取整函数
性质:
按照阶排序的实例
从左到右阶数依次变小,从上往下量级依次变小
序列求和的方法(求迭代过程的算法的时间复杂度)
求和公式
一个例子:
应用:二分检索法的平均时间复杂度
估计和式上界的放大法
一个例子:
估计和式渐进的界:
结论:调和级数和logn同阶
递推方程与算法分析(递归的算法的时间复杂度求解)
递推方程的定义
几个例子
fibonacci数列:
最下面的红框即为递推方程的解
汉诺塔问题:
利用迭代求递推公式的解
即时间复杂度为指数级!
这是一个难解问题,不存在多项式时间的算法
插入排序
W(n-1)为上一个元素插入排序的时间复杂度,n-1为这一个元素最坏情况下需要比较的次数
利用迭代求递推公式的解
迭代法求解递推方程
直接迭代
以汉诺塔为例做迭代求递推公式的解:
换元迭代
以二分归并排序为例做换元迭代:
W(n/2)为后面两次递归的排序的时间复杂度,n-1为这次排序需要对比的次数
可以用数学归纳法验证正确性
差消法化简高阶递推方程(以快速排序的时间复杂度分析为例)
快速排序时间复杂度分析:
平均工作量=总工作量/输入情况个数n
差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶目的
下面两式相减,可消去∑处的大部分项
递归树(是迭代的模型)
递归树的概念
迭代在递归中的表示:
递归树的生成规则:
递归树往往使用在需要迭代的项数大于1的情况
实例一:以二分归并排序的时间复杂度分析为例做递归树的应用
写出递归树前几层后,分析每一层的总和,根据每一层的规律推导出总的时间复杂度
实例二
注意:这棵迭代数左边递减速度大于右边,所以树右边的层数会大于左边,因此最后一层的总和不超过n,即O(n)
这里的求和只看最右边这一路:每一次迭代乘以2/3,总共迭代k次,即最后一层的表达式为(2/3)kn,等于最后的初值为1,从而求出k
最后得到:
logn为层数k,n为每层的总和
主定理及其应用(用于求解递推方程的解,得到时间复杂度)
主定理的应用背景
主定理的概念:
主定理的应用:
不可以使用的例子:
使用递归树求解: