63
主主主主主主主主1. 1. 2. 2. 主主 主主 主主 主主 主主主主主主主 主主主主主主主 主主主 主主主 (3) (3)

数据结构学位考 复习课 (3)

Embed Size (px)

DESCRIPTION

数据结构学位考 复习课 (3). 主要内容: 1. 图 2. 查找、排序. 第七章 图. 考核内容及要求: 熟练掌握图的相关概念、性质、存储结构 熟练掌握遍历:深度优先遍历、广度优先遍历过程; 熟练掌握连通分量的求法; 熟练掌握最小生成树、最短路径概念与方法; 掌握拓扑排序、关键路径的求法及实现方法。. V 1. V 2. V 3. V 4. V 1. V 2. V 3. V 4. V 5. 1 图的定义、术语和存储结构. 图: 图结构中,任意两个结点之间的关系是任意的,图中任意两个数据元素之间都可能相关 图的抽象数据类型 顶点、弧、边 - PowerPoint PPT Presentation

Citation preview

Page 1: 数据结构学位考 复习课 (3)

主要内容:主要内容:1. 1. 图图2.2. 查找、排序查找、排序

数据结构学位考数据结构学位考复习课复习课 (3)(3)

Page 2: 数据结构学位考 复习课 (3)

第七章 图第七章 图 考核内容及要求:考核内容及要求:

熟练掌握图的相关概念、性质、存储结构熟练掌握图的相关概念、性质、存储结构 熟练掌握遍历:深度优先遍历、广度优先遍历过程;熟练掌握遍历:深度优先遍历、广度优先遍历过程; 熟练掌握连通分量的求法;熟练掌握连通分量的求法; 熟练掌握最小生成树、最短路径概念与方法;熟练掌握最小生成树、最短路径概念与方法; 掌握拓扑排序、关键路径的求法及实现方法。掌握拓扑排序、关键路径的求法及实现方法。

Page 3: 数据结构学位考 复习课 (3)

1 图的定义、术语和存储结构 图:图:图结构中,任意两个结点之间的关图结构中,任意两个结点之间的关系是任意的,图中任意两个数据元素之系是任意的,图中任意两个数据元素之间都可能相关间都可能相关 图的抽象数据类型图的抽象数据类型 顶点、弧、边顶点、弧、边 有向图(有向图( digraph)digraph)

有向图有向图 GG11=(V=(V11,{A,{A11})}) ,其中,其中 VV11={v={v11,v,v22,,vv33,v,v44},A},A11={<v={<v11,v,v22>,<v>,<v11,v,v33>,<v>,<v33,v,v44>,<v>,<v44,v,v11>}>}

无向图无向图 (undigraph)(undigraph) 无向图无向图 GG22=(V=(V22,{E,{E22})})VV22={v={v11,v,v22,v,v33,v,v44,v,v55}, E}, E22={(v={(v11,v,v22),(v),(v11,v,v44),(v),(v22,v,v33),(v),(v22,v,v55),(v),(v33,v,v44),(v),(v33,v,v55)})}

VV11 VV22

VV33 VV44

VV11 VV22

VV44 VV55

VV33

有向图有向图

无向图无向图

Page 4: 数据结构学位考 复习课 (3)

顶点数 n和边 ( 弧 ) 的数目 e: 无向图: 有向图:

完全图:有 n(n-1)/2 条边的无向图 ;有向完全图:有 n(n-1) 条弧的有向图 ;稀疏图、稠密图 子图: G=(V,{E}),G’=(V’,{E’}) ,若 V’ V, 且 E’ E, 则称 G’为 G 的子图 邻接点:无向图中, (v,v’) E∈ ,则 v,v’ 互为邻接点;顶点 v 的度:与 v 相关联的边的数目, TD(v) 有向图中 , 若 <v,v’>∈A,则顶点 v邻接到顶点 v’,而顶点v’邻接自 v

