常用数据结构概览

常用数据结构

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 常见面试问题:
  1. 链表与数组有什么区别?各自的应用场景
  2. 链表反转
  3. 计算循环链表的的长度
  4. 找到一个链表的中间节点
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树

B树其实就可以参考二叉树理解,只不过其容纳子节点更多,导致树高更矮,查找效率高

5.2.6 B+树
  • 与B树类似
  • 只有叶子节点才存储数据,非叶子节点存储数据
  • 叶子节点有相邻节点的指针,可以进行范围查找
    图片来源于网络
    在这里插入图片描述
5.3 常见相关面试题
  • 用Java实现二叉查找树
  • MySQL和MangoDB的索引的特点及区别
  • HashMap的结构特点

6.小结

  • 数组是最简单的数据结构:占用空间固定,随机查找快
  • 链表动态申请空间,空间不连续,插入和删除代价低
  • 面试一般最难不过手写二叉树,但是需要知道B树和B+树的特征

博客结语

  • 今天写博客效率比昨天(集合+泛型)高不少,而且排版美观了许多

    扫描二维码关注公众号,回复: 10465596 查看本文章
  • 主要是找定位,明确了要写的范围。有些详细的可以再开博文写,不要试图全部叠加再一起,那样很乱

  • 今天还差两篇复习 虚拟机+Redis

      											神欢体自轻,意欲凌风翔
      											博主:五更依旧朝花落
    
发布了35 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/m0_37628958/article/details/105238281