基本概念
数据(data)—能输入到计算机中并被计算机处理的符号的总称
数据元素(data element)—数据的基本单位,也称节点(node)或记录(record)
数据项(data item)—有独立含义的数据最小单位
,也称域(field)
数据对象(Data Object)—性质相同的数据元素的集合。
数据结构(data structure)—相互之间存在一种或多种特定关系的数据元素的集合。(带有结构的数据元素的集合)
(集合):数据元素间除“同属于一个集合”外,无其它关系
线性结构:一对一,如线性表、栈、队列
树形结构:一对多,如树
图状结构:多对多,如图
数据的逻辑结构—只抽象反映数据元素的逻辑关系
数据的存储(物理)结构—数据的逻辑结构在计算机存储器中的实现
数据的逻辑结构与存储结构密切相关
算法设计------>逻辑结构
算法实现------>存储结构
抽象数据类型
抽象数据类型(ADT)—是指一个数学模型(数据结构)以及定义在该数学模型(数据结构)上的一组操作。
抽象数据类型的三元组表示
抽象数据类型={D,S,P}
D是数据对象;
S是D上的关系集;
P是对D的基本操作集
算法和算法分析
算法特性:
1.有穷性—一个算法必须在执行有限步骤之后结束
2.确定性—算法的每一步必须是确切定义的,不能产生二义性,并且算法只有唯一的一条执行路径
3.可行性—算法是能行的,通过已经实现的基本运算执行有限次来是实现
4.输入—一个算法有零个或多个输入
5.输出—一个算法至少有一个输出
算法的评价—衡量算法优劣的标准:
1.正确性—算法应该满足特定的“规格说明”方式给出的需求
2.可读性—算法主要是为了人的阅读和交流,其次才是为计算机执行。
3.健壮性—当输入的数据非法时,算法应当做出反映或进行相应的处理
4.算法的高效性与低存储量需求
时间开销—时间复杂度
空间开销—空间复杂度
时间复杂度的计算方法:
1.找出频度最大的基本操作;
2.计算最坏情况或平均情况下语句的频度;
(最坏时间复杂度和平均时间复杂度)
3.最后的函数中去掉常量及阶小的项。
ps:时间复杂度有“平均时间复杂度”和“最坏时间复杂度”之分,两者可能一致也可能不一致。
线性表
定义:
零个或多个数据元素的有限序列
线性表有序序列,数据元素具有相同的特性,线性表可以有无性
线性结构特点:
1.有序性
数据元素之间是(一对一)的关系
2.有限性
线性表的元素个数是有限的
ps 零个数据元素线性表叫空表
存在唯一的一个被称作“第一个”的数据元素
存在唯一的一个被称作“最后一个”的数据元素
除第一个外,集合中的每个数据元素均只有一个前驱
除最后一个外,集合中的每个数据元素均只有一个后继
顺序表:
定义:用一组地址连续的存储单元依次存放一个线性表的元素。
顺序存储结构的优缺点:
优点:
1.逻辑相邻,物理相邻
2.可随机存取任一元素
3.存储空间使用紧凑
缺点:
1.插入、删除操作需要移动大量的元素
2.预先分配空间需按最大空间分配,利用不充分
3.表容量难以扩充
链表:
定义:用一组地址任意的存储单元存放线性表中的数据元素
单链表的优缺点:
优点:
1.它是一种动态结构,整个存储空间为多个链表共用
2.不需预先分配空间
3.删除插入快
缺点:
1.不能随机存取,查找速度慢
2.指针占用额外存储空间
循环链表(circular linked list)
循环链表是表中最后一个结点的指针指向头结点,使链表构成环状
特点:从表中任一结点出发均可找到表中其他结点,提高查找效率
操作与单链表基本一致,循环条件不同(判最后一个结点):
单链表 p->next=NULL
循环链表 p->next=head
空链表示意图:
非空链表示意图:
双向链表(double linked list)
双向链表支持两个方向,每个节点有一个后继指针next指向后面的节点,还有一个前驱指针指向前面的节点
栈&&队列
定义:
栈(stack) 是一个后进先出的线性表(LIFO),他要求只在表尾进行删除和插入操作
队列(queue)是只允许在一端进行插入,在另一端进行删除操作的线性表,和栈不同的是,队列先进先出(FIFO);
树
定义
树(tree)是n(
n
≥
0
n\geq0
n≥0)个结点的有限集。当n=0是为空树。
在任意一棵非空树中:
1.有且只有一个称为根(root)的结点。
2.当n>1时,其余结点可分为m(m>0)个互不相交的有限集,每一个集合本身也是一棵树,称为根的子树。
结点拥有的子树数称为结点的度,树的度取树内的各结点的度的最大值。
1.度为0的结点称为叶结点(leaf)或终端结点
2.度不为0的结点称为分支结点或非终端结点,除根结点外,分支结点也称为内部结点
树中结点的最大层次称为树的深度(depth)或高度
二叉树
二叉树(binary tree)每个结点最多(不是一定)有两个子树,所以二叉树中不存在度大于2的结点。
基本形态
1.空二叉树
2.只有一个根结点
3.根结点只有左子树
4.根结点只有右子树
5.根结点既有左子树也有右子树
特殊二叉树
斜树
每个结点只有左儿子(左斜树)或者右儿子(右斜树)
满二叉树
所有的分支节点都有左子树和右子树,并且所有叶子在同一层上,这样的二叉树称为满二叉树。
1.叶子只能出现在最下一层
2.非叶子结点的度一定是2
3.在同样深度的二叉树中,满二叉树的结点个数一定是最多,同时叶子也是最多
完全二叉树
设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
1.叶子结点只能出现在最下两层
2.最下层的叶子一定集中在左部连续位置
3.倒数第二层若有叶子结点,一定都在右边连续位置
4.如果结点的度为1,那么该结点只有左儿子
5.同样结点树的二叉树,完全二叉树的深度最小
ps:完全二叉树不一定是满二叉树,满二叉树一定是完全二叉树
二叉树性质
1.在二叉树的第i层上至多有2i+1个结点(
i
≥
1
i \ge 1
i≥1)
2.深度为k的二叉树至多有2k-1个结点(
k
≥
1
k\ge 1
k≥1)
3.对任意一棵二叉树,如果其终端结点树为
n
0
n_0
n0,度为2的结点树为
n
2
n_2
n2,则
n
0
=
n
2
+
1
n_0=n_2+1
n0=n2+1
4.具有n个结点的完全二叉树的深度为
⌊
log
2
n
⌋
\left \lfloor \log_2n \right \rfloor
⌊log2n⌋+1(向下取整)
5.如果对一个有n个结点的完全二叉树(深度
⌊
log
2
n
⌋
\left \lfloor \log_2n \right \rfloor
⌊log2n⌋+1)的结点按层序编号,对任意结点i(1<=i<=n)有以下性质
(1)如果i=1,则结点i是二叉树的根,无双亲;如果i>1,则双亲的结点是 ⌊ i 2 ⌋ \left \lfloor \frac i2 \right \rfloor ⌊2i⌋
(2)如果2i>n,则结点i无左儿子(结点i就是叶子结点);否则左儿子为结点2i
(3)如果2i+1>n,则结点i无右儿子;否则右孩子是结点2i+1
线索二叉树
充分利用二叉链表中的空链域,将遍历过程中结点的前驱、后继信息保存下来。
1.若结点有左子树,则其 LChild 域指向其 左孩子,否则 LChild 域指向其 前驱结点。
2.若结点有右子树,则其 RChild 域指向其 右孩子,否则 RChild 域指向其 后继结点。
图
定义:
图(graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中的顶点的集合,E是图G中边的集合。
注意点:
1.线性表可以没有元素,称为空表,树中没有结点,叫做空树,而图结构强调顶点集合V要有穷非空。
2.线性表中,相邻的数据元素之间有线性关系,数据结构中,相邻两层的结点具有层次关系,而图结构中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。
无向边:若顶点 v i v_i vi到 v j v_j vj之间的边没有方向,则称这条边为无向边(edge),用无序偶( v i , v j v_i,v_j vi,vj)来表示。
有向边:若顶点 v i v_i vi到 v j v_j vj之间的边有方向,则称这条边为有向边,也称为弧(arc),用无序偶< v i , v j v_i,v_j vi,vj>来表示, v i v_i vi称为弧尾, v j v_j vj称为弧头。
简单图:在图结构中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。
无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。含有n个顶点的无向完全图有n*(n-1)/2条边。
有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。含有n个顶点的无向完全图有n*(n-1)条边。
稀疏图和稠密图:这里的稀疏和稠密是模糊的概念,都是相对而言的,通常认为边或弧数小于n* log n \log n logn(n是顶点的个数)的图称为稀疏图,反之称为稠密图。
网:有些图的边或者弧带有与它相关的数字,这种与图的边或弧相关的数叫做权(weight),带权的图通常被称为网(networt)。
子图:假设有两个图G1=(V1,E1)和G2=(V2,E2),如果V2 ⊆ \subseteq ⊆V1,E2 ⊆ \subseteq ⊆E1,则称G2为G1的子图(subgraph)
图的顶点和边之间的关系:
1.对于无向图G=(V,E),如果边(V1,V2) ⊆ \subseteq ⊆ E,则称顶点V1和V2互为邻接点(adjacent),即V1和V2相邻接。边(V1,V2)依附(incident)于顶点V1和V2,或者说边(V1,V2)与顶点V1和V2相关联。
顶点V的度(degree)是和V相关联的边的数目,记为TD(V)。2.对于有向图G=(V,E),如果边<V1,V2> ⊆ \subseteq ⊆ E,则称顶点V1邻接到顶点V2,顶点V2邻接自顶点V1。
以顶点V为头的弧的数目称为V的入度(indegree),记为ID(V);以顶点V为尾的弧的数目称为V的出度(outdegree),记为OD(V),因此顶点V的度为TD(V)=ID(V)+
OD(V)。
无向图G=(V,E)中从顶点V1到顶点V2的路径(path)
路径的长度是路径上的边或弧的数目。
简单回路或简单环:第一个顶点到最后一个顶点相同的路径称为回路或环(cycle)
简单回路或简单环:序列中顶点不重复出现的路径称为简单路径,除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环
连通图:在无向图G中,如果从顶点V1到顶点V2有路径,则称V1和V2是连通的,如果对于图中任意两个顶点 V i , V j V_i,V_j Vi,Vj是连通的,则称G是连通图(connectedgraph)
强连通图:在有向图G中,如果对于每一对顶点 V i , V j V_i,V_j Vi,Vj都存在路径,则称G是强连通图
强连通分量:有向图中的极大强连通子图称为有向图的强连通分量
图的生成树:一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵数的n-1条边。
有向树:如果一个有向图恰有一个顶点入度为0,其余顶点的入度为1,则是一棵有向树。