数据结构.docx
- 文档编号:25478457
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:33
- 大小:131.89KB
数据结构.docx
《数据结构.docx》由会员分享,可在线阅读,更多相关《数据结构.docx(33页珍藏版)》请在冰豆网上搜索。
数据结构
第1章概述
1.概念和术语
数据:
是能输入到计算机中并能被计算机程序处理的符号的总称。
数据元素:
是数据的基本单位,它在计算机处理和程序设计中通常作为一个整体进行考虑和处理。
一个数据元素可由若干数据项组成。
数据对象:
是具有相同特征的数据元素的集合,是数据的一个子集。
数据结构:
是数据元素的组织形式,或数据元素相互之间存在一种或多种特定关系的集合。
数据的逻辑结构:
是指数据结构中数据元素之间的逻辑关系。
数据的存储结构:
是数据的逻辑结构在计算机内存中的存储方式,又称物理结构。
数据类型:
是一组具有相同性质的操作对象以及该组操作对象上的运算方法的集合。
抽象数据类型:
是指一个数学模型以及在该模型上定义的一套运算规则的集合。
算法:
建立在数据结构基础上的,为解决问题而采取的步骤和方法。
2.逻辑结构的四种基本形态
根据数据元素之间关系的不同特征,通常有下列四类基本结构:
(1)集合:
结构中的数据元素间除了“同属于一个集合”的关系外,别无其它关系。
(2)线性结构:
结构中的数据元素之间存在一个对一个的关系。
(3)树型结构:
结构中的数据元素之间存在一个对多个的关系。
(4)图型结构或网状结构:
结构中的数据元素之间存在多个对多个的关系。
3.数据存储结构的基本组织方式
数据存储结构有顺序和链式两种方式。
(1)顺序存储结构的特点:
要借助数据元素在存储器中的相应位置来体现数据元素相互间的逻辑关系,常用高级编程语言中的“一维数组”来描述或实现。
(2)链式存储结构的特点:
通过表示数据元素存储地址的指针来表示数据元素之间的逻辑关系,通常用链表来实现。
在顺序存储结构的基础上,又可延伸变化出另外两种存储结构,即索引存储和散列存储。
(1)索引存储就是在数据文件的基础上增加了一个索引表文件。
通过索引表建立索引,可以把一个顺序表分成几个顺序子表,其目的是在查询时提高查找效率,避免盲目查找。
(2)散列存储就是通过数据元素与存储地址之间建立起某种映射关系,使每个数据元素与每一个存储地址之间尽量达到一一对应的目的。
这样,查找时同样可大大提高效率。
4.数据结构的研究内容
数据结构的核心研究内容包括三个方面:
数据的逻辑结构、存储结构以及相应的基本操作运算的定义和实现。
5.算法的五个重要特征
(1)有穷性:
一个算法必须保证在执行有限步骤之后结束,而不是无限的。
(2)确定性:
算法中每一条指令必须有明确的含义,而不能是模棱两可的。
(3)可行性:
每一个操作步骤都必须在有限的时间内完成。
(4)输入:
一个算法可以有一个或多个输入,也可以没有输入。
(5)输出:
一个算法可以有一个或多个输出。
没有输出的算法是没有实际意义的。
6.算法的评价标准
(1)正确性。
(2)易读性。
(3)高效性。
(4)可维护性。
7.算法分析的目的
算法分析主要是指分析算法的效率。
算法效率的度量主要从两个方面:
算法的运行时间和算法所需的存储空间。
分析的目的是通过考察算法的时间和空间效率,以求改进算法或对不同的算法进行比较。
一般情况下,鉴于运算空间(内存)较为充足,所以把算法的时间复杂度分析作为重点。
8.算法的时间复杂度分析
(1)算法运算时间的度量的两种方法:
事后统计的方法和事前分析估算的方法。
(2)算法运行时间的分析规则
通常把一个程序的运行时间定义为一个T(n),其中n是该程序输入数据的规模,而不是某一个具体的输入。
T(n)的单位是不确定的,一般把它看成在一个特定计算机上执行的指令条数。
通常记作:
T(n)=O(f(n)),其中f(n)表示数据输入规模。
常见的算法时间复杂度的形式按性能降序的排列如下:
O
(1) ) ) ) ) ) 9.算法空间复杂度的含义 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。 算法在计算机存储器内占用的存储空间主要分为三部分: 算法源代码本身占用的存储空间;算法输入输出数据所占用的存储空间;算法运行过程中临时占用的存储空间。 考虑一个算法的空间复杂度时,要综合分析这三个方面的因素。 通常记作: S(n)=O(f(n)),其中n为问题的规模(或大小)。 第2、3章线性表、栈、队列 1.线性表的定义 线性表是n个数据元素的有限序列,其中n(n≥0)为线性表的长度。 线性表中各个元素的类型相同。 对于线性表(a1,a2,…,ai,…,an)而言,数据元素a1没有直接前趋,an没有直接后继,表中的其它元素ai(2≤i≤n-1)有且仅一个直接前趋ai-1和直接后继ai+1。 2.顺序表 顺序表是指线性表的顺序存储结构,即用一组连续的存储单元依次存放线性表的数据元素。 在C语言中可用一维数组来表示。 在顺序表中,以数据元素在计算机内“物理位置相邻”来表示表中数据元素间的逻辑关系。 顺序表是一种随机存储结构,只要确定了存储顺序表的起始位置,则表中任一元素都可以随机存取。 所以在顺序表中可以方便的进行数据元素的查找及存取。 但是在进行插入和删除操作时,将会引起元素的大量移动,因而效率比较低,并且易产生空间浪费或“上溢”现象。 顺序表的操作还应注意元素的存储位置,即数组下标(C语言中下标从0开始)。 3.链表 链表是线性表的链式存储结构。 链表是用一组任意的存储单元(可以是连续的,也可以是不连续的)存放线性表的数据元素。 在链表中,通过指针来表示元素之间的逻辑关系的,不再有逻辑顺序与物理存储顺序一致的特点,是非顺序存储结构。 在单链表中,每个结点由数据域和指针域组成。 数据域保存数据元素的信息,指针域存放其直接后继的存储位置。 其类型可描述为: typedefstructNode {elemtypedata; structNode*next; }LinkList; 单链表由头指针唯一确定。 为了便于操作,可在链表的第一个结点之前添加一个表头结点。 在链表中进行插入和删除操作只需要修改有关的指针内容,不需要移动元素。 因此,链表较顺序表的插入和删除操作更加方便、高效。 为了便于实现各种运算,若无特殊说明,均采用带头结点的链表。 4.栈 栈(Stack)是限定仅在表的一端进行插入或删除操作的线性表。 通常把允许插入和删除操作的一端称为栈顶(Top),而另一端称为栈底(Bottom)。 表为空时称为空栈。 在栈上的主要运算是入栈和出栈。 栈中元素如果按a1,a2,…,an的顺序进栈,则出栈顺序为an,an-1,…,a1。 因此,栈又称为“后进先出”(LastInFirstOut)的线性表,简称LIFO表。 同线性表相似,栈也有顺序栈和链栈两种存储结构。 顺序栈易产生“上溢”现象,而链栈不容易产生。 另外,注意对栈的操作只能在栈顶进行。 5.队列 队列(Queue)是限定只能在表的一端进行插入,在表的另一端进行删除的线性表。 通常把允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。 队列中元素如果按a1,a2,…,an的顺序进队,则出队的顺序仍为a1,a2,…,an。 因此,队列又称为“先进先出”(FirstInFirstOut)的线性表,简称FIFO表。 队列也有顺序队列和链队列两种存储结构。 在顺序队列中,为避免“假满”现象,一般采用循环队列(即首尾相接)。 链队列会因为队满而产生“上溢”现象。 第4章串 1.概念和术语 串(String)(或字符串): 是由零个或多个字符组成的有限序列。 一般记为 s=“a a …a ”(n≥0) 其中,s是串的名,用双引号括起来的字符序列是串的值。 串的长度: 串中字符的个数n。 子串和主串: 串中任意个连续的字符组成的子序列称为该串的子串。 包含子串的串相应地称为主串。 空串: 不包含任何字符的串,表示为“Ф”。 空格串: 由一个或多个空格字符组成的串。 例如: “”。 2.串的基本操作 (1)用串变量赋值assign(s,t)和用串常量赋值create(s,ss) (2)判等函数equal(s,t) (3)求长函数length(s) (4)连接函数concat(s,t) (5)求子串函数substring(s,pos,len) (6)定位函数index(s,t) (7)置换函数replace(s,t,v) (8)插入子串insert(s,pos,t) (9)删除子串delete(s,pos,k) (10)串的复制copy(s,t) 3.串的顺序存储结构(顺序串) 串的顺序存储方式类似于线性表的顺序存储方式,其存储结构用C语言描述为: typedefstructstrnode{ chardata[maxlen]; intlen; }SeqString;//定义顺序串类型 第5章数组和广义表 1.多维数组的顺序存储结构 对于多维数组,有两种存储方式: 一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。 另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。 以行为主序的分配规律是: 最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。 以列为主序分配的规律是: 最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。 不论按何种方式存储,只要确定了数组的首地址以及每个数组元素所占用的单元数,就可以将数组元素的存储地址表示为其下标的线性函数。 设有m×n二维数组Amn,以“以行为主序”的分配为例,按照元素的下标确定其地址的计算方法如下。 设数组的基址为LOC(a11),每个数组元素占据L个地址单元,计算aij的物理地址的函数为: LOC(aij)=LOC(a11)+((i-1)*n+j-1)*L 同理,对于三维数组Amnp,即m×n×p数组,对于数组元素aijk其物理地址为: LOC(aijk)=LOC(a111)+((i-1)*n*p+(j-1)*p+k-1))*L 注意: 在C语言中,数组中每一维的下界定义为0,则: LOC(aij)=LOC(a00)+(i*n+j)*L 2.特殊矩阵压缩存储的意义 在很多科学计算与工程应用中,经常要使用矩阵的概念。 矩阵具有与数组相似的性质,如元素数目固定、元素按下标关系有序地排列,所以在编程时可以利用二维数组来存储矩阵,也可以利用程序设计语言中的各种矩阵运算。 在某些情况下,特别是在数值分析中,经常会出现一些阶数很高的矩阵,其中含有许多值相同的元素或零元素,如三角矩阵、对称矩阵、稀疏矩阵等,从节约存储空间的角度考虑,此时若用二维数组存储会造成空间的极大浪费。 为了节省存储空间,可以对这类矩阵进行压缩存储。 即为对多个相同值的元素只分配一个存储空间,而对零元素可以不分配空间。 3.对称矩阵压缩存储的方法 对称矩阵的特点是: 在一个n阶方阵中,有aij=aji,其中1≤i,j≤n。 对称矩阵关于主对角线对称,因此只需存储上三角或下三角部分即可。 对于对称矩阵中的任意元素aij,若令I=max(i,j),J=min(i,j),则将上面两个式子综合起来得到: k=I*(I-1)/2+J-1。 给出对称矩阵A中任意元素aij,依据它的下标i和j就可由上述对应关系式确定其在数组M中的位置K,因此aij的地址可由下式计算。 Loc(aij)=Loc(M[K])=Loc(M[0])+K*L=Loc(M[0])+[I*(I+1)/2+J]*L 其中: L为每个数据元素所占的存储单元长度。 I=max(i,j)。 J=min(i,j)。 K=I*(I+1)/2+J。 4.三角矩阵压缩存储的方法 形如图的矩阵称为三角矩阵,其中c为某个常数。 其中下面图(a)为下三角矩阵: 主对角线以上均为同一个常数;(b)为上三角矩阵,主对角线以下均为同一个常数;下面讨论它们的压缩存储方法。 三角矩阵中的重复元素c可以共享一个存储空间,其余的元素有n(n+1)/2个,因此可压缩存储到向量sa[0..n(n+1)/2]中,c存放在向量的最后一个分量中,排列时以行序为主。 a 和sa[k]的对应关系是: 下三角矩阵: 上三角矩阵: 5.稀疏矩阵及其压缩存储的特点 设m*n矩阵中有t个非零元素且t< 稀疏矩阵的压缩存储采取如下方法: 将非零元素所在的行、列以及它的值构成一个三元组(i,j,v),然后再按某种规律存储这些三元组,这种方法可以节约存储空间。 6.稀疏矩阵压缩存储的顺序存储方式 以顺序方式组织存储时常用的方法是三元组顺序表,方法是: 将三元组按行优先的顺序,同一行中列号从小到大的规律排列成一个线性表,采用顺序存储方法存储该表。 7.稀疏矩阵压缩存储的链式存储方式 稀疏矩阵压缩存储的链式存储方式,即十字链表。 当矩阵中非零元素的个数和位置在使用中经常发生变化时,不宜采用顺序存储结构,可采用十字链表进行存储。 其结点结构如图所示。 row col v Down right 图4-2十字链表的结点结构 8.广义表(列表)的定义、术语及它与线性表的关系 广义表(GeneralizedLists)是n(n≥0)个数据元素a1,a2,…ai,…,an的有序序列,一般记作: Ls=(a1,a2,…ai,…,an)。 其中: Ls是广义表的名称,n是它的长度,每个ai(1≤i≤n)是Ls的成员,它可以是单个元素,也可以是一个广义表,分别称为广义表Ls的单元素和子表。 当广义表Ls非空时,称第一个元素a1为Ls的表头(head),称其余元素组成的表(a2,…,ai,…,an)为Ls的表尾(tail)。 表的深度: 表中元素的最深嵌套层数。 广义表与线性表的关系: 当广义表Ls中的元素全部是原子时,广义表即为线性表。 因此,可认为线性表是广义表的特例,广义表是线性表的推广。 9.广义表的三个重要性质 (1)广义表是一种多层次的数据结构。 广义表的元素可以是单元素,也可以是子表,而子表的元素还可以是子表,…。 (2)广义表可以是递归的表。 广义表的定义并没有限制元素的递归,即广义表也可以是其自身的子表。 例如表E就是一个递归的表。 (3)广义表可以为其他表所共享。 例如,表A、表B、表C是表D的共享子表。 在D中可以不必列出子表的值,而用子表的名称来引用。 10.广义表的存储结构 按结点形式的不同,广义表的链式存储结构可分为两种不同的存储方式。 一种称为头尾表示法,另一种称为孩子兄弟表示法。 11.广义表的基本运算 广义表有两个重要的基本操作,即取头操作(Head)和取尾操作(Tail)。 此外,在广义表上可以定义与线性表类似的一些操作,如建立、插入、删除、拆开、连接、复制、遍历等。 第6章树 从对线性结构的研究过渡到对树形结构的研究,是数据结构课程学习的一次跃变。 1.理解树的递归定义 树(Tree)是零个或多个结点的有限集合。 结点数为0的树称为空树,结点数大于0的树称为非空树。 在一棵非空树中: (1)有且仅有一个特定的称为根(root)的结点; (2)当结点数大于1时,除根结点外,其它结点被分成n(n>0)个互不相交的子集: T1,T2,…,Tn,其中每个子集本身又是一棵树(称之为子树),每一棵子树的根xi(1≤i≤n)都是根结点root的后继,树T1,T2,…,Tn称为根的子树。 2.掌握树的基本概念 结点的度(Degree): 是指结点拥有的子树的数目。 叶子或终端结点: 是指度为0的结点。 非终端结点或分支结点: 是指度不为0的结点。 树的度: 是指树内各结点的度的最大值。 孩子(Child)和双亲(Parent): 某个结点的子树的根称为该结点的孩子,相应的,该结点称为其孩子的双亲。 兄弟: 同一个双亲的孩子结点互为兄弟。 结点的层次: 规定根所在的层次为第1层,根的孩子在第二层,依次类推。 树的深度或高度: 树中结点最大的层数。 有序树: 是指树中结点的各子树从左至右是有次序的,否则称为无序树。 森林: 是指n(n≥0)棵互不相交的树的集合。 3.理解二叉树的递归定义及其与树的区别 二叉树(BinaryTree)是结点的有限集合,这个集合或者为空,或者是由一个根结点和两棵互不相交的分别称为左子树和右子树的二叉树组成。 二叉树中的每个结点至多有两棵子树,且子树有左右之分,次序不能颠倒。 二叉树是一种重要的树型结构,但二叉树不是树的特例。 二叉树的5种形态分别为: 空二叉树,只有根结点的二叉树,根结点和左子树,根结点和右子树,根结点和左右子树。 二叉树与树的区别: 二叉树中每个结点的孩子至多不超过两个,而树对结点的孩子数无限制;另外,二叉树中结点的子树有左右之分,而树的子树没有次序。 4.掌握满二叉树和完全二叉树的概念 满二叉树(FullBinaryTree)和完全二叉树(CompleteBinaryTree),是两种特殊形态的二叉树。 一棵深度为k且有2k-1个结点的二叉树称为满二叉树。 深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称之为完全二叉树。 完全二叉树的特点是: (1)只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现; (2)对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1。 5.理解二叉树的性质 已知二叉树的深度h可求出该二叉树拥有的最多结点数,已知结点数n可求出对应树或二叉树的最大和最小高度。 性质1.在二叉树的第i层上最多有2i-1个结点(i≥1)。 性质2.深度为k的二叉树最多有2k-1个结点(k≥1)。 性质3.对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。 性质4.具有n个结点的完全二叉树的深度为 +1。 性质5.如果对一棵有n个结点的完全二叉树(其深度为 +1,其中k为不大于 的最大整数)的结点按层序编号(编号方法为从第1层到最后一层,每一层从左到右),则对任一结点i(1≤i≤n),有 (1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则其双亲是第 个结点。 (2)如果2i>n,则结点i无左孩子(即结点i为叶子结点);否则其左孩子是第2i个结点。 (3)如果2i+1>n,则结点i无右孩子;否则其右孩子是第2i+1个结点。 6.二叉树中结点的编号规则和对应的顺序存储结构 顺序存储二叉树的具体方法是: 在一棵具有n个结点的完全二叉树中,从根结点开始编号为1,自上到下,每层自左至右地给所有结点编号,这样可以得到一个反映整个二叉树结构的线性序列;然后将完全二叉树上编号为i的结点依次存储在一维数组a[l...n]中下标为i的元素中。 7.二叉树的链接存储结构及存储结点的类型定义 链式存储是使用链表来存储二叉树中的数据元素,链表中的一个结点相应地存储二叉树中的一个结点。 常见的二叉树的链式存储结构有两种: 二叉链表和三叉链表。 。 二叉链表是指链表中的每个结点包含两个指针域和一个数据域,分别用来存储指向二叉树中结点的左右孩子的指针及结点信息。 三叉链表是指链表中的每个结点包含三个指针域和一个数据域,相比二叉链表多出的一个指针域则用来指向该结点的双亲结点。 不论哪种链表,头指针都指向二叉树的根结点。 在含有n个结点的二叉链表中,共有2n个指针域,但实际有效的指针数等于二叉树中的分支数(即n-1),所以共存在n+1个空的指针域。 8.掌握二叉树的先序、中序、后序遍历的递归算法和非递归算法。 9.能够根据先序+中序、后序+中序的遍历序列确定一棵二叉树,并理解为什么先序+后序不能唯一确定一棵二叉树。 10.掌握线索二叉树的定义及存储结构,会画出先序、中序和后序线索二叉树或相应的线索链表。 12.掌握遍历中序线索二叉树的规则及算法。 13.掌握树的三种存储结构: 双亲表示法、孩子表示法、孩子/兄弟表示法,掌握这三种存储方法的特点,并且能够画出指定树的存储结构图。 14.理解二叉树与树或森林转换的目的,掌握树和二叉树之间的相互转换,掌握森林和二叉树之间的相互转换。 15.掌握树的先根、后根和按层遍历的过程。 16.掌握森林的先根、后根遍历。 17.掌握路径、路径长度、结点的权、结点的带权路径长度、树的带权路径长度的概念。 路径: 若在树中存在着一个结点序列k1,k2,…,kj,使得ki是ki+1的双亲(1≤i≤j),则此结点序列称为从k1到kj的路径。 路径长度: 从k1到kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1。 结点的权: 在许多应用中,常常将树中的某个结点赋上一个具有某种意义的数值,这个和某个结点相关的数值称为该结点的权或权值。 结点的带权路径长度: 是指从树根到该结点之间的路径长度与结点的权值的乘积。 树的带权路径长度: 是指树中所有叶子结点的带权路径长度之和,通常记为WPL= 。 其中n表示叶子结点的个数,Wi表示叶子结点Ki的权值,Li表示根结点到Ki的路径长度。 18.掌握哈夫曼树的概念。 哈夫曼树(HuffmanTree): 又称为最优二叉树,它是n个带权的叶子结点构成的所有二叉树中带权路径长度WPL最小的二叉树。 19.掌握哈夫曼树的构造方法,即根据一组给定的权值构造相应的哈夫曼树。 20.理解哈夫曼编码的含义,能够根据实际问题构造哈夫曼编码。 第7章图 1.基本概念及术语 图G: 由两个集合V(G)和E(G)所组成,记作G=(V,E),其中V(G)是图中顶点的非空有限集合,E(G)是图中边的有限集合。 有向图(Digraph): 如果图中每条边都是有向的即每条边在图示时都用箭头表示方向,则称此图为有向图。 有向图的边也称为弧,如图6-1中G1是有向图,它由V(G1)和E(G1)组成。 V(G1)={V1,V2,V3},E(G1)={ 无向图(Undigraph): 如果图中每条边都是顶点无序对,则称为无向图。 无向边用圆括号括起的两个相关顶点来表示。 在无向图中,(V1,V2)和(V2,V1)是表示同一条边。 如图6-1所示,G2和G3都是无向图。 其中, V(G2)={V1,V2,V3,V4} E(G2)={(V1,V2),(V1,V3),(V2,V3),(V2,V4),(V3,V4)} V(G3)={V1,V2,V3,V4,V5,V6,V7} E(G3)={(V1,V2),(V1,V3),(V2,V4),(V2,V5),(V3,V6),(V3,V7)} 无向完全图和有向完全图: 若一个无向图有n个顶点,而每一个顶点与其他n-1个顶点之间都有边,这样的图称之为无向完全图。 即共有n(n—1)/2条边。 类似地,在有n个顶点的有向图中,若有n(n—1)条弧,即任意两顶点之间都有双向相反的两条弧连接,则称此图为有向完全图。 子图: 设有两个图A和B且满足条件: V(B)∈V(A)且E(B)∈E(A)则称B是A的子图。 路径: 在图G中,从顶点Vp到Vq的一条路径是顶点序列(Vp,Vi1,Vi2,…,Vin,Vq)且(Vp,Vi1),(Vi1,Vi2),…,(Vin,Vq)是E(G)中的边,路径上边的数目称之为该路径长度。 对于有向图,其路径也是有向的,路径由弧组成。 简单路径: 如果一条路径上所有顶点除其起始点和终止点外彼此都是不同的,则称该路径是简单路径。 回路和简单回路: 在一条路径中,如果其起
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构