# 数据结构
# 1线性表
# 1.1顺序表
# 1.2链表
定义链表,定义结点
# 1.3栈
后进先出。
# 1.4队列
先进先出、后进后出。队首指针永远指向数据,队尾指针永远指空。
循环队列:首尾相接的队列,一般认为队列中少一个元素为满队列。
# 2.1串
串就是字符版的线性表,有顺序结构和链式结构。与线性表不同之处在于串可以连续几个元素连接以后再指针。
# 2.2数组
一维数组是线性结构;
数组压缩:相同元素压缩。***哪些数组可以压缩?***对角矩阵、对称矩阵、稀疏矩阵、三角矩阵。
# 2.3广义表
相对于线性表中(每一项不能有结构,只能有单纯元素),广义表中每一项元素都可以有自己的结构,意味着广义表中可以有表作为元素。广义表中有表头与表尾,**统一规定:**第一个元素为表头,剩下的元素为表尾。
# 3树
# 3.1树的概念
每个结点只有一个父节点、同一层结点不可能相连接。
**结点的度:**结点拥有的子树数量;
**树的度:**树上各节点度的最大值;
叶子结点:度为0的结点,又称为终端节点;
森林:m棵互不相交的树的集合。
# 3.2二叉树的概念
二叉树每个节点至多有两棵子树;
二叉树子树有左右之分,次序不能颠倒;
二叉树中即使只有一棵子树也要区分左右。
# 二叉树的性质
i层结点数为 $2^{i-1}$;
i层结点总数为$2^k-1$;
几个重要公式:
边m与结点n关系:n = m + 1;
m = $n_0$*0+$n_1$*1+$n_2$*2$=$$n_0$+$n_1$+$n_2-1$;
$n_2$=$n_0-1$
# 3.3完全二叉树
叶子节点优先集中到最左边。
对于有n个节点的完全二叉树,那么深度为**$【log_2n-1】$**;第i个结点:
- i=1,结点就是根;i>1,结点就是$\frac{i}{2}向下取整$;
- 2i >n,结点无孩子;2i=n,结点只有左孩子n;
- 2i+1>n,结点无右孩子;2i+1=n,结点只有右孩子n
# 3.4二叉树的存储结构
顺序存储:主要用于完全二叉树,如果不是完全二叉树,那么浪费空间较大;
链式存储:每个节点存在至少两个孩子指针
# 3.5树的遍历:
先序遍历:根左右
中序遍历:左根右
后序遍历:左右根
层级遍历:每一层每一层遍历
# 3.6哈夫曼树(最优树)
权值:叶子节点权重乘以层数求和。
哈夫曼树是一种特殊的二叉树构造哈夫曼树的方法:把权值小的放在底层。(每次选两个)
# 4图
# 4.1图的定义与术语
G=(V,E),其中V是顶点集,E是边集。图不可能为空,至少有一个顶点。
- 有向图:边有向,改称弧<$v_i,v_j$>。
完全无向图:每个顶点之间有边连接;
完全有向图:每个顶点之间有两个方向相反的弧形连接。
度数:无向图度数之和等于边数的两倍;有向图入度之和等于出度之和等于边数。
连通图:对于无向图,至少存在一条路径使任意两个结点相连接,那么就是连通图;
弱连通图:对于有向图,忽略方向,至少存在一条路径使使任意两个结点相连接;
强连通图:对于有向图,不忽略方向,至少存在一条路径使使任意两个结点相连接。
# 4.2图的存储结构
- 邻接矩阵
- 邻接表:各个结点以顺序表形式存储,结点连接的其他结点通过链表存储。
# 4.3图的遍历
- 深度优先遍历:起始点不同,有不同的遍历路径
- 广度优先遍历(使用队列实现遍历)
# 4.4图的应用
拓扑排序:输出入度为0的结点,然后删去该结点以及连接路径,继续重复。直到所有结点全都输出一次。如果还有节点没有输出,说明该AOV网络存在环,不能构成拓扑排序。
# 5概念
# 5.1时间复杂度
当作次数,运行次数之和再取大O。
对于循环,如果没有指定循环的次数n,那么就是循环n次,如果指定了循环次数,那么就是指定的循环次数,为常数。**特别的,如果循环中出现了指数级增长,需要考虑能运行多少次,最后可能会出现对数形式,那么取大O就是O($logn$)。
# 5.2空间复杂度
衡量占用空间量和输入数据规模之间的关系。
- 定义的一般变量,空间复杂度就是O(1);
- 定义了长度为n的数组或者链表,空间复杂度就是O(n);
- 定义了二维数组,那么空间复杂度就是O($n^2$)。
# 6哈希表
相当于一个字典,给一个值找出相应的单词。
# 6.1实现方式
数组+链表(每个数组都指向链表)
# 6.2原理
附带一个键值对,键用来寻找(遍历)、值用来插。因此同时利用了数组和链表的优点。