线性表
顺序表:元素在内存当中以顺序存储
链表:离散单独一个一个点,通过指针联系起来
(单链表)指针指向下一个元素地址
(循坏链表)尾元素指针指向首元素地址
(双链表)双链表头尾指针指向上一个元素及下一个元素的地址
栈:先进后出
队列:先进先出
循坏队列:入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,队空和队满时头尾指针均相等,使用求余运算可以判断队列是否已满。
树
树的基本概念:略
树的遍历(先序,后序,层次)
二叉树
满二叉树:二叉树上所有节点都是充实饱满的
完全二叉树:有N层,N-1就是满树,最后一层节点从左至右排列。
二叉树的遍历(先序,中序,后序,层次)
树转二叉树:对于任何一个节点树的孩子节点作为他转成二叉树的左子树节点。树的兄弟节点变成右子树节点。(树只留最左边孩子节点的线,兄弟节点连起来)
查找二叉树(二叉排序树)
查找二叉树的基本操作(查找,新增,删除):略
最优二叉树(哈夫曼树):叶子结点权乘以树高度(根为0)用户压缩数据。常用与数据压缩。
最优二叉树的构造,一组集合中,最小二个数先做兄弟节点,组成后的父节点权值为子节点相加,再和最小数结合组成新数,以此类推,如下图
哈夫曼编码:左子树边为0右子树边为1。
线索二叉树:排序二叉树查找就要遍历,就要递归 ,二叉树的存储结构 Lchild | data | Rchild 叶子节点就造成空间浪费。由此左指针指向前驱,右指针指向后继,此时叫线索 Lbit | Lchild | data | Rchild | Rbit 1 代表线索,0代表常规指针。用户数据的存储不浪费。
先序举一个
二叉树转前序(中序,后序)线索数:先写出前序个节点顺序,叶子节点的前驱和后继就很明朗了。
平衡二叉树:是衡量排序二叉树结构是否合理的一个指标(使综合每个节点查找次数最低)
图
树与图关系:树只是图的一种特殊形式,树有回路就是图了
图的基本概念:有限非空顶点集合,边集
有向图<>,无向图()
顶点的度:与之关联的边,有向图(出度,入度)
子图:略
完全图:每对顶点之间都有一条边相连,每对顶点之间都有二条边相连
路径:路径是由边组成的,起点到终点,所经历边的序列
回路:一个点出发,又回到这一个点
简单回路:除了起点和终点相同,路径序列其他点都不相同
强连通图:每两点,都有路径可以到达(有向图中,隔点能到达也行)
连通分量:一个图割离开来分成几部分,每部分都是连通图。
网络:图加上边的权值。
图的存储
邻接矩阵:N个结点,用N阶方阵存放图中个结点关联信息。网络邻接矩阵,方阵不在填值,填权值,没边填-1。
邻接表:N个结点,N个列表, V1--- |V2|权值|指针|--- |V4|权值|null
当图中的边远远小于顶点数时,邻接矩阵就成了 稀疏矩阵,造成空间浪费。
图的遍历:深度优先算法 | 广度优先算法
深度算法DFS
要回退
广度BFS
最小生成树:各城市建网络需要覆盖,又要最低成本
实现一:普里姆算法 目标集合以一个出发点扩充完整数(扩充的点并到集合里),每次寻找于集合最短的点。
实现二:克鲁斯卡尔 算法:点都分离出来,每次选取最小边直到全联通
拓扑排序和关键路径
AOV网:有向边表示活动之间开始的先后关系
拓扑排序:任务的先后执行顺序
AOE网:AOV的基础上加上边的权值
关键路径:AOE中最长的路径
边的最早开始时间:发出顶点的最早开始时间
顶点的最早开始时间:到达顶点的最长路径
哈希表
相比于树和图,哈希表不经过任何比较,直接找到关键字
概念:根据内容通过一定运算,直接得到他的存储地址
冲突:关键字不同,求出的hash地址相同
哈希函数:运算过程 ,衡量标准:冲突避免
处理冲突的方法:
开放地址法:当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。
拉链法:散列列表每个节点增加一个指针字段,用于链接同义词子表,链表中的结点都是同义词
hash表查找:探测几次把数据存入,查找的时候也要几次查找出来
平均查找长度:所有元素的查找长度累加 / 元素个数