数据结构总结.docx
- 文档编号:23030493
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:27
- 大小:213.93KB
数据结构总结.docx
《数据结构总结.docx》由会员分享,可在线阅读,更多相关《数据结构总结.docx(27页珍藏版)》请在冰豆网上搜索。
数据结构总结
第一章
用计算机处理的实际问题可分为两大类问题:
数值计算非数值计算
现实中对象之间的关系:
线性关系,层次关系,网状关系
数据结构定义:
是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科
简单定义为:
相互之间存在一种或多种特定关系的数据元素的集合。
基本概念和术语
⏹数据(data)—所有能输入到计算机中去的描述客观事物的符号
⏹数据元素(dataelement)—数据的基本单位,也称节点(node)或记录(record)
⏹数据项(dataitem)—有独立含义的数据最小单位,也称域(field)
⏹数据结构(datastructure)—数据元素和数据元素关系的集合
根据数据元素间关系的基本特性,有四种基本数据结构
集合——数据元素间除“同属于一个集合”外,无其它关系
线性结构——一个对一个,如线性表、栈、队列
树形结构——一个对多个,如树
图状结构或网状结构——多个对多个,如图;
数据的逻辑结构—指抽象反映数据元素的逻辑关系。
。
数据的逻辑结构有两大类:
⏹线性结构:
线性表
⏹非线性结构:
树和图
数据的存储(物理)结构—数据的逻辑结构在计算机存储器中的实现。
存储结构分为:
顺序存储结构——借助元素在存储器中的相对位置来表示数据元素间的逻辑关系
链式存储结构——借助指示元素存储地址的指针表示数据元素间的逻辑关系
索引存储方法散列存储方法
数据的逻辑结构与存储结构密切相关
算法设计逻辑结构
算法实现存储结构
数据结构的研究内容
●研究数据之间的相互关系,即数据的组织形式,包括:
⏹数据元素之间的逻辑关系,也称为数据的逻辑结构(Logicalstructure)。
⏹数据元素及其关系在计算机存储器内的表示,称为数据的存储结构。
●数据的运算,即基于某种存储结构对数据施加的操作或运算。
算法:
通俗地讲,一个算法就是一种解题方法
更严格地说,算法是由若干条指令组成的有穷序列
算法必须满足下述准则:
重要特性
输入:
具有0个或多个输入的外界量。
输出:
至少产生一个输出。
有穷性:
每一条指令的执行次数必须是有限的。
确定性:
每条指令的含义都必须明确,无二义性。
可行性:
每条指令的执行时间都是有限的。
●算法的描述
⏹自然语言
⏹伪高级语言
数据结构与算法的关系
●给定了数据的逻辑结构后,对同一逻辑结构而言,由于存储结构的不同,定义的运算也是不同的。
⏹如线性表是一种逻辑结构,若采用顺序存储方法表示,则称为顺序表;若采用链式存储方法表示,则称为链表。
⏹相同的运算在顺序表和链表上的实现方法是不同的。
算法设计要求:
1)正确性2)可读性3)健壮性4)效率与低存储量的要求
如何分析算法的优劣?
●主要考虑如下三点:
⏹执行算法所耗费的时间
⏹执行算法所耗费的存储空间,其中主要考虑辅助存储空间;
⏹算法应易于理解,易于编码,易于调试等等。
时间复杂度
空间复杂度
程序的执行时间取决于以下相关因素:
1.算法选用的策略2.问题的规模3.编写程序的语言4.编译程序产生的机器代码的质量5.计算机执行指令的速度
●时间复杂度:
⏹指某个算法的时间耗费,它是该算法所求解问题规模n的函数。
⏹计算方法:
有1,n,n2.
●渐进时间复杂度:
⏹指当问题规模趋向无穷大时,该算法时间复杂度的数量级。
●评价一个算法的时间性能,主要标准就是算法的渐进时间复杂度。
在算法分析时,往往对二者不予区分,经常是将渐进时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。
●此外,算法中语句的频度不仅与问题的规模有关,还与输入实例中各元素的取值有关。
●总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。
算法的存储空间需求
算法在运行过程中所占用的存储空间的大小被定义为算法的空间复杂性。
记作:
S(n)=O(f(n))
表示随着问题规模n的增大,算法运行所需存储量的增长率与f(n)的增长率相同。
第二章线性表
1.线性表的定义:
是由n(n>=0)个数据元素组成的有限序列。
2.线性链表:
定义:
用一组任意的存储单元存放线性表的数据元素。
*任意---可以是连续的,也可以是不连续。
数据域——存储数据元素信息。
结点——将两部分的信息组成数据元素ai的存储映像
指针域(链域)——存储直接后继元素的存储位置。
通过链域,可将n个结点按其逻辑顺序链接在一起(不论其物理次序如何),称为链表,即为线性表的链式存储结构。
因为每个节点中只包含一个指针域,因此又称为线性链表或单链表。
3.线性链表的特点:
•链表中结点的逻辑次序和物理次序不一定相同。
即:
逻辑上相邻未必在物理上相邻。
•数据元素之间的逻辑关系由链表中的指针域指示,而结点在存储器中的存储位置是随意的。
•存取方式:
顺序存取,不能实现随机存取。
头结点——其数据域可以不存放任何数据,也可以存放链表的结点个数的信息;指针域存储指向第一个元素结点的指针。
对于链表的各种操作必须从头指针开始
第三章栈和队列
●栈(stack)
–栈的定义和特点
●定义:
限定仅在表尾进行插入或删除操作的线性表,表尾—栈顶,表头—栈底,不含元素的空表称空栈
●特点:
先进后出(FILO)或后进先出(LIFO)
栈的存储方式:
顺序栈,链式(不做陈述)
•顺序栈:
利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。
同时附设栈顶指针top和栈底指针base。
•约定非空栈中的栈顶指针始终指向栈顶元素的下一个位置上。
指针top的初值指向栈底,即top==base可作为栈空的标记。
•每当插入新的栈顶元素时,指针top加1;删除栈顶元素时,指针top减1。
栈的基本操作:
(1)初始化栈InitStack(S)
(2)入栈Push(S,item)
(3)出栈Pop(S,item)
(4)获取栈顶元素GetTop(S,item)
(5)判断栈是否为空StackEmpty(S)
栈的链式存储结构及其基本运算
•链式栈无栈满问题,空间可扩充
•插入与删除仅在栈顶处执行
•链式栈的栈顶在链头
•适合于多栈操作
小结
1.栈是限定仅能在表尾进行插入、删除操作的线性表;
2.栈具有后进先出的特点(LIFO);
3.栈顶元素的位置由栈顶指针指示,它始终指向栈顶元素的下一个位置;
4. 进栈、出栈操作要修改栈顶指针。
队列:
1.定义
●队列是限定在表的一端进行删除,在表的另一端进行插入操作的线性表。
●允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear)。
●特点:
先进先出(FIFO——FirstInFirstOut)
向队列中插入新元素称为进队或入队(enqueue),新元素进队后就成为新的队尾元素;从队列中删除元素称为出队或离队(dequeue),元素出队后,其后继元素就成为队首元素。
注意:
禁止在队列的中间部分实施插入、删除操作。
2.链队列——队列的链式存储结构
●用链表表示的队列简称为链队列,实质是带头结点的线性链表;
●设两个指针:
▪队头指针指向头结点
▪队尾指针指向尾结点
链队列组成:
(1)存储队列元素的单链表
(2)指向队头和队尾的指针(头指针和尾指针)
3.循环队列——队列的顺序存储结构
(1)顺序队列:
用一组地址连续的存储单元依次存放从队头到队尾的元素。
●设两个指针:
在非空队列中
Q.front——指向队头元素;
Q.rear——指向队尾元素的下一个位置
●初始状态(空队列):
Q.front=Q.rear=0
✓进队时,将新元素插入Q.rear指示位置,再将队尾指针加1,
Q.rear=Q.rear+1。
✓出队时,将Q.front的元素取出,再将队头指针加1,Q.front=Q.front+1。
✓队满时再进队将溢出出错,为“假溢出”。
假溢出解决方案:
●按最大可能的插入操作次数设置顺序队列的最大元素个数,此方法有时会因估计不准而出错,并会有较大的空间浪费;
●队首固定,每次出队后剩余元素向下移动
——浪费时间
●循环队列
把顺序队列构造成一个头尾相连的环,形成循环队列(存储队列的数组被当作首尾相接的表处理。
)
在循环队列中进行出队、入队操作时,头、尾指针仍要加1,只不过当头、尾指针指向向量上界(MaxSize-1)时,其加1操作的结果是指向向量的下界0。
可用C语言的取模(求余数)运算实现。
解决方案:
1.另外设一个标志以区别队空、队满
2.少用一个元素空间
约定队头指针在队尾指针的下一位置(指环状的下一位置)上作为队列“满”状态的标志,即以队尾指针在循环意义下加1是否等于队头指针来判断队满,则:
队满条件为:
(Q.rear+1)%Maxsize==Q.front
队空条件仍然为:
Q.front==Q.rear
第5章数组和广义表
数组
相同类型数据元素a0,a1,…,an-1构成的有限序列,且该有限序列存储在一块地址连续的内存单元中。
在二维数组中,每个数据元素对应一对数组下标,在行方向上和列方向上都存在一个线性关系,即存在两个直接前驱和两个直接后继(边界除外)。
数组具有以下性质:
1. 数组中的数据元素数目固定,一旦定义了一个数组,其数据元素数目不再有增减变化;
2. 数组中的每个数据元素具有相同的数据类型;
3.数组中的每个数据元素都和一组唯一的下标相对应;
4.数组是一种随机存取结构,可随机存取数组中的任意数据元素。
由于数组一般不作插入或删除操作,一旦建立了数组,则结构中的数据元素个数和元素之间的关系就不再发生变动。
因此,适合采用顺序存储结构表示数组。
压缩存储--------为多个值相同的元只分配一个存储空间;对零元不分配空间。
假若值相同的元素或者零元素在矩阵中的分布有一定规律,则我们称此类矩阵为特殊矩阵;反之,称为稀疏矩阵。
特殊矩阵:
对称矩阵:
aij=aji
三角矩阵:
上(下)三角矩阵是指矩阵的主对角线的下(上)方(不包括对角线)的元素均为常数c或零的n阶矩阵,通常为0
对角矩阵:
若一个n阶方阵A所有的非零元素集中在以主对角线为中心的带状区域中,区域外的值全为0
稀疏矩阵
非零元较零元少,且分布没有一定规律的矩阵称为稀疏矩阵。
假设在m*n的矩阵中,有t个元素不为零。
令δ=t/(m*n),称δ为矩阵的稀疏因子。
通常认为δ≤0.05时称为稀疏矩阵。
按照压缩存储的概念,只存储稀疏矩阵的非零元。
因此,除了存储非零元的值以外,还必须同时记下它所在行和列的位置(i,j)。
反之,一个三元组(i,j,aij)唯一确定了矩阵A的一个非零元。
由此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确定。
广义表
广义表是第二章提到的线性表的推广。
线性表中的元素仅限于原子项,即不可以再分,而广义表中的元素既可以是原子项,也可以是子表(另一个线性表)。
广义表是n≥0个元素a1,a2,…,an的有限序列,其中每一个ai或者是原子,或者是一个子表。
广义表通常记为LS=(a1,a2,…,an),其中LS为广义表的名字,n为广义表的长度,每一个ai为广义表的元素。
但在习惯中,一般用大写字母表示广义表,小写字母表示原子。
.广义表的深度
一个广义表的深度是指该广义表展开后所含括号的层数
广义表的分类
(1)线性表:
元素全部是原子的广义表。
(2)纯表:
与树对应的广义表。
(3)再入表:
与图对应的广义表(允许结点共享)
(4)递归表:
允许有递归关系的广义表:
如:
E=(a,E)
这四种表的关系满足:
递归表再入表纯表线性表
第六章树和二叉树
树是一类重要的非线性数据结构,是以分支关系定义的层次结构
一、树的定义
树(Tree)是n(n0)个结点的有限集合。
如果n=0,称为空树;如果n>0,则
▪有且仅有一个特定的称之为根(Root)的结点,它只有直接后继,但没有直接前驱;
▪当n>1时,除根以外的其它结点划分为m(m>0)个互不相交的有限集T1,T2,…,Tm,其中每个集合本身又是一棵树,并且称为根的子树(SubTree)。
特点:
✓非空树中至少有一个结点——根
✓树中各子树是互不相交的集合
树的结构定义是一个递归的定义,即在树的定义中又用到树的概念,它表明了树的固有特性。
树还可有其它的表示形式:
(1)以嵌套集合的形式表示(即是一些集合的集体,对于其中任何两个集合,或者不相交,或者一个包含另一个);
(2)以广义表的形式表示:
根作为由子树森林组成的表的名字写在表的左边;
(3)凹入表示法(类似书的编目)
二、树的基本术语
⏹结点:
数据元素的内容及其指向其子树的分支统称为结点。
⏹结点的度:
结点的分支数。
⏹终端结点(叶子):
度为0的结点。
⏹非终端结点:
度不为0的结点。
⏹树的度:
树中所有结点的度的最大值。
⏹结点的层次:
树中根结点的层次为1,根结点的子树的根为第2层,以此类推。
⏹树的深度或高度:
树中所有结点层次的最大值。
⏹有序树、无序树:
如果树中每棵子树从左向右的排列有一定的顺序,不得互换,则称为有序树,否则称为无序树。
⏹森林:
是m(m≥0)棵互不相交的树的集合。
在树结构中,结点之间的关系又可以用家族关系描述,定义如下:
⏹孩子、双亲:
结点的子树的根称为该结点的孩子,而该结点又被称为孩子的双亲。
⏹子孙:
以某结点为根的子树中的所有结点都称为该结点的子孙。
⏹结点的祖先:
从根结点到该结点路径上的所有结点。
⏹兄弟:
同一个双亲的孩子之间互为兄弟。
⏹堂兄弟:
双亲在同一层的结点互为堂兄弟。
二叉树
定义:
二叉树是结点的有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。
特点:
✓每个结点至多只有两棵子树(二叉树中不存在度大于2的结点)
✓二叉树的子树有左、右之分,且其次序不能任意颠倒
两种特殊形态的二叉树
1.满二叉树(FullBinaryTree)
一棵深度为k且有2k-1个结点的二叉树称为满二叉树。
特点:
每一层上的结点数都是最大结点数
2.完全二叉树(CompleteBinaryTree):
深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树。
特点:
(1)叶子结点只可能在层次最大的两层上出现
(2)对任一结点,若其右分支下子孙的最大层次为l,则其左分支下子孙的最大层次必为l或l+1
(3)除最后一层外,每一层都取最大结点数,最后一层结点都集中在该层最左边的若干位置。
二叉树的性质
性质1:
在二叉树的第i层上至多有2i-1个结点(i1)。
性质2:
深度为k的二叉树至多有2k-1个结点(k1)。
性质3:
对任何一棵二叉树T,如果其叶结点数为n0,度为2的结点数为n2,则n0=n2+1。
性质4:
具有n(n0)个结点的完全二叉树的深度为log2n+1
性质5:
若对一棵有n个结点的完全二叉树自顶向下,同一层自左向右进行1至n的编号,则有以下关系:
若i=1,则结点i是二叉树的根,无双亲;
若i>1,则双亲PARENT(i)是结点i/2;
如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子LCHILD(i)是结点2i;
如果2i+1>n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i+1。
二叉树的存储结构
1.顺序存储结构(数组表示)
就是用一组地址连续的存储单元依次存储二叉树中的结点。
对于满二叉树和完全二叉树,将树中所有结点的数据信息按照编号的顺序依次存储到一维数组T[1:
2h-1]中。
2.链式存储结构
(1)二叉链表——lChilddatarChild
(2)三叉链表——lChilddataparentrChild
遍历二叉树和线索二叉树
二叉树的遍历是指按照一定次序访问树中所有结点,并且每个结点仅被访问一次的过程
根据二叉树的结构,分为三部分:
L左子树D根结点R右子树
三种顺序DLR、LDR和LRD。
根据根访问的位置不同分别被称为先序遍历、中序遍历和后序遍历。
(1)先序遍历(PreorderTraversal)的定义:
若二叉树为空,则空操作;否则
⏹访问根结点;
⏹先序遍历左子树;
⏹先序遍历右子树。
递归遍历算法:
voidPreOrderTraverse(BiTreeT){
//采用二叉链表存储结构,先序遍历二叉树T的递归算法,
if(T){
Visit(T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}}
(2)中序遍历(InorderTraversal)的定义:
若二叉树为空,则空操作;否则
⏹中序遍历左子树;
⏹访问根结点;
⏹中序遍历右子树。
递归遍历算法:
voidInOrderTraverse(BiTreeT){
if(T){
InOrderTraverse(T->lchild);
Visit(T->data);
InOrderTraverse(T->rchild);
}}
(3)后序遍历(PostorderTraversal)的定义:
若二叉树为空,则空操作;否则
⏹后序遍历左子树;
⏹后序遍历右子树;
⏹访问根结点。
递归遍历算法:
voidPostOrderTraverse(BiTreeT){
if(T){
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
Visit(T->data);
}}
由此可以看出:
(1)遍历操作实际上是将非线性结构线性化的过程,其结果为线性序列;
(2)遍历操作是一个递归的过程,因此,这三种遍历操作的算法可以用递归函数实现。
(3)在由不同的遍历方法所得到的序列中,同一结点的前驱和后继不一定相同。
线索二叉树
定义:
前驱与后继:
二叉树的先序、中序或后序遍历序列中,两个相邻的结点互称为前驱与后继
线索:
指向前驱或后继结点的指针称为线索。
线索二叉树:
加上线索的二叉链表表示的二叉树
线索化:
对二叉树按某种遍历次序使其变为线索二叉树的过程
6.4树和森林(了解)
树的存储结构:
三种常用的存储结构:
双亲表示法、孩子表示法、孩子兄弟表示法。
森林与二叉树的转换
6.6赫夫曼树及应用(HuffmanTree)
赫夫曼(Huffman)树,又称最优树,是一类带权路径长度最短的树。
一、赫夫曼树的定义
▪路径:
从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
▪路径长度(PathLength)
两个结点之间的路径长度是指连接两个结点的路径上的分支数。
▪树的路径长度:
是根结点到每个结点的路径长度之和。
▪结点的带权路径长度:
从该结点到树根之间的路经长度与该结点上权值的乘积。
▪树的带权路径长度(WeightedPathLength,WPL)
是树中所有叶子结点的带权路径长度之和,即树中所有叶子结点所带的权值wi与该结点到根的路径长度li的乘积的和。
如何构造赫夫曼树?
P(115)
三、赫夫曼编码:
用途(实现数据压缩)
在设计编码时需要遵守两个原则:
(1)发送方传输的二进制编码,到接收方译码后必须具有唯一性,即译码结果与发送方发送的电文完全一样;
(2)发送的二进制编码尽可能地短。
1.等长编码
这种编码方式的特点是每个字符的编码长度相同(编码长度就是每个编码所含的二进制位数)。
2.不等长编码
使用频度较高的字符分配一个相对比较短的编码,使用频度较低的字符分配一个比较长的编码。
前缀编码:
要设计长短不等的编码,则必须使任一字符的编码都不是另一个字符的编码的前缀。
这种编码称作前缀编码。
⏹可以用二叉树来设计二进制的前缀编码;
⏹利用赫夫曼树可以构造一种不等长的二进制编码,并且构造所得的赫夫曼编码是一种最优前缀编码,即使所传电文的总长度最短。
第七章图
•定义
⏹图:
由顶点集V与顶点之间关系的集合E(边或弧的集合)构成的一种数据结构,通常表示为
G=(V,{E})
⏹其中,E={
⏹图的分类——顶点间的关系是否有方向性
⏹无向图
⏹边(v,w),v与w互为邻接点,边(v,w)依附于顶点v、w,边(v,w)和顶点v、w相关联。
⏹顶点v的度:
和v相关联的边数,记为TD(v)。
⏹有向图
⏹弧
⏹顶点v的度:
v的入度与出度之和。
⏹v的入度:
以v为弧头的弧数,记为ID(v);
⏹v的出度:
以v为弧尾的弧数,记为OD(v);
⏹路径
⏹从顶点vi到顶点vj的一条路径是一个顶点序列(vi,vi1,vi2,…,vim,vj)。
路径上经过的边的数目为路径长度。
⏹简单路径
⏹序列中顶点不重复出现的路径。
⏹回路(环)
⏹路径中第1个顶点和最后一个顶点相同。
⏹简单回路(简单环)
⏹路径上除第1个顶点和最后一个顶点相同外,其余顶点不重复出现。
⏹连通性——若从顶点v到顶点v’有路径,则称v和v’是连通的。
⏹对于无向图G
⏹连通图:
G中任意两个顶点都连通。
⏹连通分量:
G中的极大连通子图。
⏹对于有向图G
⏹强连通图:
G中任意两个顶点都连通(方向性)。
⏹强连通分量:
G中的极大强连通子图。
⏹注意:
①任何(强)连通图的连通分量只有一个,即是其自身。
②非(强)连通的图有多个(强)连通分量。
⏹子图:
G’=(V’,{E’}),G=(V,{E}),若V’V且E’E,则称G’是G的子图。
●生成树
⏹包含无向图G所有顶点的极小连通子图称为G的生成树。
⏹极小连通子图:
该子图是G的连通子图,在该子图中删除任何一条边,子图不再连通。
⏹若T是G的生成树当且仅当T满足如下条件:
1.T是G的连通子图
2.T包含G的所有顶点3.T中无回路
●(无向)完全图
⏹边数=n(n-1)/2的无向图(每对顶点间都有一条边)
●有向完全图
⏹弧数=n(n-1)的有向图(每对顶点间有两条方向相反的弧)
●稀疏图
⏹弧(边)数 ●稠密图 ⏹
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 总结