收藏 分享(赏)

数据结构教研问题讨论.ppt

上传人:dreamzhangning 文档编号:5753653 上传时间:2019-03-16 格式:PPT 页数:211 大小:2.67MB
下载 相关 举报
数据结构教研问题讨论.ppt_第1页
第1页 / 共211页
数据结构教研问题讨论.ppt_第2页
第2页 / 共211页
数据结构教研问题讨论.ppt_第3页
第3页 / 共211页
数据结构教研问题讨论.ppt_第4页
第4页 / 共211页
数据结构教研问题讨论.ppt_第5页
第5页 / 共211页
点击查看更多>>
资源描述

1、1,数据结构教研问题讨论,根据精品课建设要求,我们将共同来研讨有关数据结构与算法课程的开设和授课中的一些基本问题。主要内容包括: 数据结构与算法课程的设置 数据结构中的若干问题 算法基础中的若干问题 数据结构与算法课程实践,2,. 数据结构:大部分高校在本科阶段只开设数据结构课程,没有开设算法课程。 . 数据结构与算法:有些高校在本科阶段开设了数据结构与算法课程,将数据结构与算法的内容在一门课程中讲授。 . 数据结构,算法基础:少数高校在本科阶段开设了数据结构和算法基础两门课程。,1.1 数据结构与算法课程设置,3,算法+数据结构=程序 开设算法类课程的意义究竟是什么? 在当前形势下,算法课程

2、的授课内容应该如何选择和取舍? 算法课程的教学方法应该如何顺应时代的要求? 如何让算法教学更加适应IT业、软件产业、计算机事业等领域发展的需求? 如何让算法更加具有实用性:易学、易读、易懂、易扩展、易维护 ,1.2 开设算法类课程的意义,4, 数据结构(二年级,第一学期,专业基础) 算法基础(三年级,第一学期,专业基础) 并行计算(四年级,第一学期,专业选修) 算法设计及其高效实现 (公共选修课) 算法实践及其应用 (公共选修课),5,目前常用的数据结构、算法类教材主要采用下面几种方式描述算法: 基于自然语言; 基于类 PASCAL 或 类 C; 基于面向对象的程序设计语言(JAVA,C+),

3、1.4 算法的表示和描述,6,伪语言描述的优点: 与具体的语言无关,摆脱了程序设计语言中的一些细节和规定; 易于表达算法的整体设计思想;所表示的算法可读性强,可以帮助更好的理解算法,可以方便的用各种程序设计语言来加以具体实现,适用面广。 算法性能的分析较为方便,可以将精力集中于算法性能的提高和算法设计与分析技巧。伪语言描述的不足: 与具体的语言结合不紧,应用中需要对具体程序设计语言有较好的掌握; 对于一些学生而言,可能实现算法时不够方便; 不时髦 。,伪语言 .PK. 面向对象的语言,7,面向对象程序设计语言描述的优点: 与具体的语言结合紧密,为具体程序设计语言量身定制,易于用所用的具体语言实

4、现; 方便利用标准模版,可以按软件设计规范来加以实现,所具体实现的算法安全性好,复用性好,易于在工程项目中应用; 比较时髦,易于吸引偏爱编程的学生。 面向对象程序设计语言描述的不足: 描述算法时需要考虑具体程序设计语言的要求(语法,类的定义、继承、扩展等),不利于从整体上描述算法思想,所描述的算法可读性差,算法性能分析较困难,不同的语言,算法描述差异较大,缺乏通用性; 学习面向对象程序设计语言时一般要求有数据结构的基础,如果数据结构课程中选用面向对象的程序设计语言描述算法,就形成了互为基础的状况; 一个简单的算法被描述成好几个子函数,破坏了完整性,算法效率低 。,伪语言 .PK. 面向对象的语

5、言,8,有关图的八个主要类: class AdjacencyGraph: 用邻接矩阵描述无向图 class AdjacencyWGraph: 用邻接矩阵描述加权无向图 class AdjacencyDigraph: 用邻接矩阵描述有向图 class AdjacencyWDigraph: 用邻接矩阵描述加权有向图 class LinkedGraph: 用邻接链表描述无向图 class LinkedWGraph: 用邻接链表描述加权无向图 class LinkedDigraph: 用邻接链表描述有向图 class LinkedWDigraph: 用邻接链表描述加权有向图,例:用C+语言描述算法,9

