• Java基础之数据类型


    数据结构

    数据结构是计算机存储、组织数据的方式。

    通常情况下,精心选择的数据结构可以带来更高的运行或存储效率

    常用的数据结构

    数据存储的常用结构有:栈、队列、数组、链表和红黑树

    一端开口(栈顶),一端封闭(栈底)

    特点:先进后出

    队列

    后端开口(队尾),前端开口(对头)

    特点:先进先出

    数组

    数组名[索引]

    查询数据通过地址值和索引定位,查询任意数据耗时相同,查询速度快

    删除数据时,要将原始数据删除,同时后面每个数据前移,删除效率低

    添加数据时,添加位置后的每个数据后移,再添加元素,添加效率低

    长度固定

    使用时机:经常做查询,少做增删

    链表

    查询数据是否存在,必须从头(head)开始查询

    查询第n个数据,必须从头(head)开始查询

    链表是一种增删快的模型(对比数组)

    链表是一种查询慢的模型(对比数组)

    因为增删数据也要从头查询,所以实际速度也非常慢,但是对比数组还是更有优势一点。

    实际更多的用双向链表,既可以从头到尾,也可以从尾部到头部。

    比如长度为100的链表,我们要查询第95个数据,我们可以从尾部开始查,效率更高。

    二叉树

    二叉树是指每个节点的子节点数量不超过2

    二叉查找树

    在二叉树的基础上,元素排列有顺序,左子树元素小,右子树元素大。

    在二叉树相比于普通二叉树的优势在于查找速度较快。

    虽然二叉查找树的元素是有顺序的,但是某些特殊情况下,二叉查找树会退化成链表。

    二叉树退化成链表结构,不再具有查询优势。

    平衡二叉树(AVL树)

    在二叉查找树的基础上,规定左右两个子树的高度差不超过1。

    任意节点的左右两个子树都是一颗平衡二叉树。

    在添加一个节点之后,该树不再是一颗平衡二叉树时,将触发旋转。

    左旋:将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让给已经降级的根节点当右子节点。

    右旋:将根节点的左侧往右拉,原先的左子节点变成新的父节点,把多余的右子节点让给已经降级的根节点当左子节点。

    平衡二叉树是高度平衡的,当执行插入或者删除操作时,只要左右子树高度差超过1时,就要通过旋转来保持平衡,但是旋转是非常耗时的。

    由此可见,平衡二叉树是适用于元素增删少,而查找较多的场景。

    由于维护高度平衡的代价较大,所以平衡二叉树实际的应用并不多,更多时候会选择更加高效的红黑树。

    红黑树

    红黑树是特殊的二叉查找树,在每个节点上有一个存储位表示节点的颜色,可以是红或黑(非红即黑)

    红黑树是一种弱平衡二叉树,相对于要求严格的平衡二叉树来说,它的旋转次数相对较少。

    对于查询,插入,删除都较多的情况,我们可以使用红黑树达到整体性能的提升。

    红黑树不是高度平衡的,它的平衡是通过“红黑规则”进行实现的

    规则:
    1.每一个节点或是红色的,或者是黑色的。

    2.根节点必须是黑色

    3.如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的。

    4.不能出现两个红色节点相连的情况

    5.对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同的黑色节点。

    6.新加入的节点是红色的,如果加入后不满则红黑规则,需要进行旋转或变色。

    最后

    如果你对本文有疑问,你可以在文章下方对我留言,敬请指正,对于每个留言我都会认真查看。

  • 相关阅读:
    线性代数2:梯队矩阵形式
    C++高性能优化编程之如何测量性能(一)
    C++学习笔记(十六)
    学大数据技术与应用的女生多吗?适合吗?
    PIXHAWK飞控使用RTK
    C++ 基础与深度分析 Chapter11 类与面向对象编程(析构与复制成员函数、字面值类、成员指针与bind交互)
    java.time.LocalDateTime详解
    HTML+CSS篮球静态网页设计(web前端网页制作课作业)NBA杜兰特篮球运动网页
    数据可视化分析工具如何在国内弯道超车,迅速崛起?
    【python】py文件全自动打包成spec文件
  • 原文地址:https://blog.csdn.net/weixin_47543906/article/details/127699530