最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx

上传人:b****2 文档编号:13538879 上传时间:2022-10-11 格式:DOCX 页数:56 大小:578.62KB
下载 相关 举报
最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx_第1页
第1页 / 共56页
最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx_第2页
第2页 / 共56页
最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx_第3页
第3页 / 共56页
最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx_第4页
第4页 / 共56页
最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx_第5页
第5页 / 共56页
点击查看更多>>
下载资源
资源描述

最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx

《最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx(56页珍藏版)》请在冰豆网上搜索。

最新《算法导论》复习大纲DOC资料Word文档下载推荐.docx

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.随机快速排序算法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 卡通动漫

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1