收藏 分享(赏)

算法和数据结构.ppt

上传人:weiwoduzun 文档编号:5776839 上传时间:2019-03-16 格式:PPT 页数:198 大小:1.11MB
下载 相关 举报
算法和数据结构.ppt_第1页
第1页 / 共198页
算法和数据结构.ppt_第2页
第2页 / 共198页
算法和数据结构.ppt_第3页
第3页 / 共198页
算法和数据结构.ppt_第4页
第4页 / 共198页
算法和数据结构.ppt_第5页
第5页 / 共198页
点击查看更多>>
资源描述

1、算法和数据结构,1,算法数据和数据结构,刘宇 2001年,算法和数据结构,2,程序=算法+数据结构,软件:刻画现实世界,解决现实世界中的问题 语言:实现的工具 算法:解的描述(日常的:如魔方) 数据结构:现实世界的数据模型 程序=算法+数据结构,第一章:概论,算法和数据结构,3,几个例子(问题),表达式解释 6+5*4=? 字符串匹配 串“ABCAC”出现在另一个串“ABCABCACAC”的第几个位置上 排序 一个序列,如何最快地对其进行排序 压缩编码 AAAABBBCDDE? 图的最短路径 地理研究中的交通网络,第一章:概论,算法和数据结构,4,课程讲述的内容,上述问题的答案,包括 一些常用

2、的数据结构类型以及其应用 与这些数据结构的有关算法 空间数据结构,第一章:概论,算法和数据结构,5,数据结构(一),作为学科的数据结构 数据结构是研究非数值计算的程序设计问题中计算机的操作对象以及它们之间关系和操作等等的学科。 非数值计算 操作对象(数组),第一章:概论,算法和数据结构,6,作为研究对象的数据结构 数据(和信息的关系) 数据项目 数据对象,第一章:概论,数据结构(二),算法和数据结构,7,数据,数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。数值性数据非数值性数据,算法和数据结构,8,数据元素,数据的基本单位。在计算机程

3、序中常作为一个整体进行考虑和处理。 有时一个数据元素可以由若干数据项(Data Item)组成。数据项是具有独立含义的最小标识单位。 数据元素又称为元素、结点、记录。,算法和数据结构,9,数据对象,数据的子集。具有相同性质的数据成员(数据元素)的集合。 整数数据对象 N = 0, 1, 2, 学生数据对象,算法和数据结构,10,数据结构(三),树形关系,网状关系,1,5,2,4,3,6,1,5,2,4,3,6,数据结构:存在一种或多种特定关 系的数据元素的集合集合关系 Data_Structure = (D,S) D:数据元素的有限集合 S:关系,算法和数据结构,11,几个例子 图书管理 对弈

4、 道路交叉口 数据结构的分类(例子) 集合 线性 树型 网状,第一章:概论,数据结构(三),算法和数据结构,12,数据结构物理结构 顺序存储 链式存储 抽象数据类型 数据类型(int,float) 抽象数据类型 原子类型 固定聚合类型 可变聚合类型 面向对象技术与数据结构,第一章:概论,数据结构(四),算法和数据结构,13,抽象数据类型(ADT),由用户定义,用以表示应用问题的数据模型 由基本的数据类型组成, 并包括一组相关的服务(或称操作) 信息隐蔽和数据封装,使用与实现相分离,算法和数据结构,14,算法,定义 为了完成特定任务指令的有穷序列 好的算法的特性 正确性 可读性 健壮性 效率和存

5、储要求,第一章:概论,算法和数据结构,15,算法的特性,输入 有0个或多个输入输出 有一个或多个输出(处理结果)确定性 每步定义都是确切、无歧义的有穷性 算法应在执行有穷步后结束有效性 每一条运算应足够基本,算法和数据结构,16,算法的效率,时间复杂性 问题规模 大O记法 空间复杂性,第一章:概论,算法和数据结构,17,线性表的定义,线性表的定义 唯一的第一个元素 唯一的最后一个元素 前驱 后继,第二章:线性表,1,2,3,n, ,算法和数据结构,18,相关概念和例子,数据项 纪录 文件 例子 字母表 数据库表,第二章:线性表,算法和数据结构,19,线性表操作(一),初始化:Initiate

