最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx
《最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx(56页珍藏版)》请在冰豆网上搜索。
Key=A[j]
i=j-1
Whilei>
0anda[i]>
key//第二层循环
A[i+1]=A[i]
}
i=i-1
A[i+1]=key
}
}
2.算法复杂性及其度量
(1)时间复杂性和空间复杂性;
(2)最坏、最好和平均情形复杂性;
顺序情况下B(n)=O(n)、倒序情况下W(n)=O(n2)、A(n)=O(n2)<
W(n)
空间复杂性:
需要常数个额外的临时空间存储临时数据
2.插入排序的最坏、最好和平均时间
最坏O(n2)、最好O(n)和平均时间O(n2),空间复杂度是O
(1),稳定排序
3.归并排序算法及其时间复杂性-时间Θ(nlogn))
1)算法步骤
分解:
分解待排序的n个元素的序列为各具n/2个元素的两个子序列
解决:
适用归并排序递归的排序2个子序列
合并:
从左到有遍历2个子序列,比较最前面的元素,将较小的元素移出子序列合并到上级序列的末尾,循环进行上2步,直接所有元素都被合并到上级序列,公进行r-p+1次;
MERGE-SORT(A,p,r)
{
ifp<
r
q=向下取整(p+r)/2
MERGE-SORT(A,p,q);
MERGE-SORT(A,q+1,r)
MERGE(A,p,q,r)
N1=q-p+1
N2=r-q
将A拆成长度分别为N1、n2的2个子数组L,R
L,R的末尾元素的后一个元素取值无穷大,作为哨兵;
i=1,j=1
fork=ptor
ifL[i]<
=R[j]
A[k]=L[i]
i=i+1
else
A[k]=R[j]
j=j+1
3函数增长率(ch3)
1.渐近记号O、Ω、θ的定义及其使用
1)O
渐进上界:
0<
=f(n)<
=C(g(n))
当n->
∞,f(n)的阶小与g(n)的阶
2)Ω
渐进下界:
=C(g(n))<
=f(n)
∞,f(n)的阶大与g(n)的阶
3)Θ
渐紧界:
=C1(g(n))<
=f(n)<
=C2(g(n))
∞,f(n)的阶与g(n)的阶相等
2.标准复杂性函数及其大小关系
(1)多项式时间阶的大小
O
(1)<
O(logn)<
O(n)<
O(n*logn)<
O(n²
)<
O(n3)
(2)指数时间阶的大小
O(2n)<
O(n!
O(nn)
3.和式界的证明方法
1)数学归纳法
猜测解->
证明
2)对象限界
最大最小项限界;
几何级数限界;
3)和式分解
简单的一分为二;
更复杂的划分;
积分近似;
4)Knuth求和:
使用数学归纳法;
使用摄动法;
使用递归;
使用积分;
使用二重求和;
使用有限演算;
使用母函数。
4递归关系式(ch4)
1.替换法
(1)猜测解→数学归纳法证明;
T(n)=2T(⌊n/2⌋)+n
猜:
T(n)=O(nlogn)
证:
2T(⌊n/2⌋)+n<
=Cnlogn带入计算
(2)变量变换法;
T(n)=2T(⌊n1/2⌋)+logn
令m=logn,则,n=2m
T(2m)=2T(⌊2m-1/2⌋)+m,
令S(m)=T(2m)
则:
S(m)=2S⌊m/2⌋+m类似T(n)=2T(⌊n/2⌋)+n
=O(mlogm)
=O(lognloglogn)
2.迭代法
(1)展开法;
T
(1)=O
(1)
T(n)=3T(⌊n/4⌋)+n=n+3⌊n/4⌋+32⌊n/42⌋+…+3KT(n/4K)
总有K,使得1=<
n/4K=<
2,即K<
=log4n
(2)递归树法;
T(n)=T(n/3)+T(2n/3)+n
T(n)=2T(n/2)+n2
●主定理
T(n)=aT(n/b)+f(n)a>
=1,b>
=1整数
Case1f(n)=O(nlogba-Ɛ)<
=Cnlogba-Ɛ则:
T(n)=Θ(nlogba)
Case2f(n)<
=Θ(nlogba)则:
T(n)=Θ(nlogba*logn)
Case3f(n)=Ω(nlogba-Ɛ)>
=Cnlogba+Ɛ且:
af(n/b)<
=cf(n),对于常数C<
=1和足够大的n成立,
则T(n)=Θ(f(n))
5堆排序(ch6)
1堆的概念和存储结构
堆是一种数据结构,堆是一个数组,近似完全二叉树,除最底层外,全部从左到右填充满,对于序号为i的结点,其父结点的序号为i/2,其左孩子的序号为2i,其右孩子序号为2i+1;
=A.heap-size<
=A.length
n个元素的序列{k1,k2,ki,…,kn}当且仅当满足下关系时,称之为堆。
(ki
<
=k2i,ki
=k2i+1)或者(ki
>
=k2i+1),(i=1,2,3,4...n/2)
●堆的性质和种类
大根堆:
除根结点外,所有结点小于其父结点;
用于堆排序、收益问题。
小根堆:
除根结点外,父结点小于其所有结点;
用于优先队列;
成本问题;
●堆的操作:
建堆;
整堆;
1)整堆算法:
假设i的左右子树已经是大根堆,对i结点进行整堆,使其也是大根堆
对调整的子树结点循环进行上2步骤,将小元素逐级下沉,直至满足堆特性;
整堆时间复杂度O(logn)
2)整堆伪代码
Max-heapify(A,i)
{l=left(i)
r=right(i)
ifl<
A.heap-sizeandA[l]>
A[i]
largest=l
elselargest=i
ifr<
A.heap-sizeandA[r]>
largest=r
iflargest<
i
exchangea[i]withlargest
max-heapify(A,largest)
3)建堆算法
因为从A.heap-size/2+1起到A.heapsize,都是叶子结点,故建堆可从A.heap-size/2起到1整堆实现;
算法复杂度O(n)
4)建堆伪代码
Bulid_max_heap(A)
heap-size=A.length
fori=⌊A.heap-size/2⌋to1
●堆排序算法和时间复杂性
算法思想:
1)将数组建堆
2)将根元素与结点n交换并缩减堆的长度1
3)对首元素整堆
4)重复上述3个步骤,直至堆大小为1(i=2时进行最后一次重复操作)
时间复杂度O(nlgn)
伪代码
Heapsize(A)
build_max_heap(A)
Fori=A.lengthto2
ExchangeA[1]toA[i]
A.heap-size=A.heap-size-1
max-heapfly(A,1)
●优先队列及其维护操作
优先队列是维护集合S的数据结构,每个元素具有一个关键字key;
用于分支限界、搜索算法。
支持如下操作:
a)插入insert(S,x)
1)将元素插入末尾Size+1的位置
2)从插入位置自底而上调整,使之满足堆性质
算法复杂度O(logn)
b)取最大关键字Maximum(S)
算法思想,输出优先级最大的,也就是堆的根元素;
c)删除并返回最大键值的元素Extract-max(S)
1)取堆根
2)A[1]<
-A[heap-size[A]]
3)heap-size[A]——
4)对A[1]整堆
时间复杂度O(logn)
d)增值元素x的关键字增加到kIncrease-Key(S,x,k)
1)如果A[i]的关键字大于K,则对i进行整堆;
2)否则,若i不是根结点且K大于A[i]的父结点,则交换A[i]与其父结点的关键字,并将K值赋予其父结点。
6快速排序(ch7)
1.快速排序算法及其最好、最坏时间和平均时间
快排采用分治法的思想,最好O(nlogn),最坏O(n2),平均O(nlogn)
(1)分治法的基本思想
分治法的基本思想是:
将原问题分解为若干个规模更小但结构与原问题相似的子问题。
递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
(2)快速排序的基本思想
设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解:
在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
A[p..r]被划分为俩个(可能空)的子数组A[p..q-1]和A[q+1..r],使得
A[p..q-1]<
=A[q]<
=A[q+1..r]
②求解:
通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
3合并
//快速排序
voidquick_sort(ints[],intl,intr)
if(l<
r)
{
inti=l,j=r,x=s[l];
while(i<
j)
while(i<
j&
&
s[j]>
=x)//从右向左找第一个小于x的数
j--;
if(i<
s[i++]=s[j];
s[i]<
x)//从左向右找第一个大于等于x的数
i++;
s[j--]=s[i];
}
s[i]=x;
quick_sort(s,l,i-1);
//递归调用
quick_sort(s,i+1,r);
2.随机快速排序算法