6、,图的八个主要类的派生关系:,例:用C+语言描述算法,10,例:类的定义示意,template class AdjacencyWDigraph friend AdjacencyWGraph; public:AdjacencyWDigraph (int Vertices = 10, T noEdge = 0);AdjacencyWDigraph( ) Delete2DArray(a,n+1);bool Exist(int i, int j) const;int Edges() const return e;int Vertices() const return n;AdjacencyWDigra

7、ph,Base class: AdjacencyWDigraph,11,例:类的定义示意,Class: AdjacencyWGraph,template class AdjacencyWGraph : public AdjacencyWDigraph public:AdjacencyWGraph(int Vertices = 10, T noEdge = 0) : AdjacencyWDigraph(Vertices, noEdge) AdjacencyWGraph,12,New class-derivation heirarychy: :,例:用C+语言描述算法,13,/从顶点v 开始的宽度

8、优先搜索 把顶点v 标记为已到达顶点; 初始化队列Q,其中仅包含一个元素v ; while (Q不空) 从队列中删除顶点w ;令u 为邻接于w 的顶点;while (u) if ( u 尚未被标记) 把u 加入队列;把u 标记为已到达顶点;u = 邻接于w 的下一个顶点; ,例:用伪代码描述BFS算法,14,例:用C+描述BFS算法,void Network:BFS(int v, int reach , int label) / 宽度优先搜索LinkedQueue Q;InitializePos(); /初始化图遍历器数组reachv = label;Q.Add( v ) ;while (!Q

9、.IsEmpty() int w;Q.Delete(w); / 获取一个已标记的顶点int u = Begin(w);while (u) / 访问w的邻接顶点if (!reachu) / 一个未曾到达的顶点Q.Add( u ) ;reachu = label; / 标记已到达该顶点u = NextVertex(w); / 下一个与w邻接的顶点DeactivatePos( ); / 释放遍历器数组 ,15,例:用C+描述BFS算法,template void AdjacencyWDigraph:BFS (int v, int reach , int label) / 宽度优先搜索LinkedQu

10、eue Q;reachv = label;Q.Add ( v ) ;while (!Q.IsEmpty( ) int w;Q.Delete(w); / 获取一个已标记的顶点/ 对尚未标记的、邻接自w的顶点进行标记for (int u = 1; u = n; u+)if (awu != NoEdge ,void LinkedDigraph:BFS(int v, int reach , int label) / 宽度优先搜索LinkedQueue Q;reachv = label;Q.Add ( v ) ;while (!Q.IsEmpty( ) int w;Q.Delete(w); / 获取一个

11、已标记的顶点/ 使用指针p沿着邻接表进行搜索ChainNode *p;for (p = hw.First(); p; p = p-link) int u = p-data;if (!reachu) / 尚未到达的顶点Q.Add ( u ) ;reachu = label; ,分别为AdjacencyWDigraph和LinkedDigraph定制BFS函数:,16,算法研究的观点:(个人观点,仅供参考) 初次学习数据结构和算法时最好选用伪代码(类语言)描述算法,有利于学生撑握主要的设计思想,减少其它因素的干拢; 对算法基础课程,因为主要在于讲授算法设计和分析的方法和技巧,选用伪代码(类语言)描

12、述算法更为合理; 与面向对象程序设计语言的结合: 可以与本科生软件类课程设计整体加以统盘考虑,将数据结构和算法的课程设计看作是软件类课程设计的一个基础部分,强调用C+等面向对象的程序设计方法去实现。 也可以在学完数据结构及其相关课程之后,结合面向对象程序设计语言的学习,参考相关的教材和书籍 (如:数据结构与STL等),开设数据结构与算法实践的选修课,也可以由学生自学(不同的高校可能有不同的考虑),伪语言 .PK. 面向对象的语言,17,1.5 算法性能分析,算法性能分析:主要对算法运行所需的时间和空间占用的情况进行分析和度量,这种度量是一种大概的把握。这样,需要一些符号或记号帮助我们描述这种度

13、量结果-渐近记号。有了这样一种分析的方法,就可以在一种统一的框架或模型下对不同的算法进行要析,对不同算法的性能优劣进行对比。渐近记号最早由 Knuth 先生引出。,18,影响算法运行时间的因素,算法的运行时间与下列因素有关: Numbers of inputs; The distribution of input data; How the algorithm is implemented; What kind of data structure is used; Usually describe the running time of a program as a function of t

14、he input size。,19,平均情况和最坏情况,Best Case Running Time: 同样的输入规模,不同的数据分布情况下,最快情况的运行时间。 Worst Case Running Time:同样的输入规模,不同的数据分布情况下,最慢或运行步数最多时的运行时间。 Average Case Running Time:同样的输入规模,不同的数据分布情况下,平均所需的运行时间,通常指概率平均或期望值 。,20,平均情况 .VS. 最坏情况, Because it is so easy to cheat with the best case running time, we usu

15、ally dont rely too much about it. The average running time is usually very hard to compute, we usually strive to analyze the worst case running time. The “average case“ is often roughly as bad as the worst case. The worst-case running time is an upper bound on the running time for any input, it is u

16、sually fairly easy to analyze and often close to the average or real running time. 。,21,渐近记号(一), 大O 记号: 定义: f (n)=O(g(n) 意味着存在正常数 C 和 n0 ,使得当 n n0 , 均有 0 f (n) C g(n) 成立。 f (n)=O(g(n)表明,当 n 时, f (n)趋于无穷大的阶不大于(即小于等于) g(n)趋于无穷大的阶.,22,Examples for O-notation,23,渐近记号(二), 大 记号: 定义: f (n)=(g(n) 意味着存在正常数 C

17、 和 n0 ,使得当 n n0 , 均有 0 C g(n) f (n) 成立。 f (n)= (g(n)表明,当 n 时, f (n)趋于无穷大的阶不小于 g(n) 趋于无穷大的阶.,24,Examples for -notation,25,渐近记号(三), 大 记号: 定义: f (n)=(g(n) 意味着存在正常数C1, C2和n0使得当nn0 , 均有 0C1g(n)f (n)C2g(n)成立。 f (n)=(g(n)表明,当 n 时, f (n) 和g(n)趋于无穷大的阶是相同的。,26,Examples for -notation,Proof: We need to chose po

18、sitive constants C1, C2 , and n0 ,such that C1n2n2/2-3nC2n2. To do so, we let C1=1/6, C2 =1, n0 =9:Since n2/3-3n = (n/3-3)n 0 , for n9Then n2/6 n2/6+(n2/3-3n) = n2/2-3n, for n9And n2/2-3n n2, for n 0So C1n2n2/2-3nC2n2 holds for all n9 .,27,空间复杂度,Space complexity (空间复杂度): The amount of computer memor

19、y a program needs to run to completion. Why to be interested in it?To sepcify the amount of memory to be allocated to a program.To know in advance whether or not sufficient memeory is available to run a program.To be useful to choose a suitable solution to a question.To estimate the size of the larg

20、est problem that a program can solve,28,时间复杂度,Time complexity (时间复杂度): The amount of computer time a program needs to run to completion. Why to be interested in it?To want to know the expected run time for a program.To determine whether or not the response time of a program will be acceptable.To dec

21、ide to choose a best one to solve a problem from several ways, by using some weighted measure of the memory and time complexities of them.,29, 线性表 栈和队列 树和二叉树 图 静态和动态查找,实现策略 顺序和链式存储结构,二. 数据结构中的若干问题,30, 顺序表中插入、删除时元素的平均移动次数; 字典和跳表 栈与递归 (一个递归的例子) 队列(循环队列表示中数组的起始下标问题),2.1 线性表、 栈和队列,31,在一个以顺序结构存储的线性表中插入、删

22、除一个元素的平均时间复杂度与下述因素有关: 插入、删除元素所在的位置; 线性表的长度 (原有元素的数目); 事件发生的概率在不同的位置插入 (或删除)元素的可能性是不同的(在一般情况下);,顺序表插入、删除性能分析,32,假设线性表的长度为 n,在第 i 个位置插入(插入后在新的线性表中为第 i 个元素) 的概率记作 p i, i =1,2,3, n, n+1, 显然要求:在第 i 个位置插入一个元素所需的数据移动次数 f (i ) 为:插入一个元素所需的平均数据移动次数为:,顺序表插入元素性能分析,33,例1:假设线性表的长度为 n,在任何位置插入一个元素的概 率是相同的 (均匀一致分布),

23、 , i =1,2,3, n, n+1平均每插入一个元素所需的数据移动次数为:,顺序表插入元素性能分析,34,例2:假设线性表的长度为 n,在第 i 个位置插入的概率 p i, , i =1,2,3, n, n+1, 此时插入一个元素所需的平均数据移动次数为:,顺序表插入元素性能分析,35,问题:假设线性表的长度为 n,请问删除第i 个位置的元素所需的元素移动次数为多少? i =1,2,3, n, 问题:假设删除线性表中第 i 个位置元素的概率为: 请问此时删除一个元素所需的平均数据移动次数为多少?,顺序表删除元素性能分析,36,A dictionary (字典) is a collectio

24、n of elements; each element has a field called key, and no two elements have the same key value. The operations to be performed on a dictionary: Insert an element with a sepecified value. Search the dictionary for an element with a specified key value. Delete an element with a specified key value. 例

25、: 一个班中注册学习数据结构课程的学生构成了一个字典。当有一个新学生注册时,就要在字典中插入与该学生相关的元素(记录)。当有人要放弃这门课程时,则删除他的记录。在上课过程中,老师可以查询字典以得到与某特定学生相关的记录或修改记录(例如,加入或修改考试成绩)。学生的学号域可作为关键字。(注:姓名不能做为关键字),字典和跳表的概念,37,The ADT Dictionary :,字典和跳表的概念,AbstractDataType Dictionary instancescollection of elements with distinct keysoperationsCreate ( ): 创建

26、一个空字典;Search (k, x): 搜索关键字为k的元素,结果放入x;如果没找到,则返回false,否则返回true;Insert (x): 向字典中插入元素x;Delete (k, x): 删除关键字为k的元素,并将其放入x; ,38,字典中的元素是一个动态的集合,因此不适合选用顺序结构做存储结构,常用的存储结构有: 有序链表 散列表选用有序链表做为存储结构的最大问题是搜索关键字必须采用顺序查找,查找所需时间复杂度太大。跳表则是针对这一问题而对有序链表进行改进所得。,字典和跳表的概念,39,基本思想:在一个使用有序链表描述的具有n 个元素的字典中进行搜索,至多需进行n 次比较。如果在链

27、表中部节点加一个指针,则比较次数可以减少到n/ 2 + 1。搜索时,首先将欲搜索元素与中间元素进行比较。如果欲搜索的元素较小,则仅需搜索链表的左半部分,否则,只要在链表右半部分进行比较即可。例: (a) 7个元素的有序链表.该链表有一个头指针和尾指针。对该链表搜索可能要进行7次比较。,跳表的概念,40,(b) 在中间元素增加一个指针,可以让最坏情况下比较次数减为4.(c) 在左、右两半部分再增加一个指针,可以进一步减少比较次数。图中有三级链:0级就是图(a)中的初始链;1级链包括第二、四、六个元素;2级链只包括第四个元素。,跳表的例子,41,(d) 在前面的图(c)中查找值为77的元素,操作如

28、下所示: 首先与40比较,7740,则在1级链中与 75 比较; 由于7775,因此在0级链中与75后面的80比较,此时可知77不在字典中。,跳表的例子,42,跳表 (Skip List) 的结构 (如前面的图(c)具有下述特征: have a heirarchy(分级的) of chains; The level 0 chain is a sorted chain of all elements; The level 1 chain is also a sorted chain that is comprised of some subset of the element on the le

29、vel 0 chain; In general, the level i chain comprises a subset of the elements in the level i-1 chain; attempt to approximate this structure: n/2i elements are level i elements.,跳表的结构特征,43,如果在构造跳表时采用的是每 k (=1/p ) 个元素中抽取一个进入上一层, 则跳表结构还具有下述特征: the level i chain comprises every kth element of thelevel i

30、-1 chain; the probability of this newly inserted element level being i is pi. In Figure (c), k = 2, p = 0.5; for general k (=1/p ), the number of chain levels is:,跳表的结构特征 (续),44,例: 在前面的跳表(图(d)中插入一个新的元素77:首先要通过搜索以确定链中没有此元素。在搜索中,最后一个2级链指针存储在40的指针域中,而最后一个1级链指针存储在75的指针域中。在图(d)中,这几条指针用虚线标出。新元素插在75和80之间,如

31、图(d)中的虚线所示。插入时,要为新元素分配一个级,分配过程由随机数产生器完成,随机数产生器将在后面介绍。所以,插入操作的最坏情况时间复杂度为:(n),跳表中插入元素,(d) Last pointers encountered when search for 77,(e) 77 inserted,45,在删除跳表中元素时,我们无法控制其结构。要删除图(e) 中的元素77,首先要找到77。搜索过程中最后所遇到的链指针是节点40中的2级链指针、节点75中的1级链指针和0级链指针。在这些链指针中,因为77为1级链元素,所以只需改变0级和1级链指针即可。当这些指针变成指向77后面的元素时,就得到图(d

32、)的结构。,跳表中删除元素,(e) Last pointers encountered when search for 77,(d) 77 deleted,46,Method: 假设有一随机数产生器所产生的数平均分布在0到RAND_MAX间。 下一次所产生的随机数小于等于 CutOff = p* RAND_MAX 的概率为p。因此,若下一随机数小于等于CutOff,则新元素应在1级链上。现在继续确定新元素是否在2级链上,这由下一个随机数来决定。 若新的随机数小于等于CutOff,则该元素也属于2级链。重复这个过程,直到得到一随机数大于CutOff为止。 缺点: 可能为某些元素分配特别大的级,远

33、远超过log1/pN,其中N为字典中预期的最大数目。为避免这种情况,设置一个上限lev = log1/pN -1. 即使采用上面所给出的上限,但还可能存在下面的情况: 如在插入一个新元素前有3条链,而在插入之后就有了10条链。,插入元素时的链指针级数,47,链指针级数示例,Example:用跳表表示一个最多有1024个元素的字典。设 p = 0.5, MaxLevel 为 log21024 - 1 = 9; 若随机数产生器的AND_MAX = 232 - 1, 则CutOff = 231 1; 新产生的随机数小于等于CutOff的概率为0.5。,48,栈与递归一个递归的例子,例:已知有如下的函

34、数,写出求值的非递归过程,实际上,这个函数是一个分段函数,当 2 k n 2 k+1 时,函数值均是相同的。,49,循环队列中的若干表达式,例:循环队列的起始位置问题:设有两个数组 A1max和 B0max-1, 分别用这两个数组做为循环队列的存储结构,给出有关队列的长度、入队列、出队列等的相关表达式。(注: 设 m = max-1 , rear表示尾部, front表示头部第1个元素前1个位置 ),队列长度:( rear front + max ) MOD max 入队列:rear = (rear MOD max) + 1 出队列:front = (front MOD max) + 1 队列

35、空:front = rear 队列满:(rear MOD max) +1 = front,队列长度:( rear front + max ) MOD max 入队列rear = (rear +1) MOD max 出队列front = (front + 1) MOD max 队列空:front = rear 队列满:( rear + 1) MOD max = front,A1max的相关表达式,B0max-1的相关表达式,50,2.2 树和二叉树, 树的高度,二叉树与树的区别; 二叉树性质,完全二叉树; 树的加权外部路径长度,Huffman树; 树的计数,Catalan数; 树与分离集合(树与

36、等价类),51,树与二叉树的区别,树和二叉树的高度:不同的教材对高度的定义有所不同。 结点的最大层次数,根结点为第1层; 根结点到叶结点的最长路径所含有的边的个数;由于树一定是非空的,对于树和非空二叉树而言,两种定义下的高度相差1. 二叉树与树的区别: 二叉树可以是空的,而树一定是非空的,二叉树可以有0个结点,树则至少有1个结点; 二叉树不同于度为2的树。二叉树中的每个结点最多只有两个子结点,称为左、右子树,而度为2的树虽然每个结点的子结点数也不超过2个,但其子树分为第1棵和第2棵; 对于空二叉树,关于高度的两种定义是一致的,高度为0.,52,二叉树性质和完全二叉树, 度为2的结点数与叶结点数

37、之间的关系; 有n 0 个结点的完全二叉树的高度(结点层次数): 有n 0 个叶结点的完全二叉树的高度(结点层次数):当 n 2k , 即 n 不是2的方幂或者 n = 2k 但是一棵满2叉树n = 2k 但是非满2叉树,其高度为:,其高度为:,53,Huffman编码,哈夫曼编码(Huffman codes)是一种文本压缩算法,它根据不同符号在一段文字中的相对出现频率来进行压缩编码。 Example:文本是由 a,u,x,z 组成的字符串,若这个字符串的长度为1000,每个字符用一个字节来存贮,共需1000个字节(即8000位)的空间。如果每个字符用2位二进制来编码(00 =a, 01=x,

38、 10=u, 11=z),则用2000位二进制即可表示1000个字符。此外,还需要一定的空间来存放编码表,可采用如下格式来存储:符号个数,代码1,符号1,代码2,符号2,符号个数及每个符号分别用8位二进制来表示,每个代码需占用log2 (符号个数) 位二进制。因此,在本例中,代码表需占用5*8 + 4*2 = 48位,压缩比为8000/2048 = 3.9。利用上述编码方法,字符串aaxuaxz 的压缩编码为二进制串00000110000111,每个字符的编码具有相同的位数(两位)。从左到右依次从位串中取出2位,通过查编码表便可获得原字符串。,54,Huffman编码,可变长编码:频率(fre

39、quency)是指一个字符在串中出现的次数。当每个字符出现的频率有很大变化时,可以通过可变长的编码来降低每个位串的长度。 Example: 在字符串 aaxuaxz 中 ,a, x, u, z 在这个字符串中出现的频率分别为3,2,1,1。 编码:如果使用编码 (0 = a, 10 = x, 110 = u, 111 = z),则 aaxuaxz 的压缩编码为0010110010111。编码长度为13位,比原来每个字符用2位、总长14位稍好。 解码:当从左至右解码时,必须知道第一个字符的代码是0,00还是001。由于没有哪个字符的代码以00打头,因此第一个字符的代码必为0,根据编码表可知该字符

40、为a。下一个代码为0,01或010,同理,由于不存在以01打头的字符代码,因此代码必为0,相应元素为a。根据这种方法不断进行下去,就可以对整个位串进行解码。,为什么能够采用上述方法解码呢?通过仔细观察所使用的4种代码(0,10,110,111),可以发现没有任何一个代码是另一代码的前缀。,55,Huffman树,如何实现哈夫曼编码?构建哈夫曼树 哈夫曼树(Huffman tree):加权外部路径长度(weighted external path length)最小的二叉树。假设n个字符在文本中的出现的频率分别为:F(i) (0 i n)。由这n个字符构成的一棵扩展二叉树中,二叉树的加权外部路径

41、长度为:其中,L(i):从根到达外部节点i 的路径长度(即路径的边数)。WEP:为二叉树的加权外部路径长度。对从哈夫曼树的根到外部节点的路径进行编码,这样每个节点上的字符所得到的编码即为哈夫曼编码。,56,Huffman树,构造哈夫曼树:首先从仅含一个外部节点的二叉树集合开始,每个外部节点代表字符串中一个不同的字符,其权重等于该字符的频率。此后不断地从集合中选择两棵具有最小权重的二叉树,并把它们合并成一棵新的二叉树,合并方法是把这两棵二叉树分别作为左右子树,然后增加一个新的根节点。新二叉树的权重为两棵子树的权重之和。这个过程可一直持续到仅剩下一棵树为止。,57,Huffman树,Example

42、:,最后编码: a: 00 b: 010 c: 011 d: 100 f: 11,58,Huffman树构造算法,template BinaryTree HuffmanTree(T a , int n) / 根据权重a 1: n构造霍夫曼树/ 创建一个单节点树的数组Huffman *w = new Huffman n+1;BinaryTree z, zero;for (int i = 1; i H(1);H . Initialize (w, n , n ) ;/ 将堆中的树不断合并Huffman x, y;for (i = 1; i n; i+) H . DeleteMin ( x ); H

43、. DeleteMin ( y ) ;z . MakeTree(0, x.tree, y. tree ) ;x.weight += y.weight; x.tree = z;H . Insert ( x ) ;H.DeleteMin(x); / 最后的树H .Deactivate ( ) ;delete w;return x.tree; ,Complexity analysis: 构造和删除数组w 所需时间:当T为内部数据类型时:为(1);当T为用户自定义的类时:(n)。 第一个for循环和堆的初始化: (n) 。 第二个for循环:总共执行了2(n-1次删除最小元素及n-1次插入操作,需O(

44、nlogn) 的时间。 函数其余部分:(1)。因此HuffmanTree树构造算法总的时间复杂性:O(nlogn)。,59,Huffman树概念的拓展,问题:前面介绍的Huffman编码是一种二进制编码,这对于将文本压缩成二进制串是合适的,但如果要将文串压缩成 k进制串 (k是一个大于1的整数) ,又该如何处理呢?Example: 将串 ABDACEDAEADFBBDA用三进制编码表示。串中共出现了6种字符,各字符出现频率分别为:A 5 ,B 3 ,C 1, D 3, E 2, F 1问题: 如何编码?加权外部路径长度最小的k 叉树如何构造?算法如何变化?,60,树的计数和 Catalan数,

45、 具有n+1 个结点的不同形状的树的个数具有 n 个结点的不同形状的二叉树个数 n 个元素的入栈次序为:1,2,3,n, 则不同的出栈次序的数目, Catalan是计算机科学中常用的一个序列, 例:有多少个+1和-1的序列使得:a1+a2+a3+a2n = 0且它们的所有前缀和:a1, a1+a2, , a1+a2+a3+a2n均非负?,61,2.3 图, 图的存储结构 宽度优先和深度优先搜索 拓扑排序 最小生成树 单源最短路径,62,图的存储结构, 要表示一个图G = (V, E ),有两种常用的方法,即 adjacency lists(邻接表)和 adjacency matrix(邻接矩阵

46、); 邻接表比较常用,因为用这种方法表示稀疏图(图中边数|E|远小于顶点数的平方|V|2 )比较简洁紧凑; 邻接矩阵在稠密图中或需要很快判别出两个给定顶点是否相邻时比较适用;图G = (V, E) 的邻接表表示由数组 Adj 构成, 数组元素是顶点,每个顶点对应一个邻接表。对每一个顶点u V, 邻接表Adj u 包含图G中所有和该顶点相邻接的顶点。在每个邻接表中的顶点按任意次序存储。,63,图的表示示例无向图,下面的图中给出了一个无向图G1的2种表示方法: (a) 有5个顶点7条边的无向图G1 ; (b) G1 的邻接矩阵表示; (c) G1 的邻接表表示;,(a): 图 G1,5,1,2,3

47、,4,(b): 图 G1的邻接矩阵,(c): 图 G1的邻接表,64,图的表示示例有向图,下图中给出了一个有向图的2种表示方法:,(a): 有向图 G2,(c): 图 G2的邻接表,(b): 图 G2的邻接矩阵,65,图的宽度优先搜索,宽度优先搜索(Breadth-first search): 是图的一种最为简单的搜索算法,是许多其它图论算法的原型 (archetype); 算法思想: 任给一个图 G = (V, E) 和一个源点s, 宽度优先搜索是一种按距离由近到远遂层搜索的算法,它在发现任何与源点s 距离为 k+1的顶点之前,先发现所有距离为 k 的顶点。宽度优先搜索所走过的路径构成了一棵

48、以源点s 为根、由所有可达顶点组成的树,称为宽度优先树.在宽度优先树中,从s到任意可达的顶点 v 所对应的路径是图G中从s到v的最短路径(含最少边数)。宽度优先搜索算法适用于有向图和无向图。,66,图的宽度优先搜索,顶点的颜色: To keep track of progress, breadth-first search colors each vertex white, gray, or black; All vertices start out white and may later become gray and then black; A vertex is discovered the first time it is encountered during the search, at which time it becomes nonwhite. 灰色和黑色的顶点都已被发现,将它们区分开来是为了保证以宽度优先的方式执行 。黑色顶点的邻接点要么是黑色要么是灰色;而灰色顶点可以与白色顶点相邻接,它们代表已找到顶点和未找到顶点的边界。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报