线性结构
每个元素最多只有一个出度和一个入度,表现为一条线状。线性表按存储方式分为顺序表和链表。
顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素物理元素也相邻。
链式存储:存储各数据元素的结点的地址并不要求是连续的,数据元素逻辑上相邻,物理上分不开。
栈和队列
队列:先进先出,分队头和队尾
栈:先进后出,只有栈顶能进出
循环队列:最后一个值tail为空,队列满的条件(tail+1)/size = head ,队列空的条件 tail=head
串
字符串是一种特殊的线性表,其数据元素都为字符。
空串:长度为0的字符串。
空格串:由一个或多个空格组成的串,空格是空白字符,占一个字符长度。
子串:串中任意长度的连续字符构成的序列称为子串。含有子串的串称为主串,空串是任意串的子串。
串的模式匹配算法:子串的定位操作,用于查找串子在主串中第一次出现的位置的算法。
基本的模式匹配算法,也称为布鲁特—福斯算法,其基本思想是从主串的第一个字符起与模式串中的第一个字符比较,若相等,则继续逐个字符进行后续的比较;否则从主串中的第二个字符起与模式串中的第一个字符比较,直至模式串中的每个字符依次和主串中的一个连续的字符序列相等为止,此时称为匹配成功,否则称为匹配失败。
KMP算法:对基本模式匹配算法的改进,其改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回溯到主串的字符位置指针,而是利用已经得到的"部分匹配"结果将模式串向右“滑动”尽可能的远的距离,再继续进行比较。
kmp算法详解https://blog.csdn.net/dark_cy/article/details/88698736
数组
定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组中每个数据元素类型相同、结构一致。
矩阵
特殊矩阵:矩阵中元素的分布有一定的规律。常见的特殊矩阵有对称矩阵、三角矩阵和对角矩阵。
稀疏矩阵:在一个矩阵中,非零元素的个数远远少于零元素的个数,且非零元素的分布没有规律。存储方式为三元组结构,即存储每个非零元素的行、列、值。
树
树结构是一种非线性结构,树中的每一个元素都可以有两个或两个以上的直接后继元素,用来描述层次结构关系。
树是n个结点的有限集合(n>=0),当n=0时称为空树,在任一颗非空树中,有且仅有一个根节点;其余结点可分为m(m>=0)个互不相交的有限子集T1,T2...Tm,其中每个Ti又都是一棵树,并且成为根节点的子树。
图
图也是一种非线性结构,图中任意两个节点间都可能有直接关系。相关定义如下:
无向图:图的节点之间连接线是没有箭头的,不分方向。
有向图:图的节点之间连接线是箭头,区分A到B,和B到A是两条线。
完全图:无向完全图中,节点两两之间都有连线,n个节点的连线数为 n*(n-1)/2;有向完全图中,节点两两之间都有互通的两个箭头,n个节点的连线数为n*(n-1)。
度、出度和入度:顶点的度是关联与该顶点边的数目。在有向图中,顶点的度为出度和入度的和。出度是以该顶点为起点的有向边的数目。入度是以该顶点为终点的有向边的数目。
路径:存在一条通路,可以从一个顶点到达另一个顶点,有向图的路径也是有方向的。
连通图和连通分量:针对无向图。若从顶点v到顶点u之间是有路径的,则说明v和u之间是连通的,若无向图中任意两个顶点之间都是连通的,则称为连通图。无向图G的最大连通子图称为连通分量。
强连通图和强连通分量:针对有向图。若有向图任意两个顶点之间都互相存在路径,及存在v到u,也存在u到v的路径,则称为强连通图。有向图中的极大连通子图称为其连通分量。
网:边带权值的图。
图的存储
邻接矩阵:图中有n个节点,则使用n阶矩阵来存储这个图中各节点的关系,若是节点i到j有连线,则矩阵Ri,j=1,否则为0。
邻接链表:用到了两个数据结构,先用一个一维数组将图中所有的顶点存储起来,然后对此一维数组的每个顶点元素,使用链表挂上和稀有连线关系的节点的编号和权值。
图的遍历
深度优先遍历:从任一顶点出发,遍历到底,直至返回,再选取任意其他节点出发,重复这个过程直至遍历完整个图。
广度优先遍历:先访问完一个顶点的所有邻接顶点,而后再依次访问其邻接顶点的所有邻接顶点,类似于层次遍历。
图的最小生成树
普里姆算法:从任意顶点出发,找出与其邻接的边权值最小的,此时此边的另外一个顶点自动加入树集合中,而后再从这个树的所有顶点中找出与其邻接的边权值最小的,同样此边的另一个顶点加入树集合中,依次递归,直至图中所有顶点都加到树的集合中,此时此树就是该图的最小生成树。
克鲁斯卡尔算法:这个算法是从边出发的,因为本质是选取最小的n-1条边,因此就将边按权值大小排序,依次选取权值最小的边,直至囊括所有的节点,要注意每次选边后要检查不能形成环路。
图的拓扑序列
AOV网(以顶点表示活动的网):在有向图中,以顶点表示活动,用有向边表示活动之间的优先关系。
AOV网用来表示大的工程项目执行计划,因此不能出现有向环。若存在则意味着某项活动必须以自身任务的完成为先决条件,因此要检测一个工程是否可行,首先应检查对应的AOV网是否存在回路。检测的方法是对有向图构造其顶点的拓扑有序序列。
构造方法:将有向图的有向边作为活动开始的顺序,若图中一个节点入度为0,则最先执行此活动,而后删除掉此节点和其关联的有向边,再去找其他没有入度的节点,依次进行。