第三次直播

37

Upload: quinta

Post on 09-Jan-2016

39 views

Category:

Documents


1 download

DESCRIPTION

第三次直播. 清华大学 殷人昆. 中央电大 徐孝凯. 本次要讲的问题. 第七章 集合与搜索 第八章 图. 第七章 集合与搜索. 学习目的 理解和掌握 集合结构的概念 集合的应用 与集合相关的搜索方法和简单的性能分析方法。. 需要掌握的知识点 理解 集合及其表示 : 集合基本概念 用位向量实现集合 ADT 用有序链表实现集合 ADT 集合的应用 一般集合与 位向量 建立对应 用 有序链表 实现集合的操作. 理解 等价类: 等价关系与等价类 确定等价类的链表方法 并查集 实现等价类的链表算法 实现等价类的并查集算法 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第三次直播
Page 2: 第三次直播

本次要讲的问题

第七章 集合与搜索 第八章 图

Page 3: 第三次直播

第七章 集合与搜索 学习目的理解和掌握 集合结构的概念 集合的应用 与集合相关的搜索方法和简单的性能分析方法。

Page 4: 第三次直播

需要掌握的知识点 理解 集合及其表示理解 集合及其表示:

集合基本概念 用位向量实现集合 ADT 用有序链表实现集合 ADT 集合的应用

一般集合与位向量建立对应 用有序链表实现集合的操作

Page 5: 第三次直播

理解 等价类:理解 等价类: 等价关系与等价类 确定等价类的链表方法 并查集

实现等价类的链表算法实现等价类的并查集算法并查集的查找和合并操作

Page 6: 第三次直播

掌握 简单的搜索结构:掌握 简单的搜索结构: 搜索的概念

搜索结构 搜索的判定树 平均搜索长度

静态搜索 顺序搜索算法、分析 折半搜索算法、分析

Page 7: 第三次直播

二叉搜索树 定义 搜索、平均搜索长度 插入、删除、

AVL 树 定义 插入、平衡化旋转 删除、平衡化旋转 高度

Page 8: 第三次直播

并查集操作的算法并查集操作的算法查找

--5 0 1 2 300 11 22 33 44

Find (4)Find (3) = 3

Find (2) =2 Find (1) = 1

Find (0) = 0 = -5 < 0 结束

Page 9: 第三次直播

int Find ( int x ) { if ( parent [x] < 0 ) return x; else return Find ( parent [x] ); }

-5 0 1 2 3parentparent

Parent[4] =3 Parent[3]

=2Parent[2] =1

Parent[1] =0

Parent[0] =-5

0 1 2 3 4

Page 10: 第三次直播

合并 --1--1 --1 --1 --100 22 33 44

--3

--5

0

3

22

11

33

33

441

3 3

22

00

22

33

11

44

merge(0,1)

--2

3

--4

1

44

2

11

22

33

44

merge(1,2)

merge(2,3)

merge(3,4)

Page 11: 第三次直播

按树结点个数合并结点个数多的树的根结点作根

--1--1 --1 --1 --100

11

22 33 44--1 --1

0

--7

2

55 66

--5 --2

2 2

3 3

22 00

11

33

44

55

66

2

3 3 0

200

5566

22

3311

44

merge(2, 0)

Page 12: 第三次直播

按树高度合并高度高的树的根结点作根

--0--0 --0 --0 --000

11

22 33 44--0 --0

0

--2

2

55 66

--2 --1

2 2

3 3

22 00

11

33

44

55

66

2

3 3 0

200

5566

22

3311

44

merge(2, 0)

Page 13: 第三次直播

搜索的概念搜索结构决定搜索的效率搜索算法基于搜索结构搜索效率用平均搜索长度衡量平均搜索长度表明搜索算法的整体性能,避开偶然因素

平均搜索长度分搜索成功与搜索不成功两种情况

Page 14: 第三次直播

静态搜索结构顺序搜索 — 顺序表、链表折半搜索 — 有序顺序表

动态搜索结构二叉搜索树 — 无重复关键码AVL 树 — 平衡二叉搜索树

Page 15: 第三次直播

有序顺序表的顺序搜索 ( 10, 20, 30, 40, 50, 60 )

10

50

60

==

==

==

==

==

==

20

30

40

<<

<

<

<

<

>

>

>>

>

>

2

71

6

1 5

0

i

succ iASL

7

2761

7

1 5

0

i

unsucc

i

ASL

Page 16: 第三次直播

有序顺序表的折半搜索 ( 10, 20, 30, 40, 50, 60 )

10 50==

==

====

==

==

30

<

<

<

<

<

<

>

>

> >

> >20 40 60

Page 17: 第三次直播

二叉搜索树二叉搜索树的子树是二叉搜索树

35

15 45

50402510

20 30

结点左子树上所有关键码小于结点关键码 右子树上所有关键码大于结点关键码

Page 18: 第三次直播

n 个结点的二叉搜索树的数目【例】 3 个结点的二叉搜索树

51*2*3

4*5*6*

4

1C

13

1 33*2

1

2

2

1

3

3 1 3

2

1

2

3

1

2

3

