第三次直播
DESCRIPTION
第三次直播. 清华大学 殷人昆. 中央电大 徐孝凯. 本次要讲的问题. 第七章 集合与搜索 第八章 图. 第七章 集合与搜索. 学习目的 理解和掌握 集合结构的概念 集合的应用 与集合相关的搜索方法和简单的性能分析方法。. 需要掌握的知识点 理解 集合及其表示 : 集合基本概念 用位向量实现集合 ADT 用有序链表实现集合 ADT 集合的应用 一般集合与 位向量 建立对应 用 有序链表 实现集合的操作. 理解 等价类: 等价关系与等价类 确定等价类的链表方法 并查集 实现等价类的链表算法 实现等价类的并查集算法 - PowerPoint PPT PresentationTRANSCRIPT
本次要讲的问题
第七章 集合与搜索 第八章 图
第七章 集合与搜索 学习目的理解和掌握 集合结构的概念 集合的应用 与集合相关的搜索方法和简单的性能分析方法。
需要掌握的知识点 理解 集合及其表示理解 集合及其表示:
集合基本概念 用位向量实现集合 ADT 用有序链表实现集合 ADT 集合的应用
一般集合与位向量建立对应 用有序链表实现集合的操作
理解 等价类:理解 等价类: 等价关系与等价类 确定等价类的链表方法 并查集
实现等价类的链表算法实现等价类的并查集算法并查集的查找和合并操作
掌握 简单的搜索结构:掌握 简单的搜索结构: 搜索的概念
搜索结构 搜索的判定树 平均搜索长度
静态搜索 顺序搜索算法、分析 折半搜索算法、分析
二叉搜索树 定义 搜索、平均搜索长度 插入、删除、
AVL 树 定义 插入、平衡化旋转 删除、平衡化旋转 高度
并查集操作的算法并查集操作的算法查找
--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 结束
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
合并 --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)
按树结点个数合并结点个数多的树的根结点作根
--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)
按树高度合并高度高的树的根结点作根
--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)
搜索的概念搜索结构决定搜索的效率搜索算法基于搜索结构搜索效率用平均搜索长度衡量平均搜索长度表明搜索算法的整体性能,避开偶然因素
平均搜索长度分搜索成功与搜索不成功两种情况
静态搜索结构顺序搜索 — 顺序表、链表折半搜索 — 有序顺序表
动态搜索结构二叉搜索树 — 无重复关键码AVL 树 — 平衡二叉搜索树
有序顺序表的顺序搜索 ( 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
有序顺序表的折半搜索 ( 10, 20, 30, 40, 50, 60 )
10 50==
==
====
==
==
30
<
<
<
<
<
<
>
>
> >
> >20 40 60
二叉搜索树二叉搜索树的子树是二叉搜索树
35
15 45
50402510
20 30
结点左子树上所有关键码小于结点关键码 右子树上所有关键码大于结点关键码
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}
搜索成功时检测指针停留在树中某个结点。搜索不成功时检测指针停留在某个外结点(失败结点)。
3515 45
502510
20 30
搜索 22
搜索 45
A
B
C
E
A
B
C
D
ED
二叉搜索树的高度越小,平均搜索长度越小。
n 个结点的二叉搜索树的高度最 大为 n-1, 最小为 log
2n.
AVL 树理解: AVL 树的子树也是 AVL 树掌握:插入新结点后平衡化旋转的方法
掌握:删除结点后平衡化旋转的方法
掌握:结点高度 h 与结点数 n 的关系
第八章 图 学习目的理解和掌握图和网络结构的存储表示图的遍历与连通性最小生成树活动网络等重要应用求解的方法
需要掌握的知识点理解:图的基本概念
图的顶点集合是非空有限集合 图的边集合可以是空集合 图的顶点序号不是固有的
掌握:图的存储表示 图的邻接矩阵元素个数与顶点有关,非零元素个数与边有关
图的邻接表既与顶点个数 n 有关,又与边数有关
连通无向图最多有 n(n-1)/2 条边,最少有 n-1 条边。
强连通有向图最多有 n(n-1) 条边,最少有 n 条边。 n=1 无边。
图中顶点的度有别于树中结点的度。
图的遍历与连通性 深度优先搜索算法 递归或用栈广度优先搜索算法 用队列生成树或生成森林
连通分量 重连通分量与关节点的概念 求解关节点及构造重连通图的方法
掌握 : 构造最小生成树的方法 Prim 算法 Kruskal 算法
掌握 : 活动网络的拓扑排序算法掌握 : 求解关键路径的方法理解 : 求解最短路径的 Dijkstra 方法
( 不要求算法 )
【例 1 】以深度优先搜索方法从 遍历图 , 建立深度优先生成森林。
A B C
D E F
G
A
A
B
DE
C
F
G有向图有向图 深度优先生成树深度优先生成树
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++ ) // 遍历所有顶点
if ( !visited[i] ) { // 顶点 i 未访问过if ( T.IsEmpty ( ) ) // 原为空森林 ,建根 subT = rt = T.BuildRoot ( GetValue(i) ); // 顶点 i 的值成为根 rt 的值else subT = T.InsertRightSibling ( subT, GetValue(i) ); // 顶点 i 的值成为 subT 右兄弟的值
建生成森林
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 [ ] ) {
建根的子树建根的子树
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 ) {
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 为根的子树
} // 邻接顶点 w 处理完 w = Next-AdjVertex ( i, w ); // 取 i 的下一个邻接顶点 w } // 回到 while 判邻接顶点 w 存在}
【例 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
求解几个量:求解几个量:事件的最早开始时间 Ve [i] 事件的最迟开始时间 Vl [i] 活动的最早开始时间 e[k] 活动的最迟开始时间 l [k] 活动的时间余量 e[k] - - l[k] e[k] - l[k] == 0 的活动为关键活动
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
注意注意所有顶点按拓扑有序的次序编号仅计算 Ve[i] 和 Vl[i] 是不够的,还须计算 e[k] 和 l[k] 。
不是任一关键活动加速一定能使整个工程提前。
想使整个工程提前,要考虑各个关键路径上所有关键活动。
终终