数据结构
类型
线性结构
-
线性结构是最常用的数据结构
-
特点 数据之间是***一对一***的线性关系
-
线性结构的存储结构分为
-
顺序存储结构(如数组、栈、队列)
顺序存储的线性表称为顺序表
顺序表中存储的元素是连续的
优点
可以通过下标来查找元素 速度快
(对于有序数组 还可以使用二分查找等算法来提高检索速度) 缺点
当要检索更改某个具体的值/插入删除某个值(需要整体移动)时的效率较低 -
链式存储结构(如链表)
链式存储的线性表称为链表
链表中存储的元素不一定是连续的 但元素节点中存放着数据以及相邻元素的地址信息 优点
当要插入删除某个值时的效率较高 缺点
当要进行检索时的效率较低(需要从头开始遍历)
-
非线性结构
- 特点 数据之间是***一对多(二维数组、多维数组、广义表、树)、多对多***(图)的非线性关系
栈
-
栈是一个***先入后出、后入先出的有序列表***
-
栈是一种限制线性表中元素的插入与删除只能在线性表的同一端进行的特殊线性表
-
允许插入与删除的一端为变化的一端 称为栈顶(Top) 另一端为固定的一段 称为栈底(Bottom)
-
在栈中 最先放入的元素在栈底 而最后放入的元素在栈顶
-
且最后放入的元素最先删除 最先放入的元素最后删除
-
元素的插入又称为入栈(push) 元素的删除又称为出栈(pop)!
-
{逆波兰计算器}
链表
-
链表是有序列表 是以节点的方式来进行存储的 是链式存储
-
每个节点都包含data域(存储数据)与next域(存储下一个节点的物理地址信息)
-
对于链表的物理结构(即真实结构 与逻辑结构相对)来说 链表中的各个节点不一定是连续存储的
-
链表分为带头节点的链表与不带头节点的链表
-
类型
-
单(向)链表
查找/遍历的方向只能是从前往后的一个固定方向
-
双(向)链表
可以向前或向后查找/遍历
-
{关于链表的面试题}
-
{约瑟夫环}
队列
-
队列是一个***先入先出、后入后出的有序列表***
-
{环形队列}
稀疏数组
-
当一个数组中的元素大部分为0/同一个值时 此时可以使用稀疏数组来***节省所占用的内存空间***
-
{棋盘}
哈希表
-
又称为散列表
-
是根据关键码值来直接进行访问的一种数据结构
-
即通过把关键码值映射到表中的某一个位置来访问记录以***加快查找的速度***
-
此映射函数叫做散列函数 存放记录的数组叫做散列表
-
{哈希表}
树
-
能提高数据存储、读取的效率
即与顺序存储结构比较 树能提高增删改的效率
而与链式存储结构比较 树能提高查的效率
-
常用术语
-
节点
-
根节点/root
-
父节点
-
子节点
-
叶子节点
即没有子节点的节点
-
路径
即从root开始到此节点的路线
-
路径长度
即通路中分支的数目(若root层为1 则从根节点到第L层节点的路径长度为L-1) -
节点的权
即节点的值 -
节点的带权路径长度
即从root到该节点的路径长度与该节点的权的乘积 -
树的带权路径长度/WPL(Weighted Path Length)
即所有的叶子节点的带权路径长度之和 -
层
root所处的层数为第1层 -
树的高度
即树的最大层数 -
子树
由树的其中一个节点以及其下面的所有节点构成 -
森林
多棵子树即为森林 -
节点的度
即此节点的分支数 -
树的度
即树的各个节点的度的最大值
-
二叉树
即每个节点最多只能有两个子节点的树
-
所有叶子节点都在最后一层/倒数第二层
-
且对于L层从左开始叶子节点得一直连续
-
若途中断开则另一部分一定得为L-1且一直连续到尽头
-
且若右分支的最大层数为L则左分支的最大层数一定为L/L+1的树叫做完全二叉树