6、求长度:Length 得到第I个元素:Get 设置第I个元素:Set 求前驱:Prior 求后继:Next 定位:Locate 插入:Insert,第二章:线性表,算法和数据结构,20,线性表操作(二),删除操作:Delete 判断表是否为空:Empty 置空表操作:Clear,第二章:线性表,算法和数据结构,21,线性表模板类的定义(按值访问),template class LinearList public:void Initiate();int Length();T GetAt(int nIndex);void SetAt(int nIndex, T newValue);T Prior(

7、T Value);T Next(T Value);int Locate(T Value);bool Insert(int nIndex, T Value);void Delete(int nIndex);bool IsEmpty();void Clear(); ;,算法和数据结构,22,线性表模板类的定义(按地址访问),typedef voide * POSITION; template class LinearList public:void Initiate();int Length();POSITION GetAt(int nIndex);T ,算法和数据结构,23,线性表的存储结构,顺

8、序存储链式存储,第二章:线性表,NULL,算法和数据结构,24,两种存储方式的比较,顺序存储 优点:元素访问方便 缺点:内存使用;插入删除不方便 链式存储 优点:内存利用好,插入删除方便 缺点:元素访问不方便,第二章:线性表,算法和数据结构,25,两种存储方式的模板类声明(1),顺序存储 template class LinearList private:T *m_pData;int m_nAllocatedSize; /线性表分配内存长度int m_nSize; /线性表实际长度 public:. ;,算法和数据结构,26,两种存储方式的模板类声明(2),链式存储 template clas

9、s LinearList private:struct NodeT Data;struct Node *pNext;struct Node *m_pHeader; public:. ;,算法和数据结构,27,链式存储的代码(C)(一),struct Node Data_Type Data;struct Node *pNext; ; 具体的两种实现 1:pHeader指针指向的地址存放数据这样,链表为空时:pHeader = NULL;(未分配任何空间)链表不为空时(一个元素):2:pHeader指针指向的地址不存放数据链表为空时,分配了一个节点的空间。,第二章:线性表,pHeader,NULL

