1、2018年9月6日7时56分,数据结构与算法,第1页,公共基础知识,第1章 数据结构与算法,第1章 数据结构与算法,第2页,2018年9月6日7时56分,本章内容,1.1 算法,1.2 数据结构基本概念,1.5 线性链表,1.6 树与二叉树,1.7 查找技术,1.3 线性表及其顺序存储结构,1.4 栈和队列,1.8 排序技术,第1章 数据结构与算法,第3页,2018年9月6日7时56分,1. 1 算法,1.1.1 算法的基本概念,1. 算法的基本特征,算法是指解决问题方案的准确而完整的描述。即用来完成某个特定任务的正确的、有限步骤序列。,第1章 数据结构与算法,第4页,2018年9月6日7时5
2、6分,例题:,算法的有穷性是指 算法程序的运行时间是有限的 算法程序所处理的数据量是有限的 算法程序的长度是有限的 算法只能被有限的用户使用 下列叙述正确的是 算法的执行效率与数据的存储结构有关 算法的空间复杂度是指算法程序中指令(或语句)的条数 算法的有穷性是指算法必须能在执行有限个步骤之后终止 以上三种说法都不对,正确,正确,第1章 数据结构与算法,第5页,2018年9月6日7时56分,一个算法由两个基本要素组成:1) 对数据对象的运算和操作包括以下四类: 算术运算 逻辑运算 关系运算 数据传输2) 算法的控制结构 算法中各操作之间的执行顺序称为算法的控制结构。 描述算法的工具包括自然语言
3、描述、程序设计语言描述、流程图描述等。 一个算法一般可以用顺序、选择、循环三种基本结构组合而成。,2. 算法的基本要素,第1章 数据结构与算法,第6页,2018年9月6日7时56分,3. 算法设计基本方法,列举法归纳法递推递归减半递推技术回溯法,第1章 数据结构与算法,第7页,2018年9月6日7时56分,算法的复杂度包括时间复杂度和空间复杂度。 1)算法的时间复杂度:是指执行算法所需要的计算工作量。 2)算法的空间复杂度:是指执行算法所需要的存储空间。,1.1.2 算法复杂度,第1章 数据结构与算法,第8页,2018年9月6日7时56分, 算法的时间复杂度,一般把程序运行时语句的执行次数作为
4、估算程序执行时间的量度。,例:估算以下程序段的时间复杂度。,Dim a(5) As Integer Const n=5 k=0 执行 1 次 for i=1 To n Step 1 执行 n 次 if a(i)a(k) Then k=i 执行n-1次 Print k 执行 1 次 ,语句执行频度:f(n)=2n+1 当n一定大时:算法的工作量=f(n), 算法的空间复杂度,执行一个算法所需要的内存空间的多少。包括程序本身所占空间、数据所占空间、处理数据所占的附加空间、算法执行过程中所需的额外空间。,第1章 数据结构与算法,第9页,2018年9月6日7时56分,例题:,算法的空间复杂度是指 算法
5、程序的长度 算法程序中的指令条数 算法程序所占的存储空间 执行算法需要的内存空间 下列叙述中正确的是 一个算法的空间复杂度大,则其时间复杂度也必定大 一个算法的空间复杂度大,则其时间复杂度必定小 一个算法的时间复杂度大,则其空间复杂度必定小 上述三种说法都不对,正确,正确,第1章 数据结构与算法,第10页,2018年9月6日7时56分,1.2 数据结构的基本概念,数据结构主要研究三方面的问题: 数据的逻辑结构 数据的存储结构 对各种数据结构进行的运算 这三个方面是软件设计的基础。,第1章 数据结构与算法,第11页,2018年9月6日7时56分,1.2.1 什么是数据结构,1. 数据的逻辑结构,
6、例:职工情况表,除第一个和最后一个元素外,每个元素最多有一个直接前件和一个直接后件,即为线性结构。,数据的逻辑结构只抽象地反映出数据元素之间的逻辑关系,它与数据的存储无关,是独立于计算机的。,第1章 数据结构与算法,第12页,2018年9月6日7时56分,2 . 数据的存储结构(也称为数据的物理结构),数据的存储结构是逻辑结构在计算机内存储器中的实现。,有四种基本的存储结构:,1)顺序方式,2)链接方式,3)索引方式,4)散列方式,第1章 数据结构与算法,第13页,2018年9月6日7时56分,1.2.2 数据结构的图形表示,1)线性结构:除第一个和最后一个元素外,其他每个元素都仅有一个直接前
7、件元素和一个直接后件元素。,例:,第1章 数据结构与算法,第14页,2018年9月6日7时56分,例:,例:,2)树型结构:每个元素若有直接前件元素,只能有一个,但可以有多个直接后件元素。,3)图形结构:每个元素都可以有多个直接前件元素和多个直接后件元素。,第1章 数据结构与算法,第15页,2018年9月6日7时56分,1.2.3 线性结构与非线性结构,数据结构分为两大类:线性结构和非线性结构 线性结构:每个结点最多有一个前件,也最多有一个后件。 非线性结构:一个数据结构不是线性结构,则称为非线性结构。例如:树型结构和图型结构均属于非线性结构。,第1章 数据结构与算法,第16页,2018年9月
8、6日7时56分,1.3.1 线性表的基本概念,1.3 线性表及其顺序存储结构,例1:英文字母表 A,B.Z英文字母表是一个线性表,数据元素是字母字符,每个数据元素只由一个数据项组成。,线性表由一组数据元素构成。不同的情况下有不同的含义。,第1章 数据结构与算法,第17页,2018年9月6日7时56分,例2:职工情况表,职工情况表是一个复杂的线性表 每个数据元素由若干个数据项组成 每个数据元素也称为记录 多个记录组成文件,第1章 数据结构与算法,第18页,2018年9月6日7时56分,线性表的定义: 线性表是由()个相同类型的数据元素 a1、an-1 组成的有限序列 。可抽象的表示为:,(a1,
9、ai-1,ai,ai+1,an),开始元素 中间元素 终端元素,线性表中元素的个数称为表的长度。长度为0的表为空表。元素在表中的序号称做元素的下标。,第1章 数据结构与算法,第19页,2018年9月6日7时56分,线性表L=(a1,a2,a3, ,ai, ,an),下列说法正确的是 每个元素都有一个直接前件和直接后件 线性表中至少要有一个元素 表中诸元素的排列顺序必须是由小到大或由大到小 除第一个元素和最后一个元素外,其余每个元素都有一个且只有一个直接前件和直接后件,例题:,正确,第1章 数据结构与算法,第20页,2018年9月6日7时56分,1.3.2 线性表的顺序存储结构(顺序表), 以顺
10、序方式存储的线性表称为顺序表。 可以用一维数组实现顺序表。 有两个基本特点:,1) 数据元素存放到一片连续的存储单元内。2) 数据元素在存储空间中是按逻辑顺序依次存放的。,例:英语字母表的顺序存储。,数据元素在存储空间中的存储地址是:ADR(ai)=ADR(a1)+(i-1)k ,k为一个元素所占字节个数。,第1章 数据结构与算法,第21页,2018年9月6日7时56分,1.3.3 顺序表的插入运算,1.3.4 顺序表的删除运算, 在平均情况下,在线性表中插入一个元素,要移动表的一半元素。, 在平均情况下,在线性表中删除一个元素,也要移动表的一半元素。,说明: 在线性表的顺序存储适用于不经常变
11、动(不经常进行插入和删除运算)的情况。,第1章 数据结构与算法,第22页,2018年9月6日7时56分,例题:,长度为n的顺序存储线性表中,当在任何位置上插入一个元素概率都相等时,插入一个元素所需要移动元素的平均个数为_。答案:n/2,第1章 数据结构与算法,第23页,2018年9月6日7时56分,1.4 栈和队列, 栈的定义, 栈的特点,栈中元素的变化是按后进先出原则进行,因此又称栈为后进先出(Last In First Out,简称LIFO)表 。,栈是限定只能在表的一端进行插入和删除运算的线性表。,1.4.1 栈及其基本运算,1.什么是栈,第1章 数据结构与算法,第24页,2018年9月
12、6日7时56分, 栈的术语, 栈顶:允许进行插入和删除的一端。 栈底:与栈顶相对的一端。 入栈:向栈顶插入一个元素。 退栈:从栈顶删除一个元素。,Bottom,2. 栈的顺序存储及其运算,Top,第1章 数据结构与算法,第25页,2018年9月6日7时56分,以顺序方式存储的栈称为顺序栈。顺序栈可以用一维数组实现。需要一个整型变量top指示当前栈顶位置 。,top=0表示栈空 top=max 表示栈满,第1章 数据结构与算法,第26页,2018年9月6日7时56分, 栈的基本运算,入栈(Top加1) top=top+1退栈(Top减1) top=top-1读栈顶元素(并不是删除栈顶元素),to
13、p指针未变。置栈空(Top=0),第1章 数据结构与算法,第27页,2018年9月6日7时56分,讨论:,栈的入栈和出栈操作可以穿插进行,所以对应于相同的入栈序列其出栈序列可以有多种。,第1章 数据结构与算法,第28页,2018年9月6日7时56分,例题:,按“先进后出”原则组织数据的数据结构是_。 如果进栈序列为e1,e2,e3,e4,则可能的出栈序列是 e3,e1,e4,e2 e2,e4,e3,e1 e3,e4,e1,e2 任意顺序 栈底至栈顶依次存放元素A,B,C,D,在第五个元素E入栈前,栈中元素可以出栈,则出栈序列可能是 ABCED B)DCBEA C)DBCEA D)CDABE,栈
14、,正确,正确,第1章 数据结构与算法,第29页,2018年9月6日7时56分,12.4 队列的概念(1),1.队列的定义,2. 队列的特点,队中列元素的变化是按先进先出原则进行,因此又称队为先进先出(First In First Out,简称FIFO)表 。,队列是限定只能在表的一端进行插入,而在另一端进行删除的线性表。,第1章 数据结构与算法,第30页,2018年9月6日7时56分,3.队列的术语,4. 队列的基本运算, 队头:允许进行删除的一端。 队尾:允许进行插入的一端。 入队:向队尾插入一个元素。 出队:从队头删除一个元素。,入队、出队、判队空、取队头元素、置队空等。,队列的概念(2)
15、,第1章 数据结构与算法,第31页,2018年9月6日7时56分,以顺序方式存储的队称为顺序队。顺序队可以用一维数组实现。,顺序队列(1),设置整型变量 front(队头指示器)指示当前队头,设置整型变量 rear(队尾指示器) 指示将要入队元素所在的位置 。顺序队列会出现假溢出问题,即存储队列的空间中还有空余,但不能进行入队操作,它是由队列的操作方式决定的 。,第1章 数据结构与算法,第32页,2018年9月6日7时56分,顺序队列(2),讨论:解决假溢出问题的三种方法。,1) 建立一个足够大的存储空间,但这样会造成空间的浪费。,2)采用平移元素的方法。每当出现“假溢出”时,将队列中所有元素
16、平移,使当前队头元素位于数组的最前端,并修改队头和队尾指示器。此方法效率很低。,3)采用循环队列方式。把存储队列的一维空间看成是一个首尾相接的圆环,这样就可以实现对由于元素出队而空出来的空间的循环使用。,第1章 数据结构与算法,第33页,2018年9月6日7时56分,第1章 数据结构与算法,第34页,2018年9月6日7时56分,第1章 数据结构与算法,第35页,2018年9月6日7时56分,讨论:,在实现循环顺序队列时,可以增加一个标志s, 可以利用s的值判断“队空”和“队满”:s=0 表示队空; s=1表示队满。,队空时: s=0 , front=rear,循环顺序队列,队满时: s=1
17、, front=rear,队列长度:(m+rear-front)%m,第1章 数据结构与算法,第36页,2018年9月6日7时56分,例题:,当循环队列非空且队尾指针等于队头指针时,说明循环队列已满,不能进行入队运算,这种情况称为_。下列关于队列的叙述中正确的是 在队列中只能插入数据 在队列中只能删除数据 队列是先进先出的线性表 队列是先进后出的线性表,上溢,正确,第1章 数据结构与算法,第37页,2018年9月6日7时56分,1.5 线性链表,逻辑上相邻的元素在物理位置上未必相邻,元素间的逻辑关系由附加的指针域表示。,例:链表(链接方式存储的线性结构),链接方式存储,第1章 数据结构与算法,
18、第38页,2018年9月6日7时56分, 线性表的链接存储结构(链表),以链接方式存储的线性表称为链表。 常用的链表形式有单链表、循环链表和双链表等 。, 单链表的一般形式:, 单链表中结点的一般形式:,讨论:在一般形式的单链表中进行插入、删除操作时,必须针对不同的情况采取不同的处理方法,这为编写程序带来一定的难度和潜在的危险。,第1章 数据结构与算法,第39页,2018年9月6日7时56分,带头结点的单链表, 空表:, 带头结点的单链表中的一般形式:,讨论:在带头结点的单链表中进行插入、删除操作时,无须考虑特殊情况。,第1章 数据结构与算法,第40页,2018年9月6日7时56分,线性链表的
19、插入, 点击鼠标演示, x,第1章 数据结构与算法,第41页,2018年9月6日7时56分, 点击鼠标演示,释放,线性链表的删除,第1章 数据结构与算法,第42页,2018年9月6日7时56分,其他形式的链表(1),单循环链表,9.2 线性表,设置尾指针的单循环链表,第1章 数据结构与算法,第43页,2018年9月6日7时56分,其他形式的链表(2),双链表,9.2 线性表,双循环链表,第1章 数据结构与算法,第44页,2018年9月6日7时56分,例题:,数据结构分为逻辑结构与存储结构,线性链表属于_。 数据结构中,与所使用的计算机无关的是数据的 存储结构 B) 物理结构 C) 逻辑结构 D
20、) 物理和存储结构 线性表的顺序存储结构和线性表的链式存储结构分别是 顺序存取的存储结构、顺序存取的存储结构 随机存取的存储结构、顺序存取的存储结构 随机存取的存储结构、随机存取的存储结构 任意存取的存储结构、任意存取的存储结构,存储结构,正确,正确,第1章 数据结构与算法,第45页,2018年9月6日7时56分,1.6 树与二叉树,1. 树的特点,2. 树的定义,树是n(n0)个数据元素的有限集合。它满足以下两个条件:有且仅有一个特定的称为根的元素;其余元素分为()个互不相交的有限集合1、2、,其中每个集合又都是一棵树并称其为根的子树。,树形结构是一类非常重要的非线性结构,适合于描述数据元素
21、之间的层次关系。,1.6.1 树的基本概念,第1章 数据结构与算法,第46页,2018年9月6日7时56分,树的常用术语, 双亲、子女、边:若结点y是结点x的一棵子树的根,则x称做y的“双亲” y称做x的“子女”;有序对 称做从x到y的“边” 。 兄弟:具有同一双亲的结点 。 路径、路径长度:若树中存在着一个结点的序列12j,使ki是ki+1(1ij)的双亲,则称该结点序列为从k1到kj的一条路径;路径长度等于j-1,它是该路径所经过的边的数目 。 结点的层数:根结点层数为1,其余结点层数等于其双亲结点层数加1。 树的深度(高度):即树中层数最大的结点的层数 。 结点的度数、树的度数:一个结点
22、子女的个数称为该结点的“度数”。 树中度数最大的结点的度数叫做“树的度数” 。 树叶、分支结点:度数为0的结点叫做“树叶” ;度数大于0的结点叫做“分支结点”或“内结点” 。,第1章 数据结构与算法,第47页,2018年9月6日7时56分,树的常用术语举例, 是的双亲,是的子女,是从到的边。、互为兄弟,而和不是兄弟 。ADIN是从结点到结点的一条路径,其长度为 。 层数为 的结点有,层数为的结点有、 。 树的深度为4 。 、的度数分别为、;树的度数为 。 、都是树叶,其余结点都是分支结点 。,森 林,第1章 数据结构与算法,第48页,2018年9月6日7时56分,1.6.2 二叉树及其基本性质
23、,二叉树是n(n0)个结点的有限集合。它或者是空集(n0),或者由一个根结点及两棵互不相交的、分别称为这个根的左子树和右子树的二叉树组成。,1.什么是二叉树,二叉树五种基本形态, 二叉树最多有两个子树,且子树有左、右之分,而树的子树不分左右。 二叉树可以是空,而树不能为空。,树和二叉树的差别,第1章 数据结构与算法,第49页,2018年9月6日7时56分,二叉树的性质,性质 二叉树第 i 层上的结点数目最多为2k-1(K1)。 性质 深度为m的二叉树至多有2m-1个结点(k)。 性质 在任意一棵二叉树中,度数为0的结点的个数总比度为2的结点多一个。,2. 二叉树的性质,3. 两种特殊的二叉树:
24、满二叉树与完全二叉树,满二叉树 完全二叉树,第1章 数据结构与算法,第50页,2018年9月6日7时56分,性质4 具有n 个结点的完全二叉树的深度为 log2n 性质5 若对一棵有n个结点的完全二叉树,按自顶向下、同层由左到右顺序依次为其每个结点从1开始编号,则对编号为 k的结点 (1kn)则有: 若 k=1,则该结点是根结点。若 k1,则 ki 双亲结点的编号为INT(k/2) 若 2kn ,则该结点左子女结点的编号是2k,否则 该结点无左子女。 若 2k+1n ,则该结点右子女结点的编号为2k+1,否则该结点无右子女。,(二叉树中的结点数n=12),第1章 数据结构与算法,第51页,20
25、18年9月6日7时56分,1.6.3 二叉树的存储结构,对完全二叉树,利用性质5,将其所有结点按编号顺序依次存储在一维数组里。对一般二叉树,需要加上一些并不存在的“虚结点”,转换为完全二叉树的形式。,1. 顺序存储结构,第1章 数据结构与算法,第52页,2018年9月6日7时56分,二叉树的存储结构,链接存储时结点的结构,第1章 数据结构与算法,第53页,2018年9月6日7时56分,1.6.4 二叉树的遍历,先序遍历 访问根结点,先序遍历左子树,先序遍历右子树。 中序遍历 中序遍历左子树,访问根结点,中序遍历右子树。 后序遍历 后序遍历左子树,后序遍历右子树,访问根结点。 层次遍历 按层数由
26、小到大、同一层从左到右顺序依次访问二叉树的各个结点。,先序访问序列 :ABDGECF 中序访问序列 :DGBEAFC 后序访问序列 :GDEBFCA 层次访问序列 :ABCDEFG,举例:,第1章 数据结构与算法,第54页,2018年9月6日7时56分,例题:,某二叉树中度为2的结点有18个,则该二叉树中有_个叶结点。 某二叉树中度为2的结点有n个,则该二叉树中有_个叶结点。 在树型结构中,树根结点没有_。 在深度为5的满二叉树中,叶子结点的个数为A)32 B)31 C) 16 D) 15 若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访
27、问顺序是A)bdgcefha B)gdbecfha C)bdgaechf D)gdbehfca 具有3个结点的二叉树有A)2种形态 B)4种形态 C)7种形态 D) 5种形态,19,n+1,前件,第1章 数据结构与算法,第55页,2018年9月6日7时56分,1.7 查找技术,1.7.1 顺序查找,基本方法:从线性表的第一个元素开始,依次将线性表中的元素与被查找元素进行比较。若相等,则查找成功;如果找遍全表也没有发现满足条件的元素,则查找失败。, 要求: 查找表必须采用线性表。,第1章 数据结构与算法,第56页,2018年9月6日7时56分,例题:,长度为n的顺序存储线性表中,当在任何位置上插
28、入一个元素概率都相等时,插入一个元素所需要移动元素的平均个数为_。答案:n/2,第1章 数据结构与算法,第57页,2018年9月6日7时56分,在长度为64的有序线性表中进行顺序查找,最坏情况下需要比较的次数为A)63 B)64 C)6 D)7,例题:,第1章 数据结构与算法,第58页,2018年9月6日7时56分,1.7.2 二分查找, 二分查找的必要条件: 1) 必须是以顺序方式存储的线性表; 2) 线性表中所有数据元素必须从小到大有序排列。, 基本方法:将给定值与处于顺序表“中间位置”上的元素进行比较,若相等则查找成功,若给定值大于中间位置上的元素则在表的后半部分继续进行二分查找,否则在
29、表的前半部分继续进行二分查找。如此进行下去直至找到满足条件的元素,或当前查找区为空,此时查找失败。,第1章 数据结构与算法,第59页,2018年9月6日7时56分,第1章 数据结构与算法,第60页,2018年9月6日7时56分,1.8 排序技术,1. 冒泡排序:,设待排序的元素序列为S=e0, e1, , en-1,要求按升序排列。,基本思想: 从待排序记录集的一端(这里假定为低端)对相邻的两个元素(e0和e1,e1和e2,en-2和en-1)依次比较它们的排序码,若不符合排序的顺序要求,就将相应的两个元素互换,此过程称为一趟冒泡排序,最多经过n-1趟冒泡排序,排序工作即可完成。,每趟排序的结
30、果是将待排序记录集中排序码最大的元素交换到待排序记录集最后一个元素的位置。假设在一趟冒泡排序时,从ej+1以后没有发生元素的互换,则说明ej+1以后的元素是已经排好序的,下面只需要在e0到ej范围内进行新一趟的冒泡排序,即待排序记录集是从e0到ej,下一趟只需从e0到ej范围内进行。,第1章 数据结构与算法,第61页,2018年9月6日7时56分,例题:,排序是程序设计中的一种重要操作,常见的排序方法有插入排序、_排序和选择排序对长度为n的线性表排序,最坏的情况下,比较次数不是n(n-1)/2的排序方法是A)快速排序 B) 冒泡排序 C)直接插入排序 D) 堆排序假设线性表长度为n,则在最坏的
31、情况下,冒泡排序需要的比较次数为A) log2n B)n2 C) O(n1.5) D) n(n-1)/2说明:最常见的排序有插入排序(简单插入、希尔排序)、交换排序(冒泡排序、快速排序)和选择排序(简单选择、堆排序) 。假设线性表的长度为n,则在最坏的情况下: 冒泡排序需要比较的次数为: n(n-1)/2 插入排序需要比较的次数为: n(n-1)/2 希尔插入排序需要比较的次数为: O(n1.5) 堆排序需要比较的次数为: O(nlog2n),交换排序,第1章 数据结构与算法,第62页,2018年9月6日7时56分,查找: 对长度为n的无序表,不论是顺序表还是链表都只能顺序查找。平均比较次数为n/2次;在最坏情况下的比较次数为n次。 对长度为n的有序顺序表,采用二分查找,在最坏情况下的比较次数为O(nlog2n)次。,2018年9月6日7时56分,数据结构与算法,第63页,第1章结束,