1.1贪心算法
加工时间短的先做;根据加工时间从小到大排序,依次加工;对所有输入实例都得到最优解
1.2蛮力算法
计算相应的效益,从中确认效益最大的向量;效率低
建模;设计算法;分析算法(效率)
1.3计算复杂度
算法 | 最坏 | 平均情况下 |
插入排序 | O(n²) | O(n²) |
冒泡排序 | O(n²) | O(n²) |
快速排序 | O(n²) | O(nlogn) |
堆排序 | O(nlogn) | O(nlogn) |
二分归并排序 | O(nlogn) | O(nlogn) |
1.4货郎问题与计算复杂性
算法+数据结构=程序设计
NP—hard问题的几个例子:货郎问题、0—1背包问题、双机调度问题等
1.5算法及时间复杂度
算法是有限条指令的序列
算法时间复杂度:针对指定基本运算,计算算法所做运算次数
最坏情况下的复杂度W(n)
平均情况下的复杂度A(n)
1.6算法的伪码表示
Mod表示取余数
- 求最大公约数,算法:Euclid(m,n)
- 改进的顺序检索,算法:Search(L,x)
- 插入排序,Insert Sort(A,n)
- 二分归并排序,MergeSort(A,p,r)
1.7函数的渐近的界
1.大O符号
定义:设f和g是定义域为自然数集n上的函数。若存在正数c和n0,使对一切n>n0有0≤f(n)≤cg(n)成立,则称f(n)的渐近的上界是g(n),记作
f(n)= O(g(n)) f(n)的阶不高于g(n)
2.大Ω符号
定义:设f和g是定义域为自然数集n上的函数。若存在正数c和n0,使对一切n>n0有0≤cg(n)≤f(n)成立,则称f(n)的渐近的下界是g(n),记作
f(n)= Ω(g(n)) f(n)的阶不低于g(n)
3.小o符号
定义:设f和g是定义域为自然数集n上的函数。若对任意正数c都存在n0,使得对一切n≥n0有0≤f(n)<cg(n)成立,则记作
f(n)=o(g(n)) f(n)的阶低于g(n)
4.ω符号
定义:设f和g是定义域为自然数集n上的函数。若对任意正数c都存在n0,使得对一切n≥n0有0≤cg(n)<f(n)成立,则记作
f(n)= ω(g(n)) f(n)的阶高于g(n)
5.θ符号
若f(n)=O(g(n))且f(n)= Ω(g(n)),则记作f(n)= θ(g(n)) 等阶
1.8有关函数渐近的界的定理
定理:f和g是定义域为自然数集合的函数
- 如果lim(n→∞) f(n)/g(n)存在,并且等于某个常数c>0,那么
f(n)= θ(g(n))
- 如果lim (n→∞)f(n)/g(n)=0,那么f(n)= o(g(n))
- 如果lim (n→∞)f(n)/g(n)=+ ∞,那么f(n)= ω(g(n))
多项式函数的阶低于指数函数的阶:n的d次方=o(r的n次方),r>1,d>0
对数函数的阶低于幂函数的阶:ln n=o(n的d次方),d>0
定理:函数的阶之间的关系具有传递性
定理:假设函数f和g的定义域为自然数集,若对某个其他函数h,有f=O(h)和g=O(h),那么f+g= O(h)
1.9几类重要的函数
对数函数
取整函数
2.1序列求和的方法
等差n(a1+an)/2 ;等比a(1-q的n+1次方)/1-q; 调和级数lnn+O(1)
2.2递推方程与算法分析
斐波那契数列
汉诺塔问题
HANOI(n,x,y,z)
if n=1
then MOVE(X,1,Z)
else HANOI(n-1,X,Z,Y)
MOVE(X,n,Z)
HANOI(n-1,x,y,z )
时间复杂度T(n)=2T(n-1)+1 递归方程的解为2的n次方-1
2.3迭代法求解递推方程 数学归纳验证
2.4递归树
对递归树上的项求和就是迭代后方程的解
2.5主方法(主定理):求解递推方程: T(n)=aT(n/b)+f(n)
a:归约后的子问题个数
n/b:归约后子问题的规模
f(n):归约过程及组合子问题的解的工作量
当a较大,b较小,f(n)不大时,方程的解为主定理第一种情况
3.1分治策略
将原问题划分或者归结为规模较小的子问题,递归或者迭代求解每个子问题,将子问题的解综合得到原问题的解(子问题与原问题性质一样;子问题之间可彼此独立的求解;递归停止时子问题可直接求解)
二分检索法:与中位数进行比较,将原问题归结为规模减半的子问题
二分检索问题最坏情况下的时间复杂度:W(n)=(logn的下取整)+1
二分归并 -排序:W(n)=nlogn-n+1
快速排序: W(n)=n(n-1)/2 T(n)= θ(nlogn)
幂乘算法:
分治算法:划分;求解子问题;综合解
算法实现:递归或者迭代
3.2递推方程的求解:
方程1:迭代法、递归树
方程2:
迭代法
换元法
递归树
主定理
3.3芯片测试的分治算法
1.“好,好”→任留一片,进入下轮其他情况全部抛弃
2.当n为奇数时,增加一轮对轮空芯片的单独测试。如果是好芯片,则算法结束,反之淘汰该芯片。(好芯片比坏芯片多,芯片数要大于3)
3.时间复杂度:W(n)=W(n/2)+O(n) //W(3)=1,W(2)=W(1)=0
3.4快速排序
1.用首元素x作为划分标准,将输入数组A划分成不超过x的元素构成的数组A(left),大于x的元素构成的数组A(right),其中A(left),A(right)从左到右存放在数组A的位置
2.递归地对子问题A(left),A(right)进行排序,直到子问题规模为1时停止
3.5幂乘问题(分治算法)
斐波那契(Fibonacci)数的性质:
设{F(n)}为斐波那契数构成的数列,那么
用归纳法证明
计算斐波那契数通常算法O(n),分治算法为O(logn)
3.6改进分治算法的途径
1.减少子问题数a:适用于子问题个数多,划分和综合工作量不太大,时间复杂度函数W(n)=
2.增加预处理减少f(n)
例子:平面点对问题,将排序改为拆分
4.1选最大与选最小
选最大:顺序比较,比较次数为n-1次
选最大与最小:
蛮力算法,比较次数2n-3
分组算法:比较次数(3n/2)的上界-2
分治算法n=2的k次方,比较次数为3n/2-2
4.2选第二大
通常算法:顺序比较找到最大,从剩下n-1个数中找最大,就是第二大,需要2n-3次
锦标赛算法:n+logn的上界-2 用空间换时间
4.3一般性选择问题及其算法分析
算法一:调用k次选最小算法时间复杂度为O(kn)
算法二:先排序 ,然后输出第k小的数时间复杂度为O(nlogn)
选第k小的算法:分治策略;确定m*(中位数);用m*划分数组规约为子问题;递归实现。
4.4卷积及其应用
1. 给定向量 a=(a0,a1,…,an-1),b=(b0,b1,…,bn-1)
卷积:a*b=(c0,c1,…,c(2n-2))其中ck=∑aibj(i+j=k,I,j<n)k=0,1,…,2n-2
行下标和列下标之和为k的两个位置的数相乘之和
2.卷积的含义:每个斜线的项之和恰好是卷积中的各个分量
3.卷积与多项式乘法 多项式乘法:C(x)=A(x)B(x)
5.1动态规划算法的例子
最短路径问题,多阶段决策问题
子问题界定,最短路长的依赖关系
优化原则:最优子结构性质
优化函数的特点:任何最短路的子路径相对于子问题始、终点最短
优化原则:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列。
不是所有的问题都满足动态规划原则
5.2动态规划算法设计和递归实现
1.与蛮力算法相比较,动态规划算法利用了子问题优化函数间的依赖关系,时间复杂度有所降低
2.动态规划算法的递归实现效率不高,原因在于同一子问题多次重复出现,每次出现都需要重新计算一遍
3.采用空间换时间策略,记录每个子问 题首次计算结果,后面再用时就直接取值,每个子问题只算一次
5.3动态规划的迭代实现
每个子问题只计算一次,从最小的子问题算起,考虑计算顺序,存储结构保存计算结果,设计标记函数标记每步的决策,考虑根据标记函数追踪解的算法
持续更新.....
♥♥♥每天提醒自己,自己就是个菜鸡!
♥♥♥已经看到最后啦,如果对您有帮助留下的每一个点赞、收藏、关注是对菜鸡创作的最大鼓励❀
♥♥♥有相关问题可以写在评论区,一起学习,一起进步。