{{123} {132} {213} {231} {312} {321}

Page 19: 第三次直播

搜索成功时检测指针停留在树中某个结点。搜索不成功时检测指针停留在某个外结点(失败结点)。

3515 45

502510

20 30

搜索 22

搜索 45

Page 20: 第三次直播

A

B

C

E

A

B

C

D

ED

二叉搜索树的高度越小,平均搜索长度越小。

n 个结点的二叉搜索树的高度最 大为 n-1, 最小为 log

2n.

Page 21: 第三次直播

AVL 树理解: AVL 树的子树也是 AVL 树掌握:插入新结点后平衡化旋转的方法

掌握:删除结点后平衡化旋转的方法

掌握:结点高度 h 与结点数 n 的关系

Page 22: 第三次直播

第八章 图 学习目的理解和掌握图和网络结构的存储表示图的遍历与连通性最小生成树活动网络等重要应用求解的方法

Page 23: 第三次直播

需要掌握的知识点理解:图的基本概念

图的顶点集合是非空有限集合 图的边集合可以是空集合 图的顶点序号不是固有的

掌握:图的存储表示 图的邻接矩阵元素个数与顶点有关,非零元素个数与边有关

Page 24: 第三次直播

图的邻接表既与顶点个数 n 有关,又与边数有关

连通无向图最多有 n(n-1)/2 条边,最少有 n-1 条边。

强连通有向图最多有 n(n-1) 条边,最少有 n 条边。 n=1 无边。

图中顶点的度有别于树中结点的度。

Page 25: 第三次直播

图的遍历与连通性 深度优先搜索算法 递归或用栈广度优先搜索算法 用队列生成树或生成森林

连通分量 重连通分量与关节点的概念 求解关节点及构造重连通图的方法

Page 26: 第三次直播

掌握 : 构造最小生成树的方法 Prim 算法 Kruskal 算法

掌握 : 活动网络的拓扑排序算法掌握 : 求解关键路径的方法理解 : 求解最短路径的 Dijkstra 方法

( 不要求算法 )

Page 27: 第三次直播

【例 1 】以深度优先搜索方法从 遍历图 , 建立深度优先生成森林。

A B C

D E F

G

A

A

B

DE

C

F

G有向图有向图 深度优先生成树深度优先生成树

Page 28: 第三次直播

template<class Type> void Graph<Type> ::DFS_Forest ( Tree<Type> &T ) { TreeNode<Type> *rt, *subT; int *visited = new int[n]; // 创建访问标志数组 for ( int i = 0; i < n; i++ ) visited [i] = 0; // 初始化 ,都未访问过 for ( i = 0; i < n; i++ ) // 遍历所有顶点

Page 29: 第三次直播

if ( !visited[i] ) { // 顶点 i 未访问过if ( T.IsEmpty ( ) ) // 原为空森林 ,建根 subT = rt = T.BuildRoot ( GetValue(i) ); // 顶点 i 的值成为根 rt 的值else subT = T.InsertRightSibling ( subT, GetValue(i) ); // 顶点 i 的值成为 subT 右兄弟的值

建生成森林

Page 30: 第三次直播

DFS_Tree ( T, subT, i, visited ); // 从顶点 i 出发深度优先遍历 // 建立以 subT 为根的 T 的子树

}}

template<class Type> void Graph<Type> :: DFS_Tree ( Tree<Type> &T, TreeNode<Type> *RT, int i, int visited [ ] ) {

建根的子树建根的子树

Page 31: 第三次直播

TreeNode<Type> *p; visited [i] = 1; // 顶点 i 作访问过标志 int w = First-Adjvertex(i); // 取顶点 i 的第一个邻接顶点 w int FirstChild = 1; // i 第一个未访问子女应是 i 的左子女 while ( w ) { // 邻接顶点 w 存在 if ( ! visited [w] ) { // w 未访问过 , 将成为 i 的子女

if ( FirstChild ) {

Page 32: 第三次直播

p = T.InsertLeftChild ( RT, GetValue(w) ); // p 插入为 RT 的左子女 FirstChild = 0; // 建右兄弟 } else p = T.InsertRightSibling ( p, GetValue(w) ); // p 插入为 p 的左子女 DFS_Tree ( T, p, w ); // 递归建立 w 的以 p 为根的子树

Page 33: 第三次直播

} // 邻接顶点 w 处理完 w = Next-AdjVertex ( i, w ); // 取 i 的下一个邻接顶点 w } // 回到 while 判邻接顶点 w 存在}

Page 34: 第三次直播

【例 2 】已知一个 AOE 网如图所示。 (1) 求关键活动和关键路径。 (2) 加速那些活动可以使整个工程提前?

1

3

2

4

a1=8

a2=12

5

6

7 8a10=12

a9=6

a8=18

a5=28

a6=8

a7=6a3=14

a4=10

Page 35: 第三次直播

求解几个量:求解几个量:事件的最早开始时间 Ve [i] 事件的最迟开始时间 Vl [i] 活动的最早开始时间 e[k] 活动的最迟开始时间 l [k] 活动的时间余量 e[k] - - l[k] e[k] - l[k] == 0 的活动为关键活动

Page 36: 第三次直播

1

3

2

4

a1=8

a2=12

5

6

7 8a10=12

a9=6

a8=18

a5=28

a6=8

a7=6a3=14

a4=10

VeVl

1 2 3 4 5 6 7 8

0 8 12 22 28 40 46 58 0 8 12 22 28 40 46 58e

l0 0 8 12 12 22 22 28 40 460 0 8 12 12 32 22 28 40 46

1 2 3 4 5 6 7 8 9 10

Page 37: 第三次直播

注意注意所有顶点按拓扑有序的次序编号仅计算 Ve[i] 和 Vl[i] 是不够的,还须计算 e[k] 和 l[k] 。

不是任一关键活动加速一定能使整个工程提前。

想使整个工程提前,要考虑各个关键路径上所有关键活动。

终终