C语言算法与数据结构.ppt
第十二章 算法与数据结构12.1 算法的基本概念,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解。历次试题分值在04分之间波动。,12.1.1 考点1 算法的定义,算法是对一个问题求解步骤的一种描述,是求解问题的方法,它是指令的有限序列,其中每条指令表示一个或者多个操作。一般来说,一个算法具有以下5个主要特性。 有穷性一个算法(对任何合法的输入)在执行有穷步后能够结束,并且在有限的时间内完成。 确定性算法中的每一步都有确切的含义。 可行性算法中的操作能够用已经实现的基本运算执行有限次来实现。 输入一个算法有零个或者多个输入,零个输入就是算法本身确定了初始条件。 输出一个算法有一个或者多个输出,以反映出数据加工的结果。,12.1.2 考点2算法复杂度,算法复杂度包括时间复杂度和空间复杂度,是衡量一个算法好坏的度量。 1、时间复杂度基本操作重复执行的次数的阶数 Tnofn 2、空间复杂度是算法所需空间的度量。 G(n) Ofn,例1NXN矩阵相乘 fori1;in;i forj1;jn;j cij0; fork1;kn;k cijcijaik*bkj; ,12.2 数据结构的定义,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查数据的逻辑结构和存储结构。历次试题分值在04分之间波动。,12.2.1考点1什么是数据结构,一、基本概念和术语 数据(data所有能输入到计算机中去的描述客观事物的符号 数据元素(data element)数据的基本单位,也称节点(node)或记录(record) 数据项(data item)有独立含义的数据最小单位,也称域field 数据结构(data structure数据元素和数据元素关系的集合,数据的逻辑结构只抽象反映数据元素的逻辑关系 数据的存储(物理)结构数据的逻辑结构在计算机存储器中的实现 存储结构分为 顺序存储结构借助元素在存储器中的相对位置来表示数据元素间的逻辑关系 链式存储结构借助指示元素存储地址的指针表示数据元素间的逻辑关系,1536,元素21400,元素11346,元素3,元素41345,h,链式存储h,12.2.2考点2数据结构的图形表示,根据数据元素之间关系的不同,通常有4种结构集合、线性结构、树型结构和图状结构。,12.3线性表,线性表一般和其他知识点结合起来出题。在每次所考的数据结构、栈、队列、链表、查找、排序等试题中,均涉及线性表的概念。,12.3.1考点1线性表,一、线性结构特点在数据元素的非空有限集中 存在唯一的一个被称作“第一个”的数据元素 存在唯一的一个被称作“最后一个”的数据元素 除第一个外,集合中的每个数据元素均只有一个前驱 除最后一个外,集合中的每个数据元素均只有一个后继,二、线性表的逻辑结构 定义一个线性表是n个数据元素的有限序列,例 英文字母表(A,B,C,Z是一个线性表,特征 元素个数n表长度,n0空表 1in时 ai的直接前驱是ai-1,a1无直接前驱 ai的直接后继是ai1,an无直接后继,12.3.2考点2线性表的顺序存储结构 它用一组地址连续的存储单元来存储线性表的元素。 线性表中第i1个元素的存储位置locai1和第i个元素的存储位置loc(ai)满足以下关系 Locai1locaiS其中 S一个元素占用的存储单元个数 LOCai线性表第i个元素的地址 特点 实现逻辑上相邻物理地址相邻 实现随机存取 实现可用C语言的一维数组实现,12.3.2考点2线性表的顺序存储结构,线性表的第i个元素的存储位置为 Locailoca1i-1s 其中,loca1表示第1个数据元素的存储位置,一般被称为线性表的基地址。,12.3.3考点3线性表的插入和删除操作,线性表的插入操作是指在线性表的第i个元素与第i1个元素之间插入一个新的数据元素a,使长度为n的线性表 (a1,ai,ai1an) 变成长度为n1的线性表 (a1,ai,a,ai1an) 算法时间复杂度Tn 在长度为n的线性表中插入一个元素时,所需移动的元素的平均次数为n/2,12.3.3考点3线性表的插入和删除操作,删除操作是在线性表中删除一个元素ai,使长度为n的线性表 (a1,ai,ai1an) 变成长度为n-1的线性表 (a1,ai-1,ai1an) 算法时间复杂度Tn 在长度为n的线性表中删除一个元素所需移动的元素的平均次数为n-1/2,12.4栈,该节知识点所占试题比重为12,属于重点考查对象,基本上每次必考,主要考查栈的定义、存储结构及基本运算。历次试题分值在02分之间波动。,12.4.1 考点1什么是栈,栈是限定仅在表尾进行插入和删除操作的线性表。 允许插入和删除的一端叫做栈顶,另一端叫做栈底。 不含有元素的栈叫做空栈。,12.4.2 考点2栈的顺序存储结构,栈的顺序存储结构是利用一组连续地址的存储单元来存储从栈底到栈顶的数据元素,同时附设一个指针top指示栈顶元素在顺序栈中的位置,一个指针base指示栈底元素的位置。,12.4.3 考点3栈的插入和删除运算,栈的插入和删除运算只能在栈顶进行。,12.5队列,该节知识点占试题比重为12,属于一般考查对象,主要考查队列的定义、存储结构及基本运算。从历次试题来看,队列还没有单独出过试题,一般以和其他知识点结合起来的试题形式出现。历次试题分值在02分之间波动。,12.5.1 考点1什么是队列,队列是限定了插入和删除操作的线性表。它只允许在表的一端进行插入操作,而在另外一端进行删除操作。队列中,允许插入元素的一端称为队尾,允许删除元素的一端称为队头。,12.5.2 考点2队列的顺序存储结构,与顺序栈类似,队列的顺序存储结构是利用一组连续地址的存储单元来存储从队头到队尾的数据元素,同时附设一个指针front指示队头元素在队列中的位置,一个指针rear指示队尾元素的位置。当插入新的队列元素时,rear增1;当删除队头元素时,front增1。,12.5.3 考点3队列的插入和删除运算,队列只允许在表的一端进行插入,而在表的另外一端进行删除,和我们生活中的队列一样是按照先进先出的原则,所以队列又称为先进先出的线性表。,12.6 线性单链表、双向链表与循环链表,该节知识点占试题比重为3,属于非重点考查对象,主要考查线性单链表、双向链表与循环链表的结构及基本运算。,12.7树,该节知识点所占试题比重为31,属于重点考查对象,每次必考,主要考查二叉树的定义、存储结构及3种遍历算法。,12.7.1 考点1树的定义,树型结构是一类重要的非线性数据结构。 树是n(n0)个结点的有限集。在任意一棵非空树中有且仅有一个特定的称为根的结点;当n1时,其余结点可分为m(m0)个互不相交的有限集T1,T2Tm,其中每一个集合本身又是一棵树,称为子树。,第六章 树和二叉树,树是一类重要的非线性数据结构,以分支关系描述数据元素之间的层次结构 6.1 树 定义树tree是nn 0个结点的有限集合T,其中 有且仅有一个特殊的结点,称为树的根结点root 当n1时,除根结点之外的其余结点可分为mm0个互不相交的有限集合T1,T2,Tm,其中每一个集合本身又是一棵树,称为根的子树subtree 特点 树中至少有一个结点根结点 树中各子树是互不相交的集合根,子树T1B,E,F,K,LT2C,GT3D,H,I.J.M,TA,TA,B,C,D,M,树的特点 1.树的根结点没有前驱结点,除根之外的所有结点都有且只有一个前驱结点; 2.树中所有的结点可以有0个或多个后继结点。 下图所示结构均不是树结构,基本术语 结点node表示树中的数据元素,包括数据项及若干指向其子树的分支 结点的度degree结点拥有的子树个数 树的度树中所有结点的度的最大值 叶子leaf结点度为0的结点 分支结点除叶子结点外的所有结点 孩子child结点子树的根称为该结点的孩子 双亲parents孩子结点的上层结点叫该结点的双亲,基本术语 兄弟sibling具有同一双亲的孩子结点 结点的层次level从根结点算起,根为第一层,它的孩子为第二层 深度depth树中结点的最大层次数 有序树树中各结点的子树按照从左到右的次序安排 无序树与上一情况相反 森林forestmm0棵互不相交的树的集合,结点A的度3 结点B的度2 结点M的度0,叶子K,L,F,G,M,I,J,结点A的孩子B,C,D 结点B的孩子E,F,结点I的双亲D 结点L的双亲E,结点B,C,D为兄弟 结点K,L为兄弟,树的度3,结点A的层次1 结点M的层次4,树的深度4,A,D,H是M的祖先 I是A,D的子孙,6.2 二叉树 定义 定义二叉树是nn0个结点的有限集,它或为空树n0,或由一个根结点和两棵分别称为左子树和右子树的互不相交的二叉树构成 特点 每个结点至多有二棵子树即不存在度大于2的结点 二叉树的子树有左、右之分,且其次序不能任意颠倒,基本形态,二叉树性质 性质1 在二叉树的第i层上至多有2i1结点 i2,i1时,只有一个根结点,2i1201是对的。 假设对所有j1ji命题成立,即第j层上至多有2j1个结点。那么,第i-1层至多有 2i2 个结点。 又二叉树每个结点的度至多为2 第i层上最大结点数是第i-1层的2倍,即22i22i1 故命题得证,证明用归纳法证明之,二叉树性质,证明由性质1,可得深度为k 的二叉树最大结点数是,性质2深度为k的二叉树至多有2k1 个结点k1,性质3对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0n21,证明n1为二叉树T中度为1的结点数 因为二叉树中所有结点的度均小于或等于2 所以其结点总数nn0n1n2 又二叉树中,除根结点外,其余结点都只有一个 分支进入 设B为分支总数,则nB1 又分支由度为1和度为2的结点发出, Bn12n2 于是,nB1n12n21n0n1n2 n0n21,几种特殊形式的二叉树 满二叉树 定义一棵深度为k且有2k1 个结点的二 叉,特点每一层上的结点数都是最大结点数树称为满二叉树。,几种特殊形式的二叉树,完全二叉树 定义深度为k,有n个结点的二叉树当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为 特点 叶子结点只可能在层次最大的两层上出现 对任一结点,若其右分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l 或l1,证明设所求完全二叉树的深度为k,由完全二叉树定义及性质2可得2k-1-1n2k-1 或 2k-1n2k 取对数后有k-1log2nk,即log2nklog2n1 又k必为整数, klog2n1,性质4 具有n个结点的完全二叉树的深度为,log2n1,性质5如果对一棵有n个结点的完全二叉树的结点按层序编号,则对任一结点i1in,有 1 如果i1,则结点i是二叉树的根,无双 亲;如果i1,则其双亲是i/2 2 如果2in,则结点i无左孩子;如果 2in,则其左孩子是2i 3 如果2i1n,则结点i无右孩子;如果 2i1n,则其右孩子是2i1,二叉树的存储结构 顺序存储结构 实现按满二叉树的结点层次编号,依次存放二叉树中的数据元素 特点 结点间关系蕴含在其存储位置中 浪费空间,适于存满二叉树和完全二叉树,链式存储结构 二叉链表,typedef struct node datatype data; struct node *lchild, *rchild; JD;,在n个结点的二叉链表中,有n1个空指针域,12.7.5 考点5二叉树的遍历,遍历按照一定次序访问树中的所有结点, 且每个结点仅被访问一次的过程。,遍历二叉树的方法 先序遍历先访问根结点,然后分别先序遍历左子树、右子树 中序遍历先中序遍历左子树,然后访问根结点,最后中序遍历右子树 后序遍历先后序遍历左、右子树,然后访问根结点 按层次遍历从上到下、从左到右访问各结点,D L R,先序遍历序列A B D C,先序遍历,若二叉树为空,遍历结束。否则 (1)访问根结点; (2)先序遍历根结点的左子树; (3)先序遍历根结点的右子树。,L D R,中序遍历序列B D A C,中序遍历若二叉树为空,遍历结束。否则 (1)中序遍历根结点的左子树; (2)访问根结点; (3)中序遍历根结点的右子树。,L R D,后序遍历序列 D B C A,后序遍历,若二叉树为空,遍历结束。否则 (1)后序遍历根结点的左子树; (2)后序遍历根结点的右子树; (3)访问根结点。,先序遍历,中序遍历,后序遍历,层次遍历,-,,a,*,b,-,c,d,/,e,f,-,,a,*,b,-,c,d,/,e,f,-,,a,*,b,-,c,d,/,e,f,-,,a,*,b,-,c,d,/,e,f,12.8 查找算法,该节知识点占试题比重为9,属于一般考查对象,主要考查顺序查找和二分查找。历次试题分值在02分之间波动。,12.8 查找算法,查找表由同一类型的数据元素(或记录)构成的集合 关键字是数据元素中某个数据项的值,它可以标识一个数据元素 查找也叫检索,是根据给定的某个值,在表中确定一个关键字等于给定值的记录或数据元素,12.8 查找算法,查找方法评价 时间复杂度 空间复杂度 平均查找长度ASLAverage Search Length为确定记录在表中的位置,需和给定值进行比较的关键字的个数的期望值叫查找算法的,12.8.1 考点1 顺序查找 查找过程从表的一端开始逐个进行记录的关键字和给定值的比较,64,监视哨,比较次数5,比较次数 查找第n个元素 1 查找第n-1个元素2 . 查找第1个元素 n 查找第i个元素 n1-i 查找失败 n1顺序查找方法的ASL12.8.2 考点2二分查找 查找过程每次将待查记录所在区间缩小一半 适用条件采用顺序存储结构的有序表 算法实现 设表长为n,low、high和mid分别指向待查元素所在区间的上界、下界和中点,k为给定值 初始时,令low1,highn,midlowhigh/2 让k与mid指向的记录比较 若krmid.key,查找成功 若krmid.key,则lowmid1 重复上述操作,直至lowhigh时,查找失败算法描述12.9排序算法,该节知识点所占试题比重为9,属于一般考查对象,主要考查交换类排序、选择类排序及插入类排序。从历次试题来看,以选择题和填空题的形式出现,分值有波动,如图2-28所示。,12.9.1 考点1排序概述,10.1概述 排序将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫 排序分类 按待排序记录所在位置 内部排序待排序记录存放在内存 外部排序排序过程中需对外存进行访问的排序 按排序依据原则 插入排序直接插入排序、折半插入排序、希尔排序 交换排序冒泡排序、快速排序 选择排序简单选择排序、堆排序 归并排序2-路归并排序 基数排序,12.9.2 考点2插入类排序,直接插入排序 基本思想顺序地把待排序列中的各个记录按其关键字的大小,插入到已排序序列中的适当位置 排序过程整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序 直接插入排序方法是稳定的。,例,49 38 65 97 76 13 27,i2 38 38 49 65 97 76 13 27,i3 65 38 49 65 97 76 13 27,i4 97 38 49 65 97 76 13 27,i5 76 38 49 65 76 97 13 27,i6 13 13 38 49 65 76 97 27,i1 ,i7 13 38 49 65 76 97 27,27,97,76,65,49,38,27,10.3 交换排序 起泡排序(Bubble Sort) 基本思想通过相邻元素之间的比较和交换,使关键字较小的元素逐渐从底部移向顶部。 排序过程 将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r1.keyr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟起泡排序,结果关键字最大的记录被安置在最后一个记录上 对前n-1个记录进行第二趟起泡排序,结果使关键字次大的记录被安置在第n-1个记录位置 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止,例,38,49,76,97,13,97,27,97,30,97,13,76,76,76,27,30,13,65,27,65,30,65,13,13,49,49,30,49,27,38,27,38,30,38,10.4 选择排序 基本思想不断从待排序列中选取关键字最小的记录放到已排序列的最后一个记录后面,直到序列中所有记录都已排序为止。 简单选择排序 排序过程 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束,例初始 49 38 65 97 76 13 27 ,i1,13,49,一趟 13 38 65 97 76 49 27 ,i2,27,38,六趟 13 27 38 49 65 76 97 ,排序结束 13 27 38 49 65 76 97,