出度:以 v 为尾的弧的数目, OD(v) 入度:以 v 为头的弧的数目, ID(v) TD(v)=OD(v)+ID(v)

)1(210 nne

)1(0 nne

Page 5: 数据结构学位考 复习课 (3)

路径: 回路(环) 简单路径:顶点序列中顶点不重复的路径。

连通图、连通分量、强连通图、强连通分量:连通图、连通分量、强连通图、强连通分量:

AA BB

LL MM

CC DD EE

FFGG HHHH

II JJ KK

AA BB

LL MM

CC

FF

JJ

DD EE

GG HHHH

II KK

Page 6: 数据结构学位考 复习课 (3)

一个连通图的生成树:一个极小连通子图,含有图中一个连通图的生成树:一个极小连通子图,含有图中全部结点,但只有足以构成一棵树的全部结点,但只有足以构成一棵树的 n-1n-1 条边。条边。 一棵有一棵有 nn 个顶点的生成树有且仅有个顶点的生成树有且仅有 n-1n-1 条边条边 但有但有 n-1n-1 条边的图不一定是生成树条边的图不一定是生成树

有向图:如果有一个顶点的入度为有向图:如果有一个顶点的入度为 00 ,其余顶点的入,其余顶点的入度都为度都为 11 ,则是一棵有向树。,则是一棵有向树。AA BB

LL MM

CC

FF

JJ

Page 7: 数据结构学位考 复习课 (3)

图的存储结构 数组表示法(邻接矩阵):数组表示法(邻接矩阵): 用两个数组分别存放顶点信息和边用两个数组分别存放顶点信息和边(弧)信息(弧)信息

G1.VEXS[4]=[V1 V2 V3 V4]G1.VEXS[4]=[V1 V2 V3 V4]

G1.arcs=

0 1 1 00 1 1 00 0 0 00 0 0 00 0 0 10 0 0 11 0 0 01 0 0 0

VV11 VV22

VV33 VV44

G1G1

VV11 VV22

VV44 VV55

VV33

G2G2

G2.arcs=

0 1 0 1 00 1 0 1 01 0 1 0 11 0 1 0 10 1 0 1 10 1 0 1 11 0 1 0 01 0 1 0 00 1 1 0 00 1 1 0 0

Page 8: 数据结构学位考 复习课 (3)

图的邻接矩阵图的邻接矩阵 A[i][j]=1 //A[i][j]=1 // 若若 <vi,vj><vi,vj> 存在存在 A[i][j]=0 //A[i][j]=0 // 若若 <vi,vj><vi,vj> 不存在不存在 无向图:第无向图:第 ii 行分量的和为结点行分量的和为结点 vivi 的度的度 有向图:第有向图:第 ii 行分量的和为结点行分量的和为结点 vivi 的出度;的出度; 第第 ii 列分量的和为结点列分量的和为结点 vivi 的入度的入度 网的邻接矩阵网的邻接矩阵 A[i][j]=A[i][j]= 无穷大 无穷大 <vi, vj><vi, vj> 间无边间无边 == 权 权 <vi, vj><vi, vj> 间有边间有边 问题:为什么放无穷大而不放问题:为什么放无穷大而不放 00

Page 9: 数据结构学位考 复习课 (3)

邻接表:一种链式存储结构邻接表:一种链式存储结构 为图中的每一个顶点创建一个单链表,其中的结点表示依附于顶为图中的每一个顶点创建一个单链表,其中的结点表示依附于顶点的边点的边 (( 以该顶点为尾的弧以该顶点为尾的弧 ))

adjvexadjvex nextarcnextarc infoinfo表结点datadata firstarcfirstarc头结点

VV11 VV22

VV33 VV44

vv11

vv22

vv33

vv44

00

11

22

33

22 11 ^̂

33 ^̂

00 ^̂

Page 10: 数据结构学位考 复习课 (3)

无向图的邻接表中,顶点无向图的邻接表中,顶点 vv 的度就是该顶点的单链表的度就是该顶点的单链表中的结点数;中的结点数; 有向图中,第有向图中,第 ii 个链表的结点数是该顶点的出度;个链表的结点数是该顶点的出度; 如何求有向图中顶点的入度?——有向图的逆邻接表。如何求有向图中顶点的入度?——有向图的逆邻接表。

vv11

vv22

vv33

vv44

00

11

22

33

22 11 ^̂

33 ^̂

00 ^̂

vv11

vv22

vv33

vv44

00

11

22

33

33

00 ^̂

00 ^̂

22 ^̂

有向图有向图 G1G1 的邻接表的邻接表 有向图有向图 G1G1 的逆邻接表的逆邻接表

Page 11: 数据结构学位考 复习课 (3)

VV11 VV22

VV33 VV44

vv11

vv22

vv33

vv44

00

11

22

33

11

00 2200 22

22 00 22 33

33 00 33 11 2233 22^̂^̂ ^̂ ^̂

^̂ ^̂

• 十字链表:有向图的链式存储十字链表:有向图的链式存储

datadata firstinfirstin firstoutfirstout 顶点结点顶点结点

tailvextailvex headvexheadvex hlinkhlink tlinktlink infoinfo 弧结点弧结点

Page 12: 数据结构学位考 复习课 (3)

邻接多重表:无向图的另一种链式存储结构。邻接多重表:无向图的另一种链式存储结构。

VV11 VV22

VV44 VV55

VV33

V1

V2

V3

V4

V5

0

12

34

0 1

2 1

4 1

0 3

2 3

2 4^ ^ ^

^ ^

Page 13: 数据结构学位考 复习课 (3)

2. 图的遍历图的遍历目标是解决图的连通性问题、拓扑排序问题、关键路径问题。图的遍历方法:深度优先算法、广度优先算法

Page 14: 数据结构学位考 复习课 (3)

深度优先遍历 深度优先搜索遍历:类似于树的先根遍历,是树的先深度优先搜索遍历:类似于树的先根遍历,是树的先根遍历的推广根遍历的推广 算法:算法:

1.1. 假设图中所有顶点的初始状态为:未访问;假设图中所有顶点的初始状态为:未访问;2.2. 从图中某个未访问的顶点从图中某个未访问的顶点 vv 出发,访问此结点;出发,访问此结点;3.3. 依次从依次从 vv 的邻接点出发深度优先遍历图,直到图中所有与的邻接点出发深度优先遍历图,直到图中所有与 vv 有有路径的顶点都被访问到;路径的顶点都被访问到;4.4. 若图中还有未访问结点,则另选一个结点作起始点,重复若图中还有未访问结点,则另选一个结点作起始点,重复 22 、、 33过程。过程。

Page 15: 数据结构学位考 复习课 (3)

vv11

VV22

vv66

vv44

vv55

vv88

vv33

vv77

vv11

VV22

vv66

vv44

vv55

vv88

vv33

vv77

图解深度优先遍历过程图解深度优先遍历过程

Page 16: 数据结构学位考 复习课 (3)

一个非连同图的一个非连同图的深度优先深度优先遍历过程图解遍历过程图解AA BB

LL MM

CC DD EE

FFGG HHHH

II JJ KKHH

AA BB

LL MM

CC DD EE

FFGG HH

II JJ KK

可能的遍历序列:可能的遍历序列: A L M J B F C D E G I H K A L M J B F C D E G I H K

注:图的存储结构没有给定的情况下,图的遍历序列不是唯一的。注:图的存储结构没有给定的情况下,图的遍历序列不是唯一的。

Page 17: 数据结构学位考 复习课 (3)

广度优先遍历 广度优先搜索遍历类似于树的层次遍历 算法

vv11

VV22

vv66

vv44

vv55

vv88

vv33

vv77

vv11

VV22

vv66

vv44

vv55

vv88

vv33

vv77

Page 18: 数据结构学位考 复习课 (3)

一个非连同图的一个非连同图的广度优先广度优先遍历过程图解遍历过程图解AA BB

LL MM

CC DD EE

FFGG HHHH

II JJ KK

HH

AA BB

LL MM

CC DD EE

FFGG HH

II JJ KK

可能的遍历序列:可能的遍历序列: A L F C B M D E G I H KA L F C B M D E G I H K

Page 19: 数据结构学位考 复习课 (3)

3. 图的连通性问题——掌握连通分量的求法 无向图的连通分量和生成树无向图的连通分量和生成树

由图的遍历得出:由图的遍历得出: 对于连通图,从图中任一顶点出发,可以访问到图中的所有顶点;对于连通图,从图中任一顶点出发,可以访问到图中的所有顶点; 对于非连通图,需要从多个顶点出发,搜索到树的各个连通分量对于非连通图,需要从多个顶点出发,搜索到树的各个连通分量中的顶点集。中的顶点集。

AA BB

LL MM

CC DD EE

FFGG HHHH

II JJ KK

HH

AA BB

LL MM

CC DD EE

FF GG HH

II JJ KK

Page 20: 数据结构学位考 复习课 (3)

4 4 掌握最小生成树的概念和求法掌握最小生成树的概念和求法 最小生成树最小生成树

构造连通网的最小代价生成树。构造连通网的最小代价生成树。 MSTMST 性质:假设性质:假设 N=(V,{E})N=(V,{E}) 是一个连通网,是一个连通网, UU 是顶点集是顶点集 VV上的一个非空子集。若上的一个非空子集。若 (u,v)(u,v) 是一条具有最小权值的边,其中是一条具有最小权值的边,其中

u U∈u U∈ ,, v V-U,∈v V-U,∈ 则必存在一棵包含边则必存在一棵包含边 (u,v)(u,v) 的最小生成树。的最小生成树。 构造最小生成树的算法:构造最小生成树的算法: PrinPrin 算法和算法和 KruskalKruskal 算法。算法。

Page 21: 数据结构学位考 复习课 (3)

PrimPrim 算法构造最小生成树的过程:算法构造最小生成树的过程:VV11

VV22 VV33VV44

VV55 VV66

VV11

VV22VV33

VV44

VV55 VV66

6 51

2

5 5

66

43

VV11

VV22 VV33VV44

VV55 VV66

VV11

VV22 VV33VV44

VV55 VV66

VV11

VV22 VV33VV44

VV55 VV66

VV11

VV22 VV33VV44

VV55 VV66

Page 22: 数据结构学位考 复习课 (3)

KruskalKruskal 算法构造最小生成树的过程算法构造最小生成树的过程VV11

VV22VV33

VV44

VV55 VV66

VV11

VV22VV33

VV44

VV55 VV66

VV11

VV22VV33

VV44

VV55 VV66

VV11

VV22VV33

VV44

VV55 VV66

VV11

VV22VV33

VV44

VV55 VV66

VV11

VV22VV33

VV44

VV55 VV66

6 51

2

5 5

66

43

两种算法的区别:两种算法的区别:普鲁姆算法:基于连通地选择,避免回路普鲁姆算法:基于连通地选择,避免回路克鲁斯卡儿算法:离散地选择,避免回路克鲁斯卡儿算法:离散地选择,避免回路

Page 23: 数据结构学位考 复习课 (3)

拓扑排序:由某个集合上的一个偏序得到该集合上的一个全拓扑排序:由某个集合上的一个偏序得到该集合上的一个全序,就是拓扑排序。序,就是拓扑排序。 偏序:集合中仅有部分成员之间可以比较;偏序:集合中仅有部分成员之间可以比较; 全序:集合中全体成员之间均可比较。全序:集合中全体成员之间均可比较。 AOVAOV 网:顶点表示活动,弧表示活动之间的优先关系的有向网:顶点表示活动,弧表示活动之间的优先关系的有向图称为顶点表示活动的网。图称为顶点表示活动的网。

vv11

vv22

vv33

vv44 vv11

vv22

vv33

vv44

偏序偏序 全序全序

5 拓扑排序

Page 24: 数据结构学位考 复习课 (3)

进行拓扑排序的方法:进行拓扑排序的方法: 在有向图中选一个没有前驱的顶点且输出;在有向图中选一个没有前驱的顶点且输出; 从图中删除该结点和所有以该结点为尾的弧。从图中删除该结点和所有以该结点为尾的弧。 重复上述操作。若可以输出全部顶点,则该图中不存在环,重复上述操作。若可以输出全部顶点,则该图中不存在环,否则存在环。否则存在环。 例如:例如: 算法实现:算法实现:

以邻接表的方法存储有向图;以邻接表的方法存储有向图; 头结点增加信息:顶点入度;头结点增加信息:顶点入度; 增加一个栈:存放入度为增加一个栈:存放入度为 00 的顶点。的顶点。 vv11

vv22

vv33

vv44

Page 25: 数据结构学位考 复习课 (3)

6 最短路径 7.6.1 7.6.1 从某个源点到其余各顶点的最短路径从某个源点到其余各顶点的最短路径

DijkstraDijkstra 算法:按路径长度递增的次序产生最短路径算法:按路径长度递增的次序产生最短路径 D[i]D[i] 表示当前所找到的从点表示当前所找到的从点 vv 到每个终点到每个终点 vivi 的最短路径的长度。的最短路径的长度。

D[i]D[i] 初值:初值: vv 到到 vivi 的弧的权值;则:的弧的权值;则:初值最小的路径就是从初值最小的路径就是从 vv 出发的最短的一条路径出发的最短的一条路径

下面按照长度递增多次序产生各个终点的最短路径下面按照长度递增多次序产生各个终点的最短路径

vv11

vv22

vv33

vv44vv00

vv55100

50

60

201030

10

5

Page 26: 数据结构学位考 复习课 (3)

DijkstraDijkstra 算法 求最短路径算法 求最短路径终点终点 从从 vv00 到各终点的到各终点的 DD 值和最短路径的求解过程值和最短路径的求解过程

i=1i=1 i=2i=2 i=3i=3 i=4i=4 i=5i=5

vv11 ∞∞ ∞∞ ∞∞ ∞∞ 无无vv22 1010

(v(v00,v,v22))

vv33 ∞∞ 6060(v(v00,v,v22,v,v33))

5050(v(v00,v,v44,v,v33))

vv44 3030(v(v00,v,v44))

3030(v(v00,v,v44))

vv55 100100(v(v00,v,v55))

100100(v(v00,v,v55))

9090(v(v00,v,v44,v,v55))

6060(v(v00,v,v44,v,v33,v,v55))

vvjj vv22 vv44 vv33

SS {v{v00,v,v22}}

vv11

vv22

vv33

vv44vv00

vv55100

50

60

201030

10

5

Page 27: 数据结构学位考 复习课 (3)

查找查找 考核内容及要求:考核内容及要求:

熟练掌握顺序查找、有序表的查找、索引顺序查找、熟练掌握顺序查找、有序表的查找、索引顺序查找、二分查找法及二分查找法及 HASHINGHASHING 查找技术;查找技术; 了解平衡二叉树、了解平衡二叉树、 BB 树及树及 B+B+ 树的概念;树的概念; 理解查找速度的分析及比较、算法复杂性的级别。理解查找速度的分析及比较、算法复杂性的级别。

Page 28: 数据结构学位考 复习课 (3)

1 1 顺序表的查找顺序表的查找 物理存储:物理存储: 顺序表方式:顺序表方式: typedef typedef struct {struct { ElemType ElemType *elem*elem;; int int lengthlength; } SSTable; } SSTable 查找过程:从表中查找过程:从表中最后一个元素最后一个元素开始,逐个比较,开始,逐个比较,相等则比较成功,否则直到第一个元素。相等则比较成功,否则直到第一个元素。

Page 29: 数据结构学位考 复习课 (3)

Int Search_Seq(SSTable Int Search_Seq(SSTable STST, KeyType , KeyType keykey) {) { //// 从尾部依次比较从尾部依次比较 keykey 和数据元素的关键字,和数据元素的关键字, //// 当比到当比到 00 下标才成功则下标才成功则查找不成功,返回查找不成功,返回 00 //// 否则否则返回下标返回下标 ii ST.elem[0].key = key;ST.elem[0].key = key; for (for (i=ST.lengthi=ST.length; ; !EQ(ST.elem[i].key, key)!EQ(ST.elem[i].key, key); ; --i--i);); return return ii;; }//Search-Seq}//Search-Seq

00 下标为监视哨下标为监视哨 ,, 时间复杂度时间复杂度 O(n)O(n)平均查找长度: 平均查找长度: ASL =sum(pASL =sum(piiccii) i=1…n) i=1…n

Page 30: 数据结构学位考 复习课 (3)

查找成功: pi = 1/n ci= 1,2,3…n ASL=1/n[1+2+…+n] = (n+1)/2

查找不成功: ASL = n+1 , (n, n-1…1, 0)

成功和不成功同概率: 1/2

ASL = ½*1/n[1+2+…+n]+1/2(n+1) = ¾(n+1)

Page 31: 数据结构学位考 复习课 (3)

折半查找:先确定待查记录的范围,逐步缩小范围直到找到或找不折半查找:先确定待查记录的范围,逐步缩小范围直到找到或找不到。到。 例:例:在下列数据元素中查找关键字为在下列数据元素中查找关键字为 2121 和和 8585 的数据元素的数据元素

分析:设置两个指针分析:设置两个指针 lowlow , ,highhigh 指示待查元素所在范围的指示待查元素所在范围的上界上界和和下下界界。。 midmid =(=( low+highlow+high )) /2/2 ST.elem[mid].key=key:ST.elem[mid].key=key: 查找成功查找成功 ST.elem[mid].key<keyST.elem[mid].key<key :: low=mid+1low=mid+1 ST.elem[mid].key>keyST.elem[mid].key>key: : high=mid-1high=mid-1 low=high:low=high: 查找不成功查找不成功

2 2 有序表的查找有序表的查找

5 13 19 21 37 56 64 75 80 88 935 13 19 21 37 56 64 75 80 88 93

lowlow highhighmidmid

Page 32: 数据结构学位考 复习课 (3)

int Search_Bin (SSTable int Search_Bin (SSTable STST, KeyTable , KeyTable keykey) {) { //// 对有序表的查找采用折半查找,逐步缩小对有序表的查找采用折半查找,逐步缩小 //// 查找范围,直到找到或找不到,返回值为查找范围,直到找到或找不到,返回值为 //// 找到返回下标,找不到返回找到返回下标,找不到返回 0 0 low = 1; high = ST.length;low = 1; high = ST.length; while (while (low<=highlow<=high)) { mid = (low+high)/2;{ mid = (low+high)/2; if EQ(key, ST.elem[mid].key) return mid;if EQ(key, ST.elem[mid].key) return mid; else if LT(key, ST.elem[mid].key)else if LT(key, ST.elem[mid].key) high = mid –1high = mid –1;; else else low = mid +1low = mid +1;; } return OK;} return OK; } //Search_Bin } //Search_Bin 时间复杂度:时间复杂度: O(logO(log22n), n), ASL = logASL = log22(n+1)+1 ((n+1)+1 ( 按照满二叉树按照满二叉树 ))

Page 33: 数据结构学位考 复习课 (3)

分块查找,索引顺序查找分块查找,索引顺序查找 分块有序分块有序 两步查找:两步查找:确定确定待查记录所在地待查记录所在地子表子表(块);在子表中(块);在子表中顺序查顺序查找找

3 3 索引顺序表的查找索引顺序表的查找

22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 5322 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 5322 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53

22 48 86

1 7 13

Page 34: 数据结构学位考 复习课 (3)

4.4. 动态查找表——二叉排序树动态查找表——二叉排序树 例 已知如下长度为例 已知如下长度为 88 的表,试按表中元素的顺序的表,试按表中元素的顺序依次插入一棵初始为空的二叉排序树,画出插入依次插入一棵初始为空的二叉排序树,画出插入完成后的二叉排序树,并求其在等概率下查找成完成后的二叉排序树,并求其在等概率下查找成功的平均查找长度。功的平均查找长度。(( Mon, Tiger, Win, Butter, Fish, Fly, Pig,Cat)Mon, Tiger, Win, Butter, Fish, Fly, Pig,Cat)

Page 35: 数据结构学位考 复习课 (3)

平衡二叉树 平衡因子:左子深度减去右子深度为 – 1 , 0 , 1 的二叉排序树。 二叉平衡树的构造(单项左旋 / 单项右旋), (左右旋,右左旋)

2- 22 - 2

右旋 左旋 左右旋 右左旋

Page 36: 数据结构学位考 复习课 (3)

9.3 9.3 哈希表哈希表 确定的对应关系 f:记录的存储位置 关键字 对应关系 f 就是哈希函数: f(K) 哈希函数是一个映象,构造哈希函数的方法:

直接定址法;哈希地址:直接取关键字或者关键字的线性函数H(key)=key; or H(key)=a*key+b 数字分析法;分析关键字,取关键字的若干数位组成哈希地址。 平方取中法;取关键字平方后的中间几位为哈希地址——较为常用的方法 折叠法:分割关键字、叠加 除留余数法: H(key)=key MOD p p<= 哈希表长 m

Page 37: 数据结构学位考 复习课 (3)

冲突现象:当 K1≠K2 时 f(K1)=f(K2) 解决冲突的方法

开放定址法;Hi=(H(key)+di) MOD m i=1,2,···k (k<=m-1)

m 为哈希表长度; di为增量 ,di 的取法:(1) 线性探测再散列; di=1,2,3,···

(2) 二次探测再散列; di=±k2

(3) 伪随机探测再散列 : di= 伪随机数序列 再哈希: Hi=RHi(key) 链地址:所有关键字为同义词的记录存储在同一线性链表中 公共溢出区:发生冲突时填入溢出表。

Page 38: 数据结构学位考 复习课 (3)

排序排序考核要求:考核要求:

熟练掌握插入排序、快速排序、堆及选择排序、归熟练掌握插入排序、快速排序、堆及选择排序、归并排序、基数排序法;并排序、基数排序法; 了解最好、最坏、平均排序的时间复杂性分析方法。了解最好、最坏、平均排序的时间复杂性分析方法。

Page 39: 数据结构学位考 复习课 (3)

插入排序的思想:将一个元素插入到一个有序表中。插入排序的思想:将一个元素插入到一个有序表中。根据寻找插入位置的方法不同分为:直接插入、折半插入、根据寻找插入位置的方法不同分为:直接插入、折半插入、 22 路插路插入、表插入等。入、表插入等。 直接插入排序:最简单的排序方法直接插入排序:最简单的排序方法

思想:将一个元素向一个有序序列插入思想:将一个元素向一个有序序列插入 做法:做法: 00 位监测哨,从一个元素逐步扩大有序序列。位监测哨,从一个元素逐步扩大有序序列。 举例举例

1 1 插入排序插入排序

49 38 65 97 76 13 27 49

00

Page 40: 数据结构学位考 复习课 (3)

直接插入排序算法:直接插入排序算法:void InsertSort(SqList &L){void InsertSort(SqList &L){//// 对顺序表对顺序表 LL 作直接插入排序作直接插入排序 for (i=2;i<L.length;++i)for (i=2;i<L.length;++i)

if (L.r[i].key<L.r[i-1].key){if (L.r[i].key<L.r[i-1].key){ L.r[0]=L.r[i];L.r[0]=L.r[i]; L.r[i]=L.r[i-1];L.r[i]=L.r[i-1]; for (j=i-2;L[0].key<L[j].key;--j)for (j=i-2;L[0].key<L[j].key;--j)

L.r[j+1]=L.r[j];L.r[j+1]=L.r[j]; L.r[j+1]=L.r[0];L.r[j+1]=L.r[0];}}

}}

Page 41: 数据结构学位考 复习课 (3)

折半插入排序折半插入排序 查找过程用折半查找方法。查找过程用折半查找方法。

void BInsertSort(SqList &L){void BInsertSort(SqList &L){ for (i=2;i<=L.length;++i){for (i=2;i<=L.length;++i){

L.r[0]=L.r[i];L.r[0]=L.r[i]; low=1;high=i-1;low=1;high=i-1; while (low<=high){while (low<=high){ m=(low+high)/2;m=(low+high)/2; if (L.r[0].key<L.[m].key) high=m-1;if (L.r[0].key<L.[m].key) high=m-1;

else low=m+1;else low=m+1; }//while}//while for(j=i-1;j<=high+1;--j) L.r[j+1]=L.r[j];for(j=i-1;j<=high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0];L.r[high+1]=L.r[0];}//for}//for

}//BInsertSort}//BInsertSort

49 38 65 97 76 13 27 49

00

Page 42: 数据结构学位考 复习课 (3)

算法思想:算法思想:先将整个待排序记录分割成若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再进行一次全体记录的插入排序。 具体操作:具体操作:

49 38 65 97 76 13 27 49 55 04

49 13 38 27 65 49 76 04

13 27 49 55 04 49 38 65 97 76

13 55 38 76 27 04 65 49 49 97

第一次分组

这就是第一趟排序结果第二趟的“增量”就要缩小了!

2 2 希尔排序:希尔排序:缩小增量排序,属于插入排序缩小增量排序,属于插入排序

Page 43: 数据结构学位考 复习课 (3)

希尔排序算法希尔排序算法 ::void ShellInsert (SqList &L,int dk){void ShellInsert (SqList &L,int dk){ //// 对顺序表对顺序表 LL 作一趟希尔排序。作一趟希尔排序。 for (i=dk+1;i<=L.length;++i)for (i=dk+1;i<=L.length;++i)

if (L.r[i].key<L.r[i-dk].key){if (L.r[i].key<L.r[i-dk].key){ L.r[0]=L.r[i];L.r[0]=L.r[i];

for (j=k-dkl;j>0&L.r[0].key<L.r[j].key;j-=dk)for (j=k-dkl;j>0&L.r[0].key<L.r[j].key;j-=dk) L.r[j+dk]=L.r[j];L.r[j+dk]=L.r[j];L.r[j+dk]=L.r[0];L.r[j+dk]=L.r[0];

}}}//shelinsert}//shelinsertvoid ShellSort(SqList &L,int dlta[],int t){void ShellSort(SqList &L,int dlta[],int t){//// 按增量序列按增量序列 dlta[0..t-1]dlta[0..t-1] 对顺序表对顺序表 LL 作希尔排序作希尔排序

for (k=0;k<t;++k) ShellInsert(L,dlta[k]);for (k=0;k<t;++k) ShellInsert(L,dlta[k]);}}

Page 44: 数据结构学位考 复习课 (3)

3 3 快速排序快速排序 冒泡排序:

具体做法:依次比较第 i 个关键字和第 i+1 个关键字,大者排后,一趟得到最大值。( i=1,2,3,4,---n-1)

49 38 65 97 76 13 27 49

38 49 65 97 76 13 27 49

38 49 65 76 97 13 27 49

38 49 65 76 13 97 27 49

38 49 65 76 13 27 97 49

38 49 65 76 13 27 49 97

Page 45: 数据结构学位考 复习课 (3)

冒泡排序算法冒泡排序算法void Bubble Sort (SqList &L ){void Bubble Sort (SqList &L ){

for (k=L.length-1;k>=1;k--)for (k=L.length-1;k>=1;k--) for (i=0;i<=k-1;k++)for (i=0;i<=k-1;k++)

if (L.r[i].key>L.r[i+1].key) {if (L.r[i].key>L.r[i+1].key) { 交换两个记录交换两个记录 }}}}

时间复杂度:时间复杂度: O(nO(n22))

Page 46: 数据结构学位考 复习课 (3)

49 38 65 97 76 13 27 49low high

27 38 65 97 76 13 49low high

27 38 13 97 76 65 49low high

27 38 97 76 13 65 49low high

27 38 13 76 97 65 49low high

快速排序的算法快速排序的算法

Page 47: 数据结构学位考 复习课 (3)

快速排序算法:快速排序算法:Int Partition (SqList &L,int low,int high){Int Partition (SqList &L,int low,int high){

L.r[0]=L.r[low];L.r[0]=L.r[low];pivotkey=L.r[low].key;pivotkey=L.r[low].key;while (low<high){while (low<high){ while(low<high &&L.r[high].key>=pivotkey) --high;while(low<high &&L.r[high].key>=pivotkey) --high; L.r[low]=L.r[high];L.r[low]=L.r[high]; while(low<high &&L.r[low].key<=pivotkey) ++low;while(low<high &&L.r[low].key<=pivotkey) ++low; L.r[high]= L.r[low];L.r[high]= L.r[low];}}L.r[low]=L.r[0];L.r[low]=L.r[0];return low;return low;

}//}//平均时间:平均时间:KK 为常数因子。就平均时间而言快速排序是目前被认为最好的一种内为常数因子。就平均时间而言快速排序是目前被认为最好的一种内部排序方法。部排序方法。

nknTavg ln

Page 48: 数据结构学位考 复习课 (3)

4 4 选择排序选择排序 选择排序基本思想:每一趟在选择排序基本思想:每一趟在 n-i+1(i=1,2,···,n-n-i+1(i=1,2,···,n-1)1) 个记录中选取关键字最小的记录作为有序序列中第个记录中选取关键字最小的记录作为有序序列中第 ii个记录。个记录。 简单选择排序:简单选择排序:Void SelectSort(SqList &L){Void SelectSort(SqList &L){ for (i=1;i<L.length;++i){for (i=1;i<L.length;++i){

j=SelectMinKey(L,i);//j=SelectMinKey(L,i);// 从从 L.r[i..L.length]L.r[i..L.length] 中选择中选择 keykey 最小的记录最小的记录 if (i!=j) L.r[i] L.r[j];if (i!=j) L.r[i] L.r[j];}}

}}

Page 49: 数据结构学位考 复习课 (3)

堆排序堆排序 堆的定义:堆的定义: nn 个元素的序列个元素的序列 {k1,k2,,kn}{k1,k2,,kn} 当且仅当满足当且仅当满足下列关系时,称为堆:下列关系时,称为堆:

思想:每趟选取最小关键字、次小关键字、次次思想:每趟选取最小关键字、次小关键字、次次小关键字小关键字 ------ 。。 做法:建立一个完全二叉树,任何非终端结做法:建立一个完全二叉树,任何非终端结点的值均不大于其左、右孩子结点的值。输出堆点的值均不大于其左、右孩子结点的值。输出堆顶,将其余的元素建立新的堆。顶,将其余的元素建立新的堆。

ki≤k2i

ki≤k2i+1

ki≥k2i

ki≥k2i+1

Page 50: 数据结构学位考 复习课 (3)

49 38 65 97 76 13 27 49

97

49

38 65

271376

49

49

49

38 65

271376

97

49 38 65 49 76 13 27 97

49 38 13 49 76 65 27 97 49 38 13 49 76 65 27 97

49

49

38 13

276576

97

49

13

38

276576

97

Page 51: 数据结构学位考 复习课 (3)

5 5 归并排序归并排序 思想:将两个或两个以上的有序表组合成一个新的有序表。思想:将两个或两个以上的有序表组合成一个新的有序表。 具体做法:以两路归并示例具体做法:以两路归并示例

[49] [38] [65] [97] [76] [13] [27]

n个记录看成 n个有序的序列

[ 38 49 ] [ 65 97 ] [ 13 76 ] [27] 第一趟合并

[ 38 49 65 97 ] [13 27 76]

[ 13 27 38 49 65 76 97]

第二趟合并第三趟合并

Page 52: 数据结构学位考 复习课 (3)

外部排序外部排序 考核要求:考核要求:

了解外存及分类技术简介 了解外存及分类技术简介 了解缓冲区管理、初始合并串、置换选择分类技术、了解缓冲区管理、初始合并串、置换选择分类技术、胜者树及败者树胜者树及败者树

Page 53: 数据结构学位考 复习课 (3)

3. 3. 置换置换 -- 选择排序选择排序目标:减少目标:减少 m(m( 初始归并段的个数初始归并段的个数 )) 来减少归并趟来减少归并趟数。数。

m=upper(n/l), nm=upper(n/l), n 为外部文件中记录数,为外部文件中记录数, ll 为每段记录数目。为每段记录数目。 故增大故增大 l, ll, l 受内存空间限制受内存空间限制 置换置换 -- 选择排序:在得到所有初始归并段的过程中,选择选择排序:在得到所有初始归并段的过程中,选择最小(大)关键字和输入、输出交叉或同时进行。最小(大)关键字和输入、输出交叉或同时进行。外部排序方法:外部排序方法:思想:分段读入内存、排序;分段写入外存、有序段归并。思想:分段读入内存、排序;分段写入外存、有序段归并。

Page 54: 数据结构学位考 复习课 (3)

已知图已知图 GG 的邻接表如下图所示,从其顶点的邻接表如下图所示,从其顶点 V1V1 出发的深出发的深度优先搜索序列和广度优先搜索序列分别写出来,并按度优先搜索序列和广度优先搜索序列分别写出来,并按图中给出的存储结构给出深度优先生成树和广度优先生图中给出的存储结构给出深度优先生成树和广度优先生成树。成树。V1

V2

V3

V4

V5

V6

41 3

42

5

3 5 2

典型例题——图、查找、排序典型例题——图、查找、排序

Page 55: 数据结构学位考 复习课 (3)

7.5 7.5 已知以二维数组表示的图的邻接矩阵如下,分别画出已知以二维数组表示的图的邻接矩阵如下,分别画出自顶点自顶点 11 出发进行遍历得到的深度优先和广度优先生成树出发进行遍历得到的深度优先和广度优先生成树 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9

1010

11 0 0 0 0 0 0 1 0 1 00 0 0 0 0 0 1 0 1 0

22 0 0 1 0 0 0 1 0 0 00 0 1 0 0 0 1 0 0 0

33 0 0 0 1 0 0 0 1 0 00 0 0 1 0 0 0 1 0 0

44 0 0 0 0 1 0 0 0 1 00 0 0 0 1 0 0 0 1 0

55 0 0 0 0 0 1 0 0 0 10 0 0 0 0 1 0 0 0 1

66 1 1 0 0 0 0 0 0 0 01 1 0 0 0 0 0 0 0 0

77 0 0 1 0 0 0 0 0 0 10 0 1 0 0 0 0 0 0 1

88 1 0 0 1 0 0 0 0 1 01 0 0 1 0 0 0 0 1 0

99 0 0 0 0 1 0 1 0 0 10 0 0 0 1 0 1 0 0 1

1010 1 0 0 0 0 1 0 0 0 01 0 0 0 0 1 0 0 0 0

Page 56: 数据结构学位考 复习课 (3)

给出如图所示的无向图的邻接矩阵和邻接表,给出如图所示的无向图的邻接矩阵和邻接表,并从其顶点并从其顶点 V1V1 出发的深度优先搜索序列和广出发的深度优先搜索序列和广度优先搜索序列分别写出来。度优先搜索序列分别写出来。V1

V4 V5

V2

V3

Page 57: 数据结构学位考 复习课 (3)

已知图已知图 22 所示的图,若从顶点所示的图,若从顶点 AA 出发按深度优先搜索法进出发按深度优先搜索法进行遍历,则可能得到的遍历序列为:行遍历,则可能得到的遍历序列为:A) A,B,E,C,D,FA) A,B,E,C,D,F B)A,C,F,E,B,DB)A,C,F,E,B,DC) A,E,B,C,F,DC) A,E,B,C,F,D D) A,E,D,F,C,BD) A,E,D,F,C,B

A

B CE

D F

Page 58: 数据结构学位考 复习课 (3)

7.9 7.9 试列出下图中全部可能的拓扑有序序列,并试列出下图中全部可能的拓扑有序序列,并指出指出 7.5.17.5.1 节中算法节中算法 Topological SortTopological Sort 求得到是哪求得到是哪一个序列。一个序列。11 22

5566

33

44

Page 59: 数据结构学位考 复习课 (3)

9.8 9.8 已知含已知含 1212 个关键字的有序表及其相应权值如下,画出个关键字的有序表及其相应权值如下,画出对以下有序表进行折半查找的判断树对以下有序表进行折半查找的判断树。。关键字关键字 A B C D E F G H I J K L

权值权值 8 2 3 4 9 3 2 6 7 1 1 4

Page 60: 数据结构学位考 复习课 (3)

10.1 10.1 以关键字序列以关键字序列 (53, 87, 12, 61,98,17, 97, 75, 53, 26)(53, 87, 12, 61,98,17, 97, 75, 53, 26)为例,手工执行以下排序算法,写出每一趟排序结束时的为例,手工执行以下排序算法,写出每一趟排序结束时的关键字状态:关键字状态: (1) (1) 希尔排序希尔排序 (( 增量增量 d[1]=5)d[1]=5) (2) (2) 快速排序 快速排序 (3)(3) 堆排序堆排序

Page 61: 数据结构学位考 复习课 (3)

10.2 10.2 判别以下序列是否为堆,如果不是,则把它判别以下序列是否为堆,如果不是,则把它调整为堆。调整为堆。 (1) (100,86,48,73,35,39,42,57,66,21);(1) (100,86,48,73,35,39,42,57,66,21); (2) (12,70,33,65,24,56,48,92,86,33)(2) (12,70,33,65,24,56,48,92,86,33)

Page 62: 数据结构学位考 复习课 (3)

考试题型考试题型 选择题(选择题( 2020 题,每题一分,共题,每题一分,共 2020 分)分) 填空题(填空题( 1010 空,每空一分)空,每空一分) 算法填空题(算法填空题( 55 空,每空两分)空,每空两分) 操作题(一般操作题(一般 44 ~~ 55 个大题目,共个大题目,共 4040 分)分) 算法设计题(算法设计题( 22 题,每题题,每题 1010 分)分)

Page 63: 数据结构学位考 复习课 (3)

祝考试顺利!祝考试顺利! 注意复习的原则:简单为主!注意复习的原则:简单为主!