10、,算法和数据结构,28,链式存储的代码(C)(二),/得到第nIndex个元素 /注意的问题 /基0还是基1 /两种实现方式的不同,以下的代码是基0,第二种实现方式 Template T LinearList:Get(int nIndex) struct Node *p = pHeader;for(int i=0;ipNext;assert(p!=NULL);return p-Data; ,第二章:线性表,算法和数据结构,29,链式存储的代码(C)(三),/向第nIndex个位置上插入数据元素dataInsert Template void LinearList:Insert(int nInd

11、ex, T dataInsert) struct Node *p = m_pHeader;struct Node *pInsert = new struct Node1;pInsert-Data = dataInsert;(注意赋值)for(int i=0;ipNext;assert(p!=NULL);pInsert-pNext = p-pNext;p-pNext = pInsert; ,第二章:线性表,算法和数据结构,30,链式存储的代码(C)(四),/删除第nIndex个位置上的数据元素 Template void LinearList:Delete(int nIndex) struct

12、Node *p = m_pHeader;for(int i=0;ipNext;assert(p!=NULL);assert(p-pNext!=NULL);struct Node *pTemp = p-pNext-pNext;delete p-pNext;p-pNext = pTemp; ,第二章:线性表,算法和数据结构,31,其它形式的链表,循环链表 表尾元素的pNext指针不为NULL 判断方式为是否等于pHeader 好处:从链表中任何一个节点都可以找到其它的节点。 双向链表 两个指针域 好处:可以进行两个方向的查找,但是插入和删除时比较麻烦。,第二章:线性表,算法和数据结构,32,线性表

13、的应用多项式表达,n 阶多项式 Pn(x) 有 n+1 项。系数 c0, c1, c2, , cn指数 0, 1, 2, , n。按升幂排列,算法和数据结构,33,多项式的顺序表表示,定义数据元素的类型 struct Term double coef; int exp; ; 定义一个多项式对象 LinearList polynomial;,算法和数据结构,34,多项式的加法算法,扫描两个多项式,若都未检测完: 若当前被检测项指数相等,系数相加。若未变成 0,则将结果加到结果多项式。两个多项式各后移一项;若当前被检测项指数不等,将指数小者加到结果多项式,并后移一项。 若一个多项式已检测完,将另一

14、个多项式剩余部分复制到结果多项式。,算法和数据结构,35,栈,栈是限定于只在表尾进行插入和删除操作的线性表 后进先出(Last in first out,LIFO) 相关概念 栈顶(表尾) 栈底(表头),第三章:栈和队列,算法和数据结构,36,栈的图示,栈底,栈顶,出栈,压栈,第三章:栈和队列,算法和数据结构,37,栈的操作,初始化:Inistack 判断栈是否为空:Empty 压栈:Push 弹栈:Pop 得到栈顶元素:GetTop 清空栈:Clear 得到栈的大小:Current_Size,第三章:栈和队列,算法和数据结构,38,栈的应用,函数调用,算法和数据结构,39,栈的应用,进制转换

15、,7,3,2,算法和数据结构,40,表达式求值,4+2*3-10/5 表达式:操作数,运算符,界限符 操作数栈 算符栈 #算符,表示表达式的开始和结束,第三章:栈和队列,算法和数据结构,41,算符优先级,第三章:栈和队列,算法和数据结构,42,表达式求值算法,1:操作数栈置空,操作符栈压入算符“#” 2:依次读入表达式的每个单词 3:如果是操作数,压入操作数栈 4:如果是操作符,将操作符栈顶元素1与读入的操作符2进行优先级比较 4.1如果栈顶元素优先级低,将2压入操作符栈 4.2如果相等,弹操作符栈 4.3如果栈顶元素优先级H,弹出两个操作数,一个运算符,进行计算,并将计算结果压入操作数栈,重

16、复第4步的判断 5:直至整个表达式处理完毕,第三章:栈和队列,算法和数据结构,43,表达式求值的例子,3*(7-2)#,步骤 操作符栈 操作数栈 输入字符 操作 1 # 3*(7-2)# 压入“3” 2 # 3 *(7-2)# 压入“*” 3 #* 3 (7-2)# 压入“(” 4 #*( 3 7-2)# 压入“7” 5 #*( 37 -2)# 压入“-” 6 #*(- 37 2)# 压入“2” 7 #*(- 372 )# 弹出“-”压入7-2 8 #*( 35 )# 弹出“(” 9 #* 35 # 计算3*5 10 # 15 # 操作符栈空,结束,第三章:栈和队列,算法和数据结构,44,栈的

17、应用迷宫,解决思路: 从起点开始,将位置 以及第一个方向入栈, 然后沿一个方向向后 搜索,如果某个点无 路可走,退栈,并搜 寻下一个方向。直到 找到或者栈空为止。 栈节点的内容: (x,y,d),算法和数据结构,45,队列,队列的特点 先进先出,First in first out(FIFO) 相关概念 队头 队尾,A1 A2 A3 A4 A5 An,入队,出队,队头(front),队尾(rear),第三章:栈和队列,算法和数据结构,46,队列的操作,初始化:InitQueue 判断是否为空:IsEmpty 入队列:EnQueue 出队列:DlQueue 取队列头:GetHead 清空队列:C

18、lear 得到队列长度:GetSize,第三章:栈和队列,算法和数据结构,47,队列的应用和实现,任务调度 打印任务 消息队列 排队模拟 队列的两种实现 链式存储 注意要有队尾指针 循环队列,第三章:栈和队列,算法和数据结构,48,队列的顺序存储,采用两个变量记录对头和队尾,对头为出队元素位置,初始时为-1,队尾为入队元素位置,初始时为-1。当队头等于队尾时,队列为空。 在初始时数组为空,随着不断入队和出队,队列的内容将“上移”,使得在有剩余空间时,也不能入队。,算法和数据结构,49,循环队列,一个后果:队列满时,队头等于 队尾,难以区分空和满解决之道:1)加一个标记变量2)剩余一个空间不能

19、加入,在满时队头队尾差MAX-1,算法和数据结构,50,循环队列代码,#define MAX 100 template class Queue T DataMAX;int nFront;int nRear; public:void InitQueue()nFront = -1; nRear = -1;int IsEmpty() if(pQ-nFront = pQ-nRear) return 1;else return 0;void EnQueue(T ele)assert(nFront+MAXSIZE)%MAX != (nRear+1)%MAX );Content(nRear+1)%MAX =

20、 ele;nRear = (nRear+1)%MAX;,算法和数据结构,51,循环队列代码(Cont.),T DlQueue()assert(nFront != nRear);nFront = (nFront+1)%MAX;return ContentnFront;T ,算法和数据结构,52,队列的链式存储,NULL,pFront,pRear,入队只对 pRear操作,出队对pFront操作,算法和数据结构,53,队列的应用,离散事件模拟 问题: 一个银行,有N个窗口; 每分钟会来一个客户,客户业务处理时间为一个随机数M; 每个客户总是排到最短的队上。 要求: 模拟一段时间内的排队情况,并进行

21、定量统计,算法和数据结构,54,串,定义: 零个或多个字符组成的有限序列 例子 “China”, “Boy and Girl” 应用 语言处理,如编译器 文本检索 专家系统 ,第四章:串,算法和数据结构,55,串的操作(一),一个问题 串和线性表 操作: 赋值和创建:Assign,Create 判断是否相等:Equal 计算长度:Length 联结:Concat 求子串:SubStr,第四章:串,算法和数据结构,56,串的操作(二),定位:Index 置换:Replace 插入:Insert 删除:Delete,第四章:串,算法和数据结构,57,串的存储实现,静态存储结构 数组 动态存储结构

22、链表 每个节点可以存储一个或多个数组,算法和数据结构,58,串的匹配KMP算法,一种朴素的匹配算法 KMP匹配算法 出发点:利用前面匹配的结果,进行无回溯匹配 一个示例匹配的讲解 模式串:abcac 主串:ababcabcacbab,第四章:串,算法和数据结构,59,串的匹配KMP算法,思考的开始: 假定:主串为 S1S2Sn模式串为 P1P2Pm 无回溯匹配问题变为:当主串中的第i个字符和模式串中的第j个字符出现不匹配,主串中的第i个字符应该和模式串中的哪个字符匹配(无回溯)?,第四章:串,算法和数据结构,60,串的匹配KMP算法,进一步思考 假定主串中第i个字符与模式串第k个字符相比较,则

23、应有 P1P2Pk-1 =Si-k+1Si-k+2Si-1 问题可能有多个k,取哪一个? 而根据已有的匹配,有 Pj-k+1Pj-k+2Pj-1 =Si-k+1Si-k+2Si-1 因此 Pj-k+1Pj-k+2Pj-1 =P1P2Pk-1 因此k值只和P以及j有关,定义为Nextj,第四章:串,算法和数据结构,61,串的匹配KMP算法,Nextj的定义Nextj =,0,j=1时,Maxk|1kj and p1p2pk-1= pj-k+1pj-1,1,其它情况,j,1 2 3 4 5 6 7 8,a b a a b c a c0 1 1 2 2 3 1 2,Nextj,第四章:串,算法和数据

24、结构,62,已知Next数组匹配的算法,/假定字符串数据类型为string int Index(string strMain,string strPattern)int i=1;int j=1;/注意基1while(ilength(strPattern)return i-length(strPattern);/匹配成功elsereturn 0;/匹配不成功 ,第四章:串,算法和数据结构,63,计算Next数组的方法,一个简单的计算方法 对于每个j计算前面尽可能大的k 另外的算法,类似于匹配,根据前面计算的Next数值进行计算 对Next数组的进一步思考 如果k=Nextj而strPattern

25、k=strPatternj 则Nextj=Nextk,第四章:串,算法和数据结构,64,对Next数组进行无回溯匹配的计算,void Makenext(String p,int *pNext)/1 based int i,k; i=1;k=0;Next1 = 0;while(i0 ,算法和数据结构,65,算法基础,The value of Nexti = k is known, then how to calculate Nexti+1? Nexti = k means:P1 P2Pk-1 = Pi-k+1 Pi-1 Obviously if Pk=Pi, Nexti=k+1, But if

26、Pk!=Pi, How to do?k=Nextk,算法和数据结构,66,串的应用,处理文本 统计词频 关键字查找 一个作业 读入一长串文本,统计每个单词出现的次数,第四章:串,算法和数据结构,67,树,树(Tree)的定义 树是n(n=0)个节点的有限集合, 有且仅有一个称为根的节点; 当n1时,其余节点可以分为m个互不相交的集合,其中每个集合又是一棵树,称为树的子树 递归的定义 现实世界中的树 家谱 目录,第五章:树和二叉树,算法和数据结构,68,树,树的示例,A,B,C,D,E,第五章:树和二叉树,算法和数据结构,69,树的相关概念,节点(Node) 节点的度(Degree) 叶子(终端

27、节点) 非终端节点 树的度 孩子(Child) 双亲(Parent) 兄弟(Sibling),第五章:树和二叉树,算法和数据结构,70,树的操作,Initiate Root:求根 Parent Child Right_Sibling Left_Sibling CreateTree(x,F),第五章:树和二叉树,算法和数据结构,71,树的操作(Cont.),InsertChild DeleteChild Traverse Clear,第五章:树和二叉树,算法和数据结构,72,二叉树,二叉树(Binary Tree) 每个节点最多只有两棵子树,并且子树有左右之分,不能任意互换 二叉树的五种形态 空

28、 只有根 只有左子树 只有右子树 左右子树均不空,第五章:树和二叉树,算法和数据结构,73,二叉树的性质,第I层上最多有2I-1个节点 深度为K的二叉树最多有2k-1个节点 对于任意一个二叉树,如果其终端节点数目为n0,度为2的节点数目为n2,有n0=n2+1 完全二叉树和满二叉树 具有n个节点的完全二叉树的深度为log2n+1,第五章:树和二叉树,算法和数据结构,74,二叉树的性质(Cont.),N个节点的完全二叉树,按照从顶到底,从左到右的顺序编号(1-N) 如果I=1,根节点 如果I1,则双亲为I/2 如果2IN,则节点I无左孩子,否则左孩子为2I 如果2I+1N,则节点I无右孩子,否则

29、右孩子为2I+1,第五章:树和二叉树,算法和数据结构,75,二叉树的存储结构,顺序存储深度为k的二叉树需要2k-1个存储空间 链式存储结构 节点结构: struct node DATA_TYPE Data; struct node *pLChild; struct node *pRChild; struct node *pParent; ;,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ,第五章:树和二叉树,算法和数据结构,76,二叉树的遍历,目的 查找树中所有的节点 三种遍历方式 先序遍历 后序遍历 中序遍历,第五章:树和二叉树,算法和数据结构,77,先

30、序遍历的程序,Void PreOrder(struct Node *pBinTree) if(pBinTree!=NULL) visit(pBinTree); PreOrder(pBinTree-pLChild); PreOrder(pBinTree-pRChild); ,第五章:树和二叉树,算法和数据结构,78,表达式与二叉树,A+B*(C-D)-E/F,-,/,+,*,A,-,B,D,C,F,E,第五章:树和二叉树,算法和数据结构,79,线索二叉树,二叉树的前驱和后继 为了提高遍里的效率,规定 如果一个节点有左孩子,则pLChild指向左孩子;反之,指向节点的前驱 如果一个节点有右孩子,则

31、pRChild指向右孩子;反之,指向节点的后继 因此要增加两个标志域,第五章:树和二叉树,算法和数据结构,80,新的节点结构,struct Node DATA_TYPE struct Node *pLChild; struct Node *pRChild; int LTag; Int RTag; ; 线索化和线索二叉树,第五章:树和二叉树,算法和数据结构,81,中序遍历的线索树,NULL,NULL,第五章:树和二叉树,算法和数据结构,82,基于线索树的中序遍历,后继的情况 叶子节点 pRChild指向了后继 非叶子节点 后继为节点右子树最左下的节点 前驱的情况 叶子节点 pLChild指向了前

32、驱 非叶子节点 左子树最右下的节点,第五章:树和二叉树,算法和数据结构,83,线索链表和线索二叉树的建立,线索链表,头节点的意义,第五章:树和二叉树,Head,Root,0,1,1,1,算法和数据结构,84,线索链表和线索二叉树的建立,程序 Void Create_InthLinked(struct Node *pBinTree,struct Node *LinkHeader) LinkHeader = new struct Node1; LinkHeader-Ltag = 0;LinkHeader-Rtag = 0; LinkHeader-pRChild=LinkHeader; if(Bin

33、Tree=NULL) LinkHeader-pLChild= LinkHeader; else LinkHeader-pLChild = pBinTree; pPre = LinkHeader;InThread(pBinTree);pPre-pRChild = LinkHeader; pPre-Rtag = 1;LinkHeader-pRChild = pPre; LinkHeader-Rtag = 1; ,算法和数据结构,85,线索链表和线索二叉树的建立,程序(Cont.) Void InThread(struct Node *pBinTree) if(pBinTree!=NULL)InTh

34、read(pBinTree-pLChild);if(pBinTree-pLChild=NULL)pBinTree-Ltag=1;pBinTree-pLChild=pPre; if(pPre-pRChild=NULL)pPre-Rtag=1;pPre-pRChild=pBinTree; pPre = pBinTree;InThread(pBinTree-pRChild); ,第五章:树和二叉树,算法和数据结构,86,基于栈的遍历(非递归),先序遍历 二叉树为pTree,p=pTree; InitStack(); Loop: visit(p);Push(p);p=p-pLChild; Loop2:

35、if(p!=NULL) goto Loop; else if(!EmptyStack) p=Pop(); p=p-pRChild;goto Loop2; else END,算法和数据结构,87,基于栈的遍历(非递归),中序遍历 二叉树为pTree;p=pTree;InitStack(); Loop: while(p!=NULL) Push(p); p=p-pLChild; if(!EmptyStack) p=Pop(); Visit(p);p=p-pRChild; goto Loop; else END,算法和数据结构,88,基于遍历的节点计数,int Count (Node *pRoot)

36、const if (pRoot = NULL) return 0;else return 1 + Count (pRoot-pLChild)+ Count (pRoot-pRChild); ,算法和数据结构,89,基于遍历的求双亲算法,Node *Parent (Node * pStart, Node * pCurrent ) if ( pStart= NULL ) return NULL;if ( pStart-pLChild = pCurrent |pStart-pRChild = pCurrent ) return pStart;Node *p;if ( p = Parent ( pSt

37、art-pLChild, pCurrent )!= NULL ) return p; else return Parent(pStart-pRChild, pCurrent); ,算法和数据结构,90,基于遍历的二叉树创建,目的 根据某种顺序遍历的结果创建二叉树 但是 不同二叉树可以有相同的遍历结果 因此 增加空节点标志 如下 ABDCEGFHI,算法和数据结构,91,创建二叉树的代码(先序),Node *CreateTree() Node *p; char ch = getchar(); if(ch=) p = NULL; else p = new Node1;p-Data = ch;p-p

38、LChild = CreateTree();p-pRChild = CreateTree(); return p; ,算法和数据结构,92,二叉树的计数,问题: N个节点的相似二叉树有多少种,b(n)=? b(0)=1;b(1)=1;b(2)=2;b(3)=5 概念 二叉树的相似 两棵二叉树均为空或军不为空,而且左右子树相似 二叉树的等价,算法和数据结构,93,二叉树的计数,递推思路 N个节点的二叉树可以认为是,有1个根节点,i个节点的左子树,n-i-1个节点的右子树 因此通项公式,算法和数据结构,94,相关的一个问题,已知一个二叉树的先序序列和中序序列可以唯一的确定一个二叉树 如: 先序序列

39、为 ABCDEFG 中序序列为 CBEDAFG 二叉树为何?,算法和数据结构,95,创建过程,A,C B E D,F G,A,F G,B,C,E D,A,F G,B,C,D,E,最终结果,算法和数据结构,96,树的存储结构,双亲表示法 孩子表示法 孩子兄弟表示法 两个指针域分别表示节点的的一个孩子和和下一个兄弟,第五章:树和二叉树,算法和数据结构,97,树和二叉树的转换,A,D,C,B,E,A,B,C,E,D,第五章:树和二叉树,算法和数据结构,98,最优二叉树,二叉树的路径 路径长度 树的路径长度 树的带权路径长度 树中所有叶子节点的带权路径长度之和 哈夫曼树 有n和权值,构造一棵有n个叶子

40、的二叉树,每个叶子节点带权为Wi,则带权路径长度WPL最小的二叉树称为最优二叉树或哈夫曼树,第五章:树和二叉树,算法和数据结构,99,哈夫曼树生成算法,Win棵二叉树,根为权重,无左右子树 选取两棵根节点权最小的二叉树作为左右子树合并,其根节点权为左右子树根权值之和 删除合并的两棵树,并将新树加到树的集合中 重复计算,第五章:树和二叉树,算法和数据结构,100,哈夫曼树的构造实例,7,5,2,4,2,4,5,7,6,11,18,第五章:树和二叉树,算法和数据结构,101,二叉树的应用,学生成绩转换 不同成绩段成绩概率不一致 可以构造哈夫曼树,根据哈夫曼树,进行比较,减少比较的次数,第五章:树和

41、二叉树,算法和数据结构,102,哈夫曼编码,编码的目的 减少数据量 前缀编码 任意一个编码的都不是另一个编码的前缀 利用二叉树的编码都是前缀编码 原则 哈夫曼编码,第五章:树和二叉树,算法和数据结构,103,哈夫曼编码实例,A(5),B(29),C(7),D(8),E(14),F(23),G(3),H(11),A(5):0001 B(29):11 C(7):1010 D(8):1011 E(14):100 F(23):01 G(3):0000 H(11):001,算法和数据结构,104,回溯法与树的遍历,回溯法 在程序设计中,有一类问题是求一组或一类最优解的问题 如八皇后问题,迷宫问题等等 可

42、以用试探回溯法处理 回溯法的每一步,可以认为是状态树的一个节点,求解过程实际上是对树的遍历,算法和数据结构,105,幂集的计算,幂集的定义 集合A=1,2,3 A的幂集为 1,2,3,1,2,1,3,2,3,1,2,3,空集 求幂集的过程可以看作对每个元素进行取舍的过程,算法和数据结构,106,求幂集过程形成的二叉树,1,12,1,2,123,12,13,1,23,2,3,算法和数据结构,107,代码,void Powerset(int i,LinearList ,算法和数据结构,108,八皇后问题的状态树,算法和数据结构,109,八皇后问题(代码),void Trial(int Loc,in

43、t i)if(i=SIZE)for(int n=0;nSIZE;n+) printf(“(%d,%d) “,n,Locn);printf(“n“);else for(int n=0;nSIZE;n+)Loci = n;if(IsValid(Loc,i)Trial(Loc,i+1); ,算法和数据结构,110,排序,排序(Sorting) 目的:将一个数据元素的序列,重新排列成为一个关键字有序的序列。 排序方法稳定 排序方法不稳定 内部排序和外部排序,第六章:排序和查找,算法和数据结构,111,排序的分类,插入排序,交换排序,选择排序,归并排序和计数排序等等 复杂度分类 O(n2) O(nLog

44、n) O(dn) 排序进行的操作 比较和移动,第六章:排序和查找,算法和数据结构,112,插入排序,直接插入排序 基本思想: 是一种最简单的排序方法,它是将一个记录插入到排序好的序列中,从而形成新的,记录增1的有序表。,38,49,65,97,76,第六章:排序和查找,算法和数据结构,113,监视哨的概念,普通的一个查找 for(int i=0;in;i+) if(nSearch=Arrayi) break; 缺点每次循环都要进行in的判断,增加了计算时间。,第六章:排序和查找,算法和数据结构,114,监视哨的概念,一个改进的思路 Arrayn = nSearch; for(int i=0;i

45、+) if(nSearch=Arrayi) break; if(i=n) /查找不成功 else /查找成功,第六章:排序和查找,算法和数据结构,115,直接插入排序代码,/插入排序 void InsertSort(int *a,int n) for(int i=1;iai) break;int nTemp = ai;for(int k=i;kj;k-) ak = ak-1;aj = nTemp; ,算法和数据结构,116,其它插入排序,直接插入排序 纪录的移动次数为n2/4 折半插入排序 减少了查找的的次数 2-路插入排序 假定排序数组为R,另设一个等大数组D; 令D0 = R0 假定D0为

46、排序的中间位置,形成两个序列。分别进行插入排序 移动次数为n2/8,第六章:排序和查找,算法和数据结构,117,希尔排序,Shell排序又称为缩小增量排序 考虑的出发点: 直接插入排序其事件复杂度为O(n2),但是当排序纪录序列为基本正序时,复杂度为O(n) 当n很小时,直接插入排序效率也很高。 因此,希尔排序: 将整个待排纪录分割成为若干子序列进行直接插入排序,当整个序列基本有序时,进行直接排序,第六章:排序和查找,算法和数据结构,118,实例,子序列的构成,一定的增量间隔构成子序列,间隔可以实现设定,如5,3,1。 49 38 65 97 76 13 27 49 55 04第一次结果(增量

47、5) 13 27 49 55 04 49 38 65 97 76 第二次结果(增量3) 13 04 49 38 27 49 55 65 97 76 最后结果:04 13 27 38 49 49 55 65 76 97,第六章:排序和查找,算法和数据结构,119,起泡排序,思路 先进行第一个纪录和第二个记录的比较,如果为逆序,则交换;然后比较第二个和第三个关键字,一趟完毕; 进行1-n-1的起泡,整个排序完毕 复杂度 比较次数O(n2) 移动次数O(n2),第六章:排序和查找,算法和数据结构,120,快速排序,基本思想 通过一趟排序将纪录分割,其中一部分关键字均比另一部分小;然后再分别对这两部分进行排序; 通常选取序列的第一个纪录作为比较的参照(称为支点Pivot),然后将关键字小的排在其前,大的排在其后,并以此时关键字的位置将序列分成两部分,再对两部分进行快速排序; 因此快速排序是一个递归的算法,

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

当前位置:首页 > 企业管理 > 经营企划

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


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

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

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