Java基础 第三节 第十课

概述

当你用着 Java 里面的容器类一把一把的掉头发的时候, 你有没有想过, 怎么 ArrayList 就像一个无限扩充的数组, 也好像链表之类的. 这就是数据结构的用处, 只不过你在不知不觉中使用了.

现实世界的存储, 我们使用的工具和建模. 每种数据结构有自己的优点和缺点, 想想如果苍老师的数据是用数组存储, 我们还能方便的查询到所需要的数据吗? 而算法, 在这么多的数据中如何做到最快的插入, 查找, 删除, 也是在追求更快.

我们 Java 是面向对象的语言, 就好似自动档轿车, C 语言好似手动挡吉普. 那么数据结构就是变速箱的工作原理. 你可以完全不知道变速箱怎么工作, 就把自动挡的车子从 A 点开到 B 点, 而未必就比懂的人慢. 写程序这件事和开车一样, 经验可以起到很大的作用. 如果你不知道底层是怎么工作的, 就永远只能开车而不会修车, 也不能造车. 当然了, 数据结构的内容不叫多, 系统的学习也是相对费功夫的. 我们常见的数据结构: 堆栈, 队列, 数组, 链表和红黑树. 今天我来给大家介绍一下, 作为数据结构的入门, 了解一下它们的特点即可. ( 详细的数据结构教程可以参阅我写的 <Python 数据结构>)
在这里插入图片描述

常见的数据结构

数据储存的常用结构有: 栈, 队列, 数组, 链表和红黑树. 我们分别来了解一下:

栈 (stack): 又称堆栈, 它是运算受限的线性代表. 其限制是仅允许在表的一端进行插入和删除操作, 不允许在其他任何位置进行添加, 查找, 删除等操作.

采用该结构的集合, 对元素的存取有如下的特点:

  • 先进后出 (即, 存进去的元素, 要在它后面的元素依次取出后, 才能取出该元素) 例如, 子弹压进弹夹, 先压进去的子弹在下面, 后压进去的子弹在上面. 当开枪时, 先弹出上面的子弹, 然后才能弹出下面的子弹
  • 栈的入口, 出口都是栈的顶端位置
    在这里插入图片描述

这里两个名词需要注意:

  • 压栈: 就是存储元素. 即把元素存储到栈顶端位置. 栈中已有的元素依次向栈底方向移动一个位置
  • 压栈: 就是提取元素. 即把栈的顶端位置元素取出, 栈中已有的元素依次向栈顶方向移动一个位置

队列

队列 (quene): 简称队, 它同栈一样, 元素一种运算受限的线性表. 其限制是仅允许在表的一端进行插入, 而在表的另一端进行删除.

采用该结构的集合, 对元素的存取有如下的特点:

  • 先进先出 (即存进去的元素, 要在它前面的元素依次取出后, 才能取出该元素). 例如, 小火车过山进洞, 车头先进去, 车尾后进去; 车头先处理, 车尾后出来.
  • 队列的入口, 出口各在一侧. 例如, 下图的左侧为入口, 右侧为出口.
    在这里插入图片描述

数组

数组 (Array): 是有序的元素序列, 数组是在内存中开辟一段连续的空间, 并在此空间存放元素. 就像是一排出租屋, 有 100 个房间, 从 001 到 100 每个房间都有固定的编号, 通过便后就可以快速找到租房子的人.

采用这种数据结构的集合, 对元素的存取有如下的特点:

  • 查找元素快: 通过索引, 可以快速访问指定位置的元素
    在这里插入图片描述
  • 指定索引位置增加元素: 需要创建一个新数组, 将指定新元素存储在指定索引位置, 再把原数组元素根据索引, 复制到新数组所对应索引的位置. 如下图:
    在这里插入图片描述
  • 指定位置删除元素: 需要创建一个新数组, 把原数组元素根据索引, 复制到新数组对应索引的位置, 元素中指定索引位置元素不复制到新数组中. 如下图:
    在这里插入图片描述

链表

链表 (linked list): 由一系列节点 (node: 链表中每一个元素称为节点) 组成, 节点可以在运行时动态生成. 每个节点包括两个部分: 一个是存储数据元素的数据域, 另一个是存储下一个节点地址的指针域. 我们常说的链表结构有单向链表与双向链表, 那么这里给大家介绍的是单向链表.
在这里插入图片描述

采用该结构的集合, 对元素的存取有如下的特点:

  • 多个节点之间, 通过地址进行连接. 例如, 多个人手拉手, 每个人使用自己的右手拉住下个人的左手, 以此类推, 这样多个人就连在一起了.
    在这里插入图片描述
  • 查找元素慢: 想要查找某个元素, 需要通过连接的节点, 依次向后查找指定元素
  • 增加元素快: 只需要修改连接下个元素的地址即可
    在这里插入图片描述
  • 删除元素快: 只需要修改连接下个元素的地址即可
    在这里插入图片描述

红黑树

二叉树 (binary tree): 是每个节点不超过 2 的有序树. (tree)

简单的理解, 就是一种类似于我们生活中树的结构, 只不过每个节点上都最多能有两个子节点.

二叉树是每个节点最多有两个子树的结构. 顶上的叫根节点, 两边被称作 “左子树” 和 “右子树”. 如图:
在这里插入图片描述
我们要说的二叉树的一种比较有意思的叫做红黑树. 红黑树本身就是一颗二叉树, 将节点插入后, 该树任然是一颗二叉树. 这就意味着, 树的减值任然是有序的.

红黑树的约束:

  1. 节点可以是红色或者黑色的
  2. 根节点是黑色的
  3. 叶子节点 (特指空节点) 是黑色的
  4. 每个红色节点的子节点都是黑色的
  5. 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
    红黑树的特点:
    速度特别快, 趋近于平衡树, 查找叶子元素最少和最多次数不多于二倍.
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值