1 / 37

第三次直播

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

quinta
Download Presentation

第三次直播

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三次直播 清华大学 殷人昆 中央电大 徐孝凯

  2. 本次要讲的问题 • 第七章 集合与搜索 • 第八章 图

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

  4. 需要掌握的知识点 • 理解 集合及其表示: • 集合基本概念 • 用位向量实现集合 ADT • 用有序链表实现集合 ADT • 集合的应用 • 一般集合与位向量建立对应 • 用有序链表实现集合的操作

  5. 理解 等价类: • 等价关系与等价类 • 确定等价类的链表方法 • 并查集 • 实现等价类的链表算法 • 实现等价类的并查集算法 • 并查集的查找和合并操作

  6. 掌握 简单的搜索结构: • 搜索的概念 • 搜索结构 • 搜索的判定树 • 平均搜索长度 • 静态搜索 • 顺序搜索算法、分析 • 折半搜索算法、分析

  7. 二叉搜索树 • 定义 • 搜索、平均搜索长度 • 插入、删除、 • AVL树 • 定义 • 插入、平衡化旋转 • 删除、平衡化旋转 • 高度

  8. 并查集操作的算法 • 查找 0 1 2 4 3 -5 0 1 2 3 Find (4) Find (3) = 3 Find (2) =2 Find (1) = 1 Find (0) = 0 = -5 < 0 结束

  9. 0 1 2 3 4 parent -5 0 1 2 3 Parent[0] =-5 Parent[4] =3 Parent[1] =0 Parent[3] =2 Parent[2] =1 intFind( intx){ if( parent [x] < 0 )return x; else returnFind ( parent [x]); }

  10. 0 1 2 3 4 0 -1 -1 -1 -1 -1 -5 3 2 1 1 • 合并 -2 -3 -4 0 2 2 3 4 3 2 1 1 merge(3,4) 4 3 3 3 2 2 merge(2,3) 4 4 3 3 merge(1,2) merge(0,1)

  11. 0 2 3 4 5 6 1 • 按树结点个数合并 • 结点个数多的树的根结点作根 -1 -1 -1 -1 -1 -1 -1 merge(2, 0) 2 2 0 -5 -2 -7 5 1 3 1 3 0 2 2 0 2 2 2 6 5 4 4 6 3 3 3 3 0

  12. 0 2 3 4 5 6 1 • 按树高度合并 • 高度高的树的根结点作根 -0 -0 -0 -0 -0 -0 -0 merge(2, 0) 2 2 0 -2 -1 -2 5 1 3 1 3 0 2 2 0 2 2 2 6 5 4 4 6 3 3 3 3 0

  13. 搜索的概念 • 搜索结构决定搜索的效率 • 搜索算法基于搜索结构 • 搜索效率用平均搜索长度衡量 • 平均搜索长度表明搜索算法的整体性能,避开偶然因素 • 平均搜索长度分搜索成功与搜索不成功两种情况

  14. 静态搜索结构 • 顺序搜索 — 顺序表、链表 • 折半搜索 — 有序顺序表 • 动态搜索结构 • 二叉搜索树 — 无重复关键码 • AVL树 — 平衡二叉搜索树

  15. 有序顺序表的顺序搜索 ( 10, 20, 30, 40, 50, 60 ) 10 < > = 20 < > = 30 < > = 40 < > = 50 < > = 60 < > =

  16. 有序顺序表的折半搜索 ( 10, 20, 30, 40, 50, 60 ) 30 < > = 10 50 < < > > = = 20 40 60 = < = < > < = > >

  17. 二叉搜索树 • 二叉搜索树的子树是二叉搜索树 • 结点左子树上所有关键码小于结点关键码 • 右子树上所有关键码大于结点关键码 35 15 45 10 25 40 50 20 30

  18. n 个结点的二叉搜索树的数目 【例】3 个结点的二叉搜索树 {123} {132} {213} {231} {312} {321} 1 1 2 3 3 2 3 1 3 1 2 3 2 2 1

  19. 搜索成功时检测指针停留在树中某个结点。 • 搜索不成功时检测指针停留在某个外结点(失败结点)。 35 搜索45 15 45 10 25 50 20 30 搜索22

  20. 二叉搜索树的高度越小,平均搜索长度越小。 • n个结点的二叉搜索树的高度最 大为 n-1, 最小为 log2n. A C B A D C D B E E

  21. AVL树 • 理解:AVL树的子树也是AVL树 • 掌握:插入新结点后平衡化旋转的方法 • 掌握:删除结点后平衡化旋转的方法 • 掌握:结点高度 h与结点数 n的关系

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

  23. 需要掌握的知识点 • 理解:图的基本概念 • 图的顶点集合是非空有限集合 • 图的边集合可以是空集合 • 图的顶点序号不是固有的 • 掌握:图的存储表示 • 图的邻接矩阵元素个数与顶点有关,非零元素个数与边有关

  24. 图的邻接表既与顶点个数 n 有关,又与边数有关 • 连通无向图最多有 n(n-1)/2 条边,最少有n-1条边。 • 强连通有向图最多有n(n-1) 条边,最少有 n条边。n=1无边。 • 图中顶点的度有别于树中结点的度。

  25. 图的遍历与连通性 • 深度优先搜索算法 递归或用栈 • 广度优先搜索算法 用队列 • 生成树或生成森林 • 连通分量 • 重连通分量与关节点的概念 • 求解关节点及构造重连通图的方法

  26. 掌握 : 构造最小生成树的方法 • Prim算法 • Kruskal算法 • 掌握 : 活动网络的拓扑排序算法 • 掌握 : 求解关键路径的方法 • 理解 : 求解最短路径的Dijkstra方法(不要求算法)

  27. A 【例1】以深度优先搜索方法从 遍历图, 建立深度优先生成森林。 A B C A B C G E D F D E F 有向图 深度优先生成树 G

  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++ ) //遍历所有顶点

  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右兄弟的值 建 生 成 森 林

  30. DFS_Tree ( T, subT, i, visited ); • //从顶点 i出发深度优先遍历 • //建立以 subT为根的T的子树 • } • } • template<class Type> • void Graph<Type> :: DFS_Tree • ( Tree<Type> &T, TreeNode<Type> • *RT, inti, int visited [ ] ) { 建根的子树

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

  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 为根的子树

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

  34. 【例2】已知一个AOE网如图所示。 (1) 求关键活动和关键路径。 (2) 加速那些活动可以使整个工程提前? 2 5 a8=18 a7=6 a1=8 a3=14 a10=12 1 4 7 8 a6=8 a4=10 a9=6 a2=12 3 6 a5=28

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

  36. 1 2 3 4 5 6 7 8 0 8 12 22 28 40 46 58 0 8 12 22 28 40 46 58 Ve Vl 1 2 3 4 5 6 7 8 9 10 e l 0 0 8 12 12 22 22 28 40 46 0 0 8 12 12 32 22 28 40 46 2 5 a8=18 a7=6 a1=8 a3=14 a10=12 1 4 7 8 a6=8 a4=10 a9=6 a2=12 3 6 a5=28

  37. 注意 • 所有顶点按拓扑有序的次序编号 • 仅计算 Ve[i] 和 Vl[i]是不够的,还须计算 e[k]和 l[k]。 • 不是任一关键活动加速一定能使整个工程提前。 • 想使整个工程提前,要考虑各个关键路径上所有关键活动。 终

More Related