常用数据结构
文章目录
1. 数组
1.1 数组特征
数组应该是最常用的的数据结构了
- 固定长度
- 有序的元素序列
- 连续的存储空间(需要一整块空间)
- 依据下标方便连续查询
1.2 使用示例:
int[] a = new int[10];
for (int i = 0; i < 10; i++){
a[i] = i;
}
for (int i = 1; i <= a.length; i++){
System.out.println("这是数组第"+i+"个元素:"+a[i-1]);
}
输出示例:
这是数组第1个元素:0
这是数组第2个元素:1
这是数组第3个元素:2
这是数组第4个元素:3
这是数组第5个元素:4
这是数组第6个元素:5
这是数组第7个元素:6
这是数组第8个元素:7
这是数组第9个元素:8
这是数组第10个元素:9
1.3 小结:
- 数组下标从0开始
- 声明时就要确定数组长度
- 可以通过下标随机取数
- 无论数组是否存储元素,其占用空间是固定的
关于ArrayList(等待一个超链接)
2. 链表
2.1 链表特征
链表与数组一样,都是一个基本的数据存储结构
- 非连续的线性存储空间(内存空间可以不相邻)
- 动态申请空间(需要使用在申请空间)
- 插入删除操作只需要改相邻节点的指针即可
2.2 链表分类
- 单链表 :每个节点有指向下个节点的指针
- 双链表:每个节点有指向下个节点和上个节点的指针
- 循环链表:首收尾节点相连
2.3 常见面试问题:
- 链表与数组有什么区别?各自的应用场景
- 链表反转
- 计算循环链表的的长度
- 找到一个链表的中间节点
2.4 链表实际应用场景
- LinkedList
- 栈
- 队列
2.5 小结
- 链表是一个线性,存储空间不连续,动态申请存储空间的数据结构
- 能够根据头节点做做所有操作
- 其插入与删除代价小,但是遍历费劲
- 常见的应用场景有:LinkedList,队列,栈
3. 栈
3.1 栈的特征
- 先进后出的数据结构
- 可以用数组或链表实现
栈主要的特点就是先进后出(或者说后进先出),例如杯子里沙子(本来想用水举例,但怕有人用吸管杠我),先倒出来的是后倒进去的
4. 队列
4.1 队列的特征
- 先进先出数据结构
- 可以用数组或链表实现
4.2 队列的分类
- 普通队列:进出再一个口子
- 双端队列:两头可以进出或一端进一段出
4.3 应用场景
- 消息队列
- 线程池里面的线程容器
5. 树
5.1 树的特征
- 形态像一个倒挂的树,叶子朝下(不然也不称为树了)
- 每个节点有0或多个子节点
- 每个节点有0个或1个父节点
- 根节点没有父节点
- 叶子节点没有子节点
树的高度:根节点到子节点的最少节点是就是树的高度
5.2 几种特殊的树
5.2.1 二叉树
- 每个节点最多有两个子节点
- 无序
5.2.2 二叉查找树
- 二叉树的一种
- 有序
- 左子节点比自己小,又子节点比自己大
- 极端情况下就是一个普通链表(例如插入1,2,3,4,5,6,7这种情况)
- 为了使分布筋可能均匀,提出平衡二叉树的概念
5.2.3 AVL树
- 平衡二叉树的一种
- 树的高度差最多为1
- 通过旋转使其平衡
5.2.4 红黑树
- 平衡二叉树树的一种
- 有红色和黑色两种节点
- 根节点是黑色
- 所有叶子节点都是黑色(叶子节点是null节点)
- 红色节点的子节点一定是黑色
- 任意节点到其叶子节点的所有路径都包含有相同数目的黑色节点
5.2.5 B树
- 是一个有序树(不然也不会用来做索引了)
- 参考二叉树定义,B树是一颗多叉平衡查找树
- 根节点至少有两个子节点
- B树的每个节点都会存储数据
图片来与网络
B树其实就可以参考二叉树理解,只不过其容纳子节点更多,导致树高更矮,查找效率高
5.2.6 B+树
- 与B树类似
- 只有叶子节点才存储数据,非叶子节点存储数据
- 叶子节点有相邻节点的指针,可以进行范围查找
图片来源于网络
5.3 常见相关面试题
- 用Java实现二叉查找树
- MySQL和MangoDB的索引的特点及区别
- HashMap的结构特点
6.小结
- 数组是最简单的数据结构:占用空间固定,随机查找快
- 链表动态申请空间,空间不连续,插入和删除代价低
- 面试一般最难不过手写二叉树,但是需要知道B树和B+树的特征
博客结语
-
今天写博客效率比昨天(集合+泛型)高不少,而且排版美观了许多
-
主要是找定位,明确了要写的范围。有些详细的可以再开博文写,不要试图全部叠加再一起,那样很乱
-
今天还差两篇复习 虚拟机+Redis
神欢体自轻,意欲凌风翔 博主:五更依旧朝花落