2022年数据结构与算法总结 .pdf
第一章 数据结构与算法一. 算法的基本概念计算机解题的过程实际上是在实施某种算法,这种算法称为计算机算法。1. 算法的基本特征:可行性,确定性,有穷性,拥有足够的情报。2. 算法的基本要素:算法中对数据的运算和操作、算法的控制结构。3. 算法设计的基本方法:列举法、归纳法、递推、递归、减半递推技术、回溯法。4. 算法设计的要求:正确性、可读性、健壮性、效率与低存储量需求二. 算法的复杂度1. 算法的时间复杂度:指执行算法所需要的计算工作量2. 算法的空间复杂度:执行这个算法所需要的内存空间三. 数据结构的定义1. 数据的逻辑结构: 反映数据元素之间的关系的数据元素集合的表示。数据的逻辑结构包括集合、线形结构、树形结构和图形结构四种。2. 数据的存储结构:数据的逻辑结构在计算机存储空间种的存放形式称为数据的存储结构。常用的存储结构有顺序、链接、索引等存储结构。四. 数据结构的图形表示:在数据结构中, 没有前件的结点称为根结点;没有后件的结点成为终端结点。插入和删除是对数据结构的两种基本运算。还有查找、分类、合并、分解、复制和修改等。五. 线性结构和非线性结构根据数据结构中各数据元素之间前后件关系的复杂程度,一般将数据结构分为两大类型:线性结构和非线性结构。线性结构:非空数据结构满足:有且只有一个根结点;每个结点最多有一个前件,最多只有一个后件。非线性结构:如果一个数据结构不是线性结构,称之为非线性结构。常见的线性结构:线性表、栈、队列六. 线性表的定义线 性表是 n 个元素构成的有限序列( A1,A2,A3, )。表中的每一个数据元素,除了第一个以外,有且只有一个前件。除了最后一个以外有且只有一个后件。即线性表是一个空表,或可以表示为( a1,a2,an), 其中 ai(I=1,2,n)是属于数据对象的元素,通常也称其为线性表中的一个结点。非空线性表有如下一些特征:(1)有且只有一个根结点a1, 它无前件;(2)有且只有一个终端结点an,它无后件;(3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。线性表中结点的个数n 称为线性表的长度。当n=0时称为空表。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - 七. 线性表的顺序存储结构线性表的顺序表指的是用一组地址连续的存储单元依次存储线性表的数据元素。线性表的顺序存储结构具备如下两个基本特征:1. 线性表中的所有元素所占的存储空间是连续的;2. 线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。即线性表逻辑上相邻、 物理也相邻, 则已知第一个元素首地址和每个元素所占字节数,则可求出任一个元素首地址。假设线性表的每个元素需占用K个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。 则线性表中第 i+1 个数据元素的存储位置LOC(ai+1)和第 i 个数据元素的存储位置 LOC(ai) 之间满足下列关系 : LOC(ai+1)=LOC(ai)+K LOC(ai)=LOC(a1)+(i-1)*K 其中,LOC(a1)是线性表的第一个数据元素a1 的存储位置, 通常称做线性表的起始位置或基地址。因为在顺序存储结构中, 每个数据元素地址可以通过公式计算得到,所以线性表的顺序存储结构是随机存取的存储结构。在线性表的顺序存储结构下,可以对线性表做以下运算:插入、删除、查找、排序、分解、合并、复制、逆转八. 顺序表的插入运算线性表的插入运算是指在表的第I 个位置上,插入一个新结点x,使长度为 n 的线性表(a1,a2 ,ai,an)变成长度为n+1的线性表 (a1,a2,x,ai,an).该算法的时间主要花费在循环的结点后移语句上,执行次数是 n-I+1 。 当 I=n+1, 最好情况,时间复杂度 o(1) 当 I=1, 最坏情况,时间复杂度o(n) 算法的平均时间复杂度为o(n) 九. 顺序表的删除运算线性表的删除运算是指在表的第I 个位置上,删除一个新结点x,使长度为 n 的线性表(a1,a2 ,ai,an)变成长度为n-1 的线性表 (a1,a2,ai- 1,ai+1,an).当I=n, 时间复杂度o(1), 当 I=1, 时间复杂度 o(n) ,平均时间复杂度为o(n) 十. 栈及其基本运算1. 什么是栈?栈实际上也是一个线性表, 只不过是一种特殊的线性表。 栈是只能在表的一端进行插入和删除运算的线性表,通常称插入、删除这一端为栈顶(TOP ),另一端为 栈底(BOTTOM)。当表中没有元素时称为空栈。栈顶元素总是后被插入的元素,从而也是最先被删除的元素;栈底元素总是最先被插入的元素,从而也是最后才能被删除的元素。假设栈 S=(a1,a2,a3,an),则a1 称为栈底元素, an 称为栈顶元素。栈中元素按a1,a2,a3,an的次序进栈,退栈的第一个元素应该是栈顶元素。即后进先出。2. 栈的顺序存储及其运算用 S(1:M )作为栈的顺序存储空间。M为栈的最大容量。栈的基本运算有三种:入栈、退栈与读栈顶元素。入栈运算:在栈顶位置插入一个新元素。首先将栈顶指针进一( TOP+1 ),然后将新元素插入到栈顶指针指向的位置。退栈运算:指取出栈顶元素并赋给一个指定的变量。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 6 页 - - - - - - - - - 首先将栈顶元素赋给一个指定的变量,然后将栈顶指针退一(TOP-1 )读栈顶元素:将栈顶元素赋给一个指定的变量。栈顶指针不会改变。十一. 队列及其基本运算1. 什么是队列队列是只允许在一端删除, 在另一端插入的顺序表, 允许删除的一端叫做对头, 允许插入的一端叫做对尾。队列的修改是先进先出。 往队尾插入一个元素成为入队运算。从对头删除一个元素称为退队运算。2. 循环队列及其运算在 实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间。在循环队列中,用队尾指针 rear 指向队列中的队尾元素,用排头指针front指向排头元素的前一个位置,因此,从排头指针 front指向的后一个位置直到队尾指针 rear指向的位置之间所有的元素均为队列中的元素。在实际使用循环队列时,为了能区分队满还是队列空,通常需要增加一个标志S:队列空,则 S=0,rear=front=m队列满,则 S=1,rear=front=m循环队列主要有两种基本运算:入队运算和退队运算n 入队运算指在循环队列的队尾加入一个新元素,首先rear=rear+1,当rear=m+1 时,置 rear=1, 然后将新元素插入到队尾指针指向的位置。当 S=1,rear=front,说明队列已满,不能进行入队运算,称为“上溢”。n 退队运算指在循环队列的排头位置退出一个元素并赋给指定的变量。首先 front=front+1,并当 front=m+1时,置 front=1,然后将排头指针指向的元素赋给指定的变量。当循环队列为空 S=0,不能进行退队运算,这种情况成为“下溢”。十二. 线性单链表的结构及其基本运算1. 线性单链表的基本概念一 组任意的存储单元存储线性表的数据元素,因此,为了表示每个数据元素ai 与其直接后继数据元素 ai+1 之间的逻辑关系,对数据元素ai 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai 的存储映象,成为结点。它包括两个域:其中存储数据元素信息的域称为数据域,存储直接后继存储位置的域称为指针域。指针域中存储的信息称做指针或链。N个结点链结成一个链表,即为线性表 (a1, a2,an)的链式存储结构。又由于此链表的每个结点中只包含一个指针域,故又称线性链表或单链表。有时,我们在单链表的第一个结点之前附设一个结点,称之为头结点, 它指向表中第一个结点。头结点的数据域可以不存储任何信息,也可存储如线性表的长度等类的附加信息,头结点的指针域存储指向第一个结点的指针(即第一个元素结点的存储位置)。在单链表中, 取得第 I 个数据元素必须从头指针出发寻找,因此,单链表是非随机存取的存储结构链表的形式:单向,双向2. 线性单链表的存储结构3 带链3. 带列的栈与队列栈也是线性表,也可以采用链式存储结构。队列也是线性表,也可以采用链式存储结构。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - 十三. 线性链表的基本运算1. 线性链表的插入2. 线性链表的删除十四. 双向链表的结构及其基本运算在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱。十五. 循环链表的结构及其基本运算是另一种形式的链式存储结构, 它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。因此,从表中任一结点出发均可找到表中其他结点。十六. 树的定义树是一种简单的非线性结构。树型结构的特点:1. 每个结点只有一个前件,称为父结点,没有前件的结点只有一个,称为树的根结点。2. 每一个结点可以有多个后件结点,称为该结点的子结点。 没有后件的结点称为叶子结点3. 一个结点所拥有的后件个数称为树的结点度4. 树的最大层次称为树的深度。十七. 二叉树的定义及其基本性质1. 二叉树是另一种树型结构, 它的特点是每个结点至多只有二棵子树(即二叉树中不存在度大于 2 的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。2. 二叉树的基本性质在二叉树的第 I 层上至多有 2i-1 个结点。深度为 k 的二叉树至多有 2k-1 个结点 (k=1) 在任意一个二叉树中,度为0 的结点总是比度为2 的结点多一个;具有 n 个结点的二叉树,其深度至少为log2n+1 。一棵深度为 k 且有 2k-1 个结点的二叉树称为满二叉树。这种树的特点是每一层上的结点数都是最大结点数。3. 满二叉树与完全二叉树满二叉树:除最后一层以外,每一层上的所有结点都有两个子结点。在满二叉树的第K层上有 2K-1 个结点,且深度为 M的满二叉树右 2M-1个结点完全二叉树: 除最后一层以外, 每一层上的结点数均达到最大值; 在最后一层上只缺少右边的若干结点。具有 N个结点的完全二叉树的深度为 log2n+1完全二叉树总结点数为N,若 N为奇数,则叶子结点数为 (N+1 )/2 若N为偶数,则叶子结点数为N/2 4. 二叉树的存储结构二叉树通常采用链式存储结构二叉树具有下列重要特性:性质 1 在二叉树的第 i 层上至多有 2i-1个结点(i 1)。利用归纳法容易证得此性质。 i=1 时,只有一个根结点。显然, 2i-1=20=1是对的。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - - - - - - - 现在假定对所有的j ,1ji ,命题成立,即第j 层上至多有 2j-1个结点。那么,可以证明 j=i时命题也成立。由归纳假设:第 i-1 层上至多有 2i-2个结点。由于二叉树的每个结点的度至多为 2 ,故在第 i 层上的最大结点数为第i-1 层上的最大结点数的2 倍,即 2*2i-2=2i-1。性质 2 深度为 k 的二叉树至多有2k-1 个结点, (k 1)。由性质 1 可见,深度为 k 的二叉树的最大结点数为k k (第 i 层上的最大结点数 ) = 2i-1=2k -1 i=1 i=1 性质 3 对任何一棵二叉树T,如果其终端结点数为n0,度为 2 的结点数为 n2,则n0=n2+1。设 n1 为二叉树 T 中度为 1 的结点数。因为二叉树中所有结点的度均小于或等于2所以其结点总数为n=n0+n1+n2 (61)再看二叉树中的分支数。除了根结点外,其余结点都有一个分支进入,设B为分支总数,则 n=B+1 。由于这些分支是由度为1 或 2 的结点射出的,所以又有B=n1+ 2n2。n=n1+2*n2+1 (6 2)于是得由式 (6 1)和(62) 得 n0=n2+1 十八. 二叉树的遍历就是遵从某种次序, 访问二叉树中的所有结点, 使得每个结点仅被访问一次。 一般先左后右。1. 前序遍历 DLR 首先访问根结点,然后遍历左子树,最后遍历右子树。2. 中序遍历 LDR 首先遍历左子树,然后根结点,最后右子树3. 后序遍历 LRD 首先遍历左子树,然后遍历右子树,最后访问根结点。十九. 顺序查找与二分查找1. 顺序查找在两种情况下只能用顺序查找:线性表为无序表、链式存储结构的有序表2. 二分查找只适用于顺序存储的有序表(从小到大)。对于长度为 N的有序线性表, 在最坏情况下, 二分查找只需要比较log2N 次,而顺序查找要比较 N次。 排序:指将一个无序序列整理成按值非递减顺序排列的有序序列。二十. 交换类排序法冒泡排序与快速排序法属于交换类的排序方法1. 冒泡排序法假设线性表的长度为N ,则在最坏的情况下,冒跑排序需要经过N/2 遍的从前往后的扫描和N/2 遍的从后往前的扫描,需要的比较次数为N(N-1)/2 2. 快速排序法二十一 . 选择类排序法 1. 简单选择排序法 2. 堆排序法二十三 . 插入类排序法 1. 简单插入排序法 2. 希尔排序法名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 最坏情况下最好情况下说明交换排序冒泡排序 n(n-1)/2 最简单的交换排序。在待排序的元素序列基本有序的前提下,效率最高快速排序 n(n-1)/2 O(Nlog2 N) 插入排序简单插入排序 n(n-1)/2 每个元素距其最终位置不远时适用希尔排序 O(n1.5) 选择排序简单选择排序 n(n-1)/2 堆排序 O(nlog2n) 适用于较大规模的线性表名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -