线性结构
顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的元素物理上也相邻
逻辑存储:存储各数据元素的结点的地址并不要求是连续的,数据元素逻辑上相邻,物理上分开
链表存储缺点:数据元素之间的关系需要占用存储空间,导致存储密度不高
矩阵
稀疏矩阵 三对角矩阵 对称矩阵
广义表
广义表一般记为:LS=(a1,a2,……,an)
LS是表名,ai是表元素
递归定义的重数就是广义表的深度,即定义中所含括号的重数(单边括号的个数,原子的深度为0,空表的深度为1)
取表头:广义表第一个表元素,可以是子表也可以是单元素
取表尾:广义表中,除了第一个表元素之外的其他所有表元素构成的表,非空广义表的表尾必定是一个表,即使表尾是单元素
树
树结构是一种非线性结构,树中的每一个数据元素可以有两个或两个以上的后继元素。
二叉树与树的区别是每个根节点最多只有两个孩子结点
性质
-
对于任何一棵二叉树,其终端结点数为n0,度为2的结点数(双分支)为n2,度为1的结点数(单个分支)为n1,则n0=n2+1,总结点数:n=n0+n1+n2,总分支数:m=n1+n2*2
满二叉树:每一层都是满结点的
完全二叉树:第k-1层是满结点的,第k层从左到右是满结点的
满二叉树一定是完全二叉树
二叉树的链式存储结构:一般用二叉链表来存储二叉树节点,二叉链表中除了该节点本身的数据以外,还存储左孩子结点指针、右孩子结点的指针,即1个数据+2个指针,头指针指向根节点
前序遍历(根左右) 中序遍历(左根右)后序遍历(左右根)层次遍历(自上而下,从左到右)
三叉链表有3个指针:父指针,左右孩子指针
线索二叉树
引入线索二叉树是为了保存二叉树遍历时某节点的前驱节点和后续节点的信息
若n个节点的二叉树使用二叉链表存储,则必然有n+1空指针域
因为每个节点有2个左右孩子指针域,而根节点又不是左右孩子指针域,每个节点只占用左或者右孩子指针域,所以2n-(n-1)=n+1
这些空指针域来存放节点的前驱和后继节点信息,但是需要增加2个标志,以区分指针域存放的到底是孩子结点还是遍历结点
ltag | lchild | data | rchild | rtag |
---|---|---|---|---|
0/1 | 0/1 |
当ltag为0时,表示lchild域指示结点的左孩子,如果为1,表示lchild域指示结点的直接前驱
当rtag为0时,表示rchild域指示结点的右孩子,如果为1,表示rchild域指示结点的直接后继
最优二叉树(哈夫曼树)
树的路径长度:根节点到达每一个叶子结点之间的路径长度之和
权:节点代表的值
权值等于叶子结点的值
结点的带权路径长度:该结点到根节点之间的路径长度乘以该节点的权值
定长编码:码长计算2^n>=字符数6,则需要3个码长
树的带权路径长度(树的代价)WPL:树的所有叶子结点的带权路径长度之和
树和二叉树的转换
规则是:树的最左边节点作为二叉树的左子树,树的其他兄弟节点作为二叉树的右子树节点。
掌握:采用连线法,将最左边节点和其兄弟节点都连接起来,而原来的父节点和兄弟节点的连线则断开
查找二叉树
查找二叉树特点:左子树小于根节点小于右子树
二叉排序树的查找效率取决于二叉排序树的深度
中序遍历得到的序列是有序序列
平衡二叉树
特点:任意左右子树层次相差1或0或-1
平衡度:左子树深度减去右子树深度,就得到了该节点的平衡度
图
矩阵:如果是一个无向图,肯定是沿对角线对称 稠密图
邻接链表:用到2个数据结构,先用一个一维数组将图中所有顶点存储起来,而后,对此一维数组的每个顶点元素,使用链表挂上和其有连线关系的结点的编号和权值 稀疏图
完全图适合采用邻接矩阵存取
边的多少决定了单链表中的结点数,完全图就是边多,所以不采用邻接链表
遍历
-
深度优先遍历:从任一顶点出发,遍历到底,直至返回,再选取任一其他节点出发,重复这个过程直至遍历完 整个图(邻接矩阵时间复杂度:O(n^2) 邻接表时间复杂度:O(n+e)
-
广度优先遍历(队列)(考虑相邻):先访问完一个顶点的所有邻接顶点,而后再依次访问其邻接顶点的所有邻接顶点,类似于层次遍历
最小生成树
普里姆算法:利用顶点集合中找出邻接边最小
克鲁斯卡尔算法(推荐):直接依次找出边最小就行
这2个算法使用了贪心设计策略
网稠密代表边多,则选择用Prim算法,因为Kruscal算法与边数相关,边越多越不利于选取
图的拓扑序列
AOV网表示工程项目执行图:可行条件:检查对应的AOV网是否存在回路
若图中一个节点入度为0,则应该最先执行该活动,删除入度为0
向优先队列插入一个元素时间复杂度:O(lgn)
算法
有穷性、确定性、可行性、输入(0~n)、输出(1~n)
折半查找的时间复杂度为:O(log2 n)
哈希查找
线性探测法:按物理地址顺序取下一个空闲的存储空间
伪随机数法:将冲突的数据随机存入任意空闲的地址中
排序
插入类排序:直接插入排序、希尔排序
交换类排序:冒泡排序(归位)、快速排序(归位)
选择类排序:选择排序(归位)、堆排序(归位)
大顶堆:递增
归并排序(两两归并)
基数排序
对于基本有序整数进行排序,最优插入排序,时间复杂度:O(n) 空间复杂度 O(1),最坏快速排序,时间复杂度:O(n^2) 空间复杂度:O(n)
分治法
凡是涉及到分组解决的并且可以递归都是分治法(二分查找、归并排序、快速排序、希尔排序)
回溯法
思路:先一直探测,当不成功时再返回上一层(迷宫)深度优先
动态规划法
思路:分组解决但是不能递归(列表格找出最优解)全局最优
贪心法
思路:局部当中取最优,一般全局不会最优
例子:最短路径
经典算法
0-1背包问题,物品是一个整体,要么全放进去要么不放进去
部分背包问题,物品是可以拆分的,例如可以放1/3重量的该物体进去
分支限界法
与回溯法区别:
-
求解目标是找出满足约束条件的一个解
-
以广度优先或以最小耗费(最大收益)优先的方式搜索解空间树
概率算法
应用:随机选择下一步该如何进行;如果一个问题没有有效的确定性算法可以在一个合理的时间内给出解,但是该问题可以接收小概率错误
近似算法
基本思想:放弃求最优解,而是用近似最优解代替最优解
数据挖掘算法
基本思想:分析爆炸式增长的各类数据的技术(核心是算法)
主要功能:分类、回归、关联规则和聚类
智能优化算法
基本思想:以思想为基础
-
最长公共子系列暴力法:时间复杂度:n*2^n
-
最长公共子系列动态规划法:时间复杂度:n^2
-
多重矩阵时间复杂度:n^3 空间复杂度:n^2 动态规划法