算法期末总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、时间复杂度:

InsertionSort的运行时间是Ω(n)

排序问题的比较次数为Ω(nlog n)

SelectionSort算法和BottomUpSort算法可分别使用Θ(n2)和Θ(nlog2n)描述

任何基于比较的排序算法,可以证明它的运行时间必定是Ω(nlog n)

◆通常把时间复杂性为O(nlog n)的基于比较的排序算法,称为该问题的最优算法。

◆根据这一定义,算法BottomUpSort是该问题的最优算法

二、空间复杂度

算法LinearSearch空间复杂性为Θ(1)

算法Merge空间复杂性为Θ(n)

三、基本的符号(O类似于≤、Ω类似于≥、Θ类似于= 、o类似于<)

O符号提供了一个运行时间的上界

Ω符号在运行时间的一个常数因子内提供一个下界。

Θ符号给出算法运行时间增长率的一个精确描述。

Ω符号定义的一个重要推论:f(n)= Ω(g(n)),当且仅当g(n)=O(f(n))

Θ符号定义的一个重要推论:f(n)= Θ(g(n))当且仅当f(n)=O(g(n))并且g(n)=O(f(n))

任一常数函数是O(1)、Ω(1)、Θ(1)

一个(二叉)堆是一棵几乎完全的二叉树,它的每个结点都满足堆的特性:设v是一个结点,p(v)是v的父结点,那么存储在p(v)中的数据项键值大于或等于存储在v中的数据项键值。堆的蕴含特性:

沿着每条从根到叶子的路径,元素的键值以降序(或称非升序)排列。

◆T的根结点存储在H[1]中;

◆设T的结点存储在H[j]中,如果它有左子结点,则这个左子结点存储在H[2j]

中;如果它还有右子结点,这个右子结点存储在H[2j+1];

◆若元素H[j]不是根结点,它的父结点存储在H[⎣j/2⎦]中。

由“几乎完全二叉树” 的定义可知,如果堆中某结点有右子结点,则它一定也有左子结点。

堆具有如下性质:

key(H[⎣j/2⎦])≥key(H[j]) 2≤j≤n

创建堆

①方法一

给出有n个元素的数组A[1..n],要创建一个包含这些元素的堆可以这样进行:

首先假设堆由1个元素构成,然后将第2个、第3个元素插入堆,直至n个。

②方法二

设数组A有n=10个元素,构造它的几乎完全二叉树T。

构造一个n元素的堆,算法MakeHeap需要Θ(n)时间和Θ(1)空间

算法HeapSort对n个元素排序,需要用O(nlog2n)时间和Θ(1)空间

最大堆:最大键值元素存放在根结点。

最小堆:最小键值元素存放在根结点

由于堆树的高度为⎣log2n⎦,所以删除一个元素所需的时间为O(log2n)。

堆排序不稳定。

用根树来表示每个集合,集合中的元素存储在节点中,树中除根节点外的每个元素X都有一个指向父节点P(X)的指针。根有一个空指针,用做集合的名字或集合的代表。这样产

生了森林,其中每一棵树对应于一个集合。

㈡不相交集数据结构

①将用于命名子集的元素视为根,其余元素视为其后代,每个子集可用一棵根树来表示,这样便形成了森林。

②除根结点外,每个结点都有一个指针指向父结点。根结点用作集合的名字。根结点的指针值为0,表示不指向任何结点。

③森林可方便地用数组A[1..n],A[j]是j的父结点,A[j]=0表示j是根结点。

④对于任一元素x,用root(x)表示包含x的树的根,例root(6)=3。

归纳法也叫尾递归,指算法一般只调用一次递归。

基数排序法时间复杂性Θ(n)

空间复杂性

◆若采用数组,除需大小为n*10的二维数组外,还需记录表Li中的元素个数的数组

Len[0..9],故算法需10n+10个存储单元,空间复杂性可用Θ(n)表示。

◆若采用链表,仅需准备10个空表,无需额外的存储空间,故算法空间复杂性为Θ(1)。说明:

基于比较的排序算法的时间复杂性为Ω(nlog2n),而基数排序法的时间复杂性为Θ(n),基数排序法不是采用比较方法来实现的。

1. for j←1 to k

2. 准备10个空链表L0,L1,...,L9

3. while L非空

4. a←L中的第一个元素:从L删除该元素

5. i←a中第j位数字: 将a加入Li

6. end while

7. L←L0

8. for i←1 to 9

9. L←L,Li //将表Li添加到表L的尾部

10. end for

11. end for

12. return L

四、整数幂整数幂的递归和非递归算法,这种方法仅需Θ(log2n)次乘法。

(二)递归算法

算法5.4 ExpRec(Page 93-94)

输入:实数x和非负整数n

输出:xn

1. PowerRec(2,5)

过程

0. procedure PowerRec(x,n)

1. if n=0 then y←1

2. else

3. y←PowerRec(x, ⎣n/2⎦ )

4. y←y*y

5. if n是奇数then y←xy

6. end if

7. return y

8. end procedure

㈢非递归算法A

算法5.5_1 Exp (Page 94)

输入:实数x和非负整数n

输出:xn

1. PowerA(2,10) //PowerA(2,1010)

过程

0. procedure PowerA(x,n)

1. y←1

2. 将n用二进制数dkdk-1...d1 表示

3. for j←k downto 1

4. y←y*y

5. if dj=1 then y←xy

6. end for

7. return y

8. end procedure

五、多项式求值(Horner规则)

算法5.6 Hormer(Page 95)

输入:a n , a n-1 ,..., a0和x

输出:Pn(x) = a n x n+a n-1x n-1+...+a2x2+a1x+a0

1. p←an

2. for j←1 to n

3. p←xp+a n-j

4. end for

5. return p

六、生成排列运行时间

算法5.7 Permutations1(Page95-96)

输入:正整数n

输出:数1,2, …,n的所有可能排列

1. for j←1 to n //置初值

2. P[j]←j

3. end for

4. perm1(1) //调用过程

过程perm1(m)

0. procedure perm1(m)

1. if m=n then output P[1..n]

2. else

3. for j←m to n

4. 互换P[j]和P[m] //在调用前交换

5. perm1(m+1) //调用过程(n-m个数在P[m+1..n]中)

6. 互换P[j]和P[m] //在调用后恢复原状态

7. end for

8. end if

9. end procedure

相关文档
最新文档