《数据结构》基本概念.docx
- 文档编号:24012404
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:28
- 大小:57.32KB
《数据结构》基本概念.docx
《《数据结构》基本概念.docx》由会员分享,可在线阅读,更多相关《《数据结构》基本概念.docx(28页珍藏版)》请在冰豆网上搜索。
《数据结构》基本概念
基本概念
Ø数据
数据是信息的载体,在计算机科学中是指所有能输入到计算机中并能被计算机程序识别和处理的符号集合。
Ø数据元素
数据元素也称为结点,是表示数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
Ø数据项
数据项是构成数据元素的不可分割的最小单位。
Ø数据对象
数据对象是具有相同性质的数据元素的集合,是数据的子集。
注意:
在不产生混淆的情况下,将数据对象简称为数据。
Ø数据结构
数据结构是指相互之间存在一定关系的数据元素的集合,即数据结构是一个二元组DataStructure=(D,R),其中D是数据元素的集合,R是D上关系的集合。
按照视点的不同,数据结构分为逻辑结构和存储结构。
Ø数据的逻辑结构
数据的逻辑结构是指数据元素之间逻辑关系的整体。
根据数据元素之间逻辑关系的不同,数据结构分为四类:
⑴集合:
数据元素之间就是“属于同一个集合”,除此之外,没有任何关系;
⑵线性结构:
数据元素之间存在着一对一的线性关系;
⑶树结构:
数据元素之间存在着一对多的层次关系;
⑷图结构:
数据元素之间存在着多对多的任意关系。
注意:
数据结构分为两类:
线性结构和非线性结构。
Ø数据的存储结构
数据的存储结构又称为物理结构,是数据及其逻辑结构在计算机中的表示。
通常有两种存储结构:
顺序存储结构和链接存储结构。
顺序存储结构的基本思想是:
用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系是由元素的存储位置来表示的。
链接存储结构的基本思想是:
用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系是用指针来表示的。
注意:
存储结构除了存储数据元素之外,必须存储数据元素之间的逻辑关系。
Ø抽象数据类型
抽象数据类型是一个数据结构以及定义在该结构上的一组操作的总称。
抽象数据类型提供了使用和实现两个不同的视图,实现了封装和信息隐藏。
Ø算法的定义
通俗地讲,算法是解决问题的方法,严格地说,算法是对特定问题求解步骤的一种描述,是指令的有限序列。
Ø算法的特性
⑴输入:
一个算法有零个或多个输入(即算法可以没有输入),这些输入通常取自于某个特定的对象集合。
⑵输出:
一个算法有一个或多个输出(即算法必须要有输出),通常输出与输入之间有着某种特定的关系。
⑶有穷性:
一个算法必须总是(对任何合法的输入)在执行有穷步之后结束,且每一步都在有穷时间内完成。
⑷确定性:
算法中的每一条指令必须有确切的含义,不存在二义性。
并且,在任何条件下,对于相同的输入只能得到相同的输出。
⑸可行性:
算法描述的操作可以通过已经实现的基本操作执行有限次来实现。
Ø线性表的定义
线性表简称表,是零个或多个具有相同类型的数据元素的有限序列。
数据元素的个数称为线性表的长度,长度等于零时称为空表。
Ø线性表的逻辑关系
在一个非空表L=(a1,a2,……,an)中,任意一对相邻的数据元素ai-1和ai之间(1<i≤n)存在序偶关系(ai-1,ai),且ai-1称为ai的前驱,ai称为ai-1的后继。
在这个序列中,a1无前驱,an无后继,其它每个元素有且仅有一个前驱和一个后继。
Ø顺序表的存储结构定义
用MaxSize表示数组的长度,顺序表的存储结构定义如下:
#defineMaxSize100
typedefstruct
{
ElemTypedata[MaxSize];//ElemType表示不确定的数据类型
intlength;//length表示线性表的长度
}SeqList;
Ø顺序表是随机存取结构
设顺序表的每个元素占用c个存储单元,则第i个元素的存储地址为:
LOC(ai)=LOC(a1)+(i-1)×c
Ø顺序表的优缺点
顺序表利用了数组元素在物理位置上的邻接关系来表示线性表中数据元素之间的逻辑关系,这使得顺序表具有下列优点:
⑴无需为表示表中元素之间的逻辑关系而增加额外的存储空间;
⑵可以快速地存取表中任一位置的元素(即随机存取)。
同时,顺序表也具有下列缺点:
⑴插入和删除操作需移动大量元素。
在顺序表上做插入和删除操作,等概率情况下,平均要移动表中一半的元素。
⑵表的容量难以确定。
由于数组的长度必须事先确定,因此,当线性表的长度变化较大时,难以确定合适的存储规模。
⑶造成存储空间的“碎片”。
数组要求占用连续的存储空间,即使存储单元数超过所需的数目,如果不连续也不能使用,造成存储空间的“碎片”现象。
Ø单链表的存储结构定义
单链表的存储结构定义如下:
StructNode
{ElemTypedata;//ElemType表示不确定的数据类型
structNode*next;
}*first;//first为单链表的头指针
Ø双链表的存储结构定义
双链表存储结构定义如下:
structDulNode
{
ElemTypedata;//ElemType表示不确定的数据类型
structDulNode*prior,*next;//prior为前驱指针域,next为后继指针域
}*first;//first表示双链表的头指针
Ø栈的定义
栈是限定仅在表尾进行插入和删除操作的线性表。
允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。
Ø栈的操作特性
栈的操作具有后进先出的特性。
Ø队列的定义
队列是只允许在一端进行插入操作,而另一端进行删除操作的线性表。
允许插入的一端称为队尾,允许删除的一端称为队头。
Ø队列的操作特性
队列的操作具有先进先出的特性。
Ø循环队列中解决队空队满的判断条件
方法一:
附设一个存储队列中元素个数的变量num,当num=0时队空,当num=QueueSize时为队满;
方法二:
修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元;即队空的条件是front=rear,队满的条件是(rear+1)%QueueSize=front,队列长度为(rear-front+QueueSize)%QueueSize。
方法三:
设置标志flag,当front=rear且flag=0时为队空,当front=rear且flag=1时为队满。
Ø串的定义
串是零个或多个字符组成的有限序列。
Ø空格串和空串的定义
只包含空格的串称为空格串。
串中所包含的字符个数称为串的长度,长度为0的串称空串,记作""。
Ø串的比较
串的比较是通过组成串的字符之间的比较来进行的。
给定两个串:
X="x1x2…xn"
Y="y1y2…ym"
则当n=m且x1=y1,…,xn=ym时,称X=Y;
当下列条件之一成立时,称X<Y:
⑴n<m,且xi=yi(i=1,2,…,n);
⑵存在某个k≤min(m,n),使得xi=yi(i=1,2,…,k-1),xk<yk。
Ø改进的模式匹配算法中next[j]的求法
用next[j]表示tj对应的k值(1≤j≤m),其定义如下:
Ø数组的基本操作
数组是一个具有固定格式和数量的数据集合,在数组上一般不能做插入、删除元素的操作。
因此,在数组中通常只有两种操作:
⑴读取:
给定一组下标,读取相应的数组元素;
⑵修改:
给定一组下标,存储或修改相应的数组元素。
Ø二维数组的寻址
按行优先,设二维数组的行下标与列下标的范围分别为[l1,h1]与[l2,h2],则任一元素aij的存储地址可由下式确定:
LOC(aij)=LOC(al1l2)+((i-l1)×(h2-l2+1)+(j-l2))×c
Ø特殊矩阵的定义
特殊矩阵是指矩阵中有很多值相同的元素并且它们的分布有一定的规律。
Ø矩阵压缩存储的基本思想
压缩存储的基本思想是:
⑴为多个值相同的元素只分配一个存储空间;⑵对零元素不分配存储空间。
Ø对称矩阵的压缩存储中:
下三角元素aij(i≥j)在一个数组SA中的下标为:
k=i×(i-1)/2+j-1。
上三角中的元素aij(i<j),则访问和它对应的下三角中的元素aji即可,即:
k=j×(j-1)/2+i-1。
Ø三角矩阵的压缩存储中:
下三角矩阵中任一元素aij在一个数组SA中的下标k与i、j的对应关系为:
上三角矩阵元素aij在SA中的下标为:
k=(i-1)×(2n-i+2)/2+(j-i)。
Ø稀疏矩阵的压缩存储方式
三元组顺序表和十字链表
Ø三元组的定义
structelement
{
introw,col;
ElemTypeitem
};
Ø广义表的定义
广义表是n(n≥0)个数据元素的有限序列。
Ø表头
当广义表LS非空时,称第一个元素为LS的表头;
Ø表尾
称广义表LS中除去表头后其余元素组成的广义表为LS的。
Ø长度
广义表LS中的直接元素的个数称为LS的长度;
Ø深度
广义表LS中括号的最大嵌套层数称为LS的深度。
Ø树的定义
树是n(n≥0)个结点的有限集合。
当n=0时,称为空树;任意一棵非空树满足以下条件:
⑴有且仅有一个特定的称为根的结点;
⑵当n>1时,除根结点之外的其余结点被分成m(m>0)个互不相交的有限集合T1,T2,…,Tm,其中每个集合又是一棵树,并称为这个根结点的子树。
Ø结点的度、树的度
某结点所拥有的子树的个数称为该结点的度;树中各结点度的最大值称为该树的度。
Ø叶子结点、分支结点
度为0的结点称为叶子结点,也称为终端结点;度不为0的结点称为分支结点,也称为非终端结点。
Ø孩子结点、双亲结点、兄弟结点
某结点的子树的根结点称为该结点的孩子结点;反之,该结点称为其孩子结点的双亲
Ø路径、路径长度
如果树的结点序列n1,n2,…,nk满足如下关系:
结点ni是结点ni+1的双亲(1≤i<k),则把n1,n2,…,nk称为一条由n1至nk的路径;路径上经过的边的个数称为路径长度。
Ø祖先、子孙
如果从结点x到结点y有一条路径,那么x就称为y的祖先,而y称为x的子孙。
注意:
某结点子树中的任一结点都是该结点的子孙。
Ø结点的层数、树的深度(高度)
规定根结点的层数为1,对其余任何结点,若某结点在第k层,则其孩子结点在第k+1层;树中所有结点的最大层数称为树的深度,也称为树的高度。
Ø二叉树的定义
二叉树是n(n≥0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。
Ø二叉树的特点
二叉树的特点是:
⑴每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点;⑵子树的次序不能任意颠倒,某结点即使只有一棵子树也要区分是左子树还是右子树。
注意:
二叉树和树是两种树结构。
Ø二叉树的基本形态
二叉树具有五种基本形态:
⑴空二叉树;⑵只有一个根结点;⑶根结点只有左子树;⑷根结点只有右子树;⑸根结点既有左子树又有右子树。
Ø斜树
所有结点都只有左子树的二叉树称为左斜树;所有结点都只有右子树的二叉树称为右斜树;左斜树和右斜树统称为斜树。
斜树的特点:
①每一层只有一个结点,即只有度为1和度为0的结点并且只有一个叶子结点;②斜树的结点个数与其深度相同。
Ø满二叉树
在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
满二叉树的特点:
①叶子结点都在最下一层;②只有度为0和度为2的结点。
Ø完全二叉树
对一棵具有n个结点的二叉树按层序编号,如果编号为i(1≤i≤n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树。
完全二叉树的特点是:
①叶子结点只能出现在最下两层,且最下层的叶子结点都集中在左面连续的位置;②如果有度为1的结点,只可能有一个,且该结点只有左孩子。
Ø二叉树的基本性质
性质1二叉树的第i层上最多有2i-1个结点(i≥1)。
性质2在一棵深度为k的二叉树中,最多有2k-1个结点,最少有k个结点。
性质3在一棵二叉树中,如果叶子结点的个数为n0,度为2的结点个数为n2,则
n0=n2+1。
性质4具有n个结点的完全二叉树的深度为
。
性质5对一棵具有n个结点的完全二叉树中的结点从1开始按层序编号,则对于任意的编号为i(1≤i≤n)的结点(简称为结点i),有:
⑴如果i>1,则结点i的双亲的编号为
;否则结点i是根结点,无双亲;
⑵如果2i≤n,则结点i的左孩子的编号为2i;否则结点i无左孩子;
⑶如果2i+1≤n,则结点i的右孩子的编号为2i+1;否则结点i无右孩子。
Ø二叉树的存储
包括:
二叉树的顺序存储和二叉树的链式存储。
二叉链表的存储结构定义如下:
structBiNode
{
ElemTypedata;
BiNode*lchild,*rchild;
}*root;//root表示二叉链表的头指针
structTriNode
{
ElemTypedata;
TriNode*lchild,*rchild,*parent;//parent指向该结点的双亲
}*root;//三叉链表的头指针
Ø遍历的含义
所谓遍历就是无重复无遗漏地访问。
二叉树的遍历是指从根结点出发,按照某种次序访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。
Ø二叉树的遍历次序定义
前序遍历(或称前根遍历、先序遍历)
若二叉树为空,则空操作返回;否则
⑴访问根结点;
⑵前序遍历根结点的左子树;
⑶前序遍历根结点的右子树。
中序遍历(或称中根遍历)
若二叉树为空,则空操作返回;否则
⑴中序遍历根结点的左子树;
⑵访问根结点;
⑶中序遍历根结点的右子树。
后序遍历(或称后根遍历)
若二叉树为空,则空操作返回;否则
⑴后序遍历根结点的左子树;
⑵后序遍历根结点的右子树;
⑶访问根结点。
层序遍历
二叉树的层序遍历是从二叉树的第一层(根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
Ø线索二叉树的定义
在一个具有n个结点的二叉链表中,利用n+1个空指针域存放指向该结点在某种遍历序列中的前驱和后继结点的指针,这些指向前驱和后继结点的指针称为线索,加上线索的二叉树称为线索二叉树,相应地,加上线索的二叉链表称为线索链表。
Ø线索二叉树的存储结构定义
线索链表中的结点定义如下:
enumflag{Child,Thread};//枚举类型,枚举常量Child=0,Thread=1
structThrNode
{
ElemTypedata;//ElemType表示不确定的数据类型
ThrNode*lchild,*rchild;
flagltag,rtag;
}*root;//root表示线索链表的头指针
Ø树的存储结构
包括:
双亲表示法、孩子表示法、孩子兄弟表示法。
双亲表示法的存储结构定义如下:
#defineMaxSize100;//树中最大结点个数
structPNode//数组元素的类型
{
ElemTypedata;//树中结点的数据信息,
intparent;//该结点的双亲在数组中的下标
};
PNodeTree[MaxSize];
孩子表示法的存储结构定义如下:
structCTNode//孩子结点
{
intchild;
CTNode*next;
};
structCBNode//表头结点
{
ElemTypedata;
CTNode*firstchild;//指向孩子链表的头指针
};
孩子兄弟表示法又称为二叉链表表示法,存储结构定义如下:
structTNode
{
ElemTypedata;//ElemType表示不确定的数据类型
TNode*firstchild;//firstchild指向该结点的第一个孩子
TNode*rightsib;//rightsib指向该结点的右兄弟
};
Ø树转换为二叉树
树转换为二叉树的方法是:
⑴加线——树中所有相邻兄弟结点之间加一条连线;
⑵去线——对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线;
⑶层次调整——以根结点为轴心,将树顺时针转动一定的角度,使之层次分明。
Ø森林转换为二叉树
森林转换为二叉树的方法如下:
⑴将森林中的每棵树转换成二叉树;
⑵从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,当所有二叉树连起来后,所得到的二叉树就是由森林转换的二叉树。
Ø二叉树转换为树或森林
树和森林转换为二叉树的过程是可逆的,将一棵二叉树还原为树或森林的方法如下:
⑴加线——若某结点x是其双亲y的左孩子,则把结点x的右孩子、右孩子的右孩子、……,都与结点y用线连起来;
⑵去线——删去原二叉树中所有的双亲结点与右孩子结点的连线;
⑶层次调整——整理由⑴、⑵两步所得到的树或森林,使之层次分明。
树的遍历序列与二叉树的遍历序列之间的对应关系
根据树与二叉树的转换关系以及树和二叉树遍历的操作定义可知,树的遍历序列与由树转化成的二叉树的遍历序列之间具有如下对应关系:
树的前序遍历序列等于二叉树的前序遍历序列,树的后序遍历序列等于二叉树的中序遍历序列。
Ø哈夫曼树中叶子结点的权值
叶子结点的权值是指对叶子结点赋予的一个有意义的数值量。
Ø二叉树的带权路径长度
设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和称做二叉树的带权路径长度,记为:
WPL=
其中,wk为第k个叶子结点的权值;lk为从根结点到第k个叶子结点的路径长度。
Ø哈夫曼树定义
给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,将其中带权路径长度最小的二叉树称为哈夫曼树,也称为最优二叉树。
Ø哈夫曼算法的基本思想
哈夫曼算法的基本思想是:
⑴初始化:
由给定的n个权值{w1,w2,…,wn}构造n棵只有一个根结点的二叉树,从而得到一个二叉树集合F={T1,T2,…,Tn};
⑵选取与合并:
在F中选取根结点的权值最小的两棵二叉树分别作为左、右子树构造一棵新的二叉树,这棵新二叉树的根结点的权值为其左、右子树根结点的权值之和;
⑶删除与加入:
在F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F中;
⑷重复⑵、⑶两步,当集合F中只剩下一棵二叉树时,这棵二叉树便是哈夫曼树。
Ø图的定义
图是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:
G=(V,E)
其中,G表示一个图,V是图G中顶点的集合,E是图G中顶点之间边的集合。
Ø无向图与有向图
若顶点vi和vj之间的边没有方向,则称这条边为无向边,用无序偶对(vi,vj)来表示;若从顶点vi到vj的边有方向,则称这条边为有向边(也称为弧),用有序偶对
如果图的任意两个顶点之间的边都是无向边,则称该图为无向图,否则称该图为有向图。
Ø简单图
若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。
Ø邻接、依附
在无向图中,对于任意两个顶点vi和vj,若存在边(vi,vj),则称顶点vi和vj互为邻接点,同时称边(vi,vj)依附于顶点vi和vj。
在有向图中,对于任意两个顶点vi和vj,若存在弧
Ø无向完全图、有向完全图
在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。
含有n个顶点的无向完全图有n×(n-1)/2条边。
在有向图中,如果任意两顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。
含有n个顶点的有向完全图有n×(n-1)条边。
Ø稠密图、稀疏图
称边数很少的图为稀疏图,反之,称为稠密图。
Ø顶点的度、入度、出度
在无向图中,顶点v的度是指依附于该顶点的边的个数,记为TD(v)。
在具有n个顶点e条边的无向图中,有下式成立:
在有向图中,顶点v的入度是指以该顶点为弧头的弧的个数,记为ID(v);顶点v的出度是指以该顶点为弧尾的弧的个数,记为OD(v)。
在具有n个顶点e条边的有向图中,有下式成立:
Ø连通图、连通分量
在无向图中,若任意顶点vi和vj(i≠j)之间有路径,则称该图是连通图。
非连通图的极大连通子图称为连通分量。
Ø强连通图、强连通分量
在有向图中,对任意顶点vi和vj(i≠j),若从顶点vi到vj和从顶点vj到vi均有路径,则称该有向图是强连通图。
非强连通图的极大强连通子图称为强连通分量。
Ø邻接矩阵的存储结构定义
假设图G=(V,E)有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:
邻接矩阵的存储结构定义如下:
#defineMaxSize10
typedefstruct
{
ElemTypevertex[MaxSize];//存放图中顶点的信息,ElemType表示不确定的数据类型
intarc[MaxSize][MaxSize];//存放图中边的信息
intvertexNum,arcNum;//图的顶点数和边数
}MGraph;
Ø邻接表的存储结构定义
邻接表是一种顺序存储与链接存储相结合的存储方法,具体方法为:
将顶点vi的所有邻接点链成一个单链表,称为顶点vi的边表(对于有向图则称为出边表),边表的头指针和顶点的数据信息采用顺序存储(称为顶点表)。
所以,在邻接表中存在两种结点:
顶点表结点和边表结点。
其中,vertex:
数据域,存放顶点信息;
firstedge:
指针域,边表的头指针;
adjvex:
邻接点域,存放边该顶点的邻接点在顶点表中的下标;
next:
指针域,指向边表中的下一个结点。
邻接表的存储结构定义如下:
structArcNode//定义边表结点
{
intadjvex;//邻接点域
ArcNode*next;
};
structVertexNode//定义顶点表结点
{
ElemTypevertex;//ElemType表示不确定的数据类型
ArcNode*firstedge;
};
#defineMaxSize10
typedefstruct
{
VertexNodeadjlist[MaxSize];//顶点表
intvertexNum,arcNum;//图的顶点数和边数
}ALGraph;
Ø图的遍历次序定义
深度优先遍历
从图中某顶点v出发进行深度优先遍历的基本思想是:
①访问顶点v;
②从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度优先遍历;
③重复上述两步,直至图中所有和v有路径相通的顶点都被访问到。
广度优先遍历
从图中某顶点v出发进行广度优先遍历的基本思想是:
①访问顶点v;
②依次访问v的各个未被访问的邻接点v1,v2,……,vk;
③分别从v1,v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 基本概念
![提示](https://static.bdocx.com/images/bang_tan.gif)