java中涉及到的基础数据结构

1. BST(二叉搜索树),AVL(平衡二叉树)、RBT(红黑树)

二叉查找树(BST)

左结点小于根节点,右结点大于根节点的一种排序树,也叫二叉搜索树。也叫BST,英文Binary Sort Tree。
二叉查找树比普通树查找更快,查找、插入、删除的时间复杂度为O(logN)
但是极端的情况,就是会变成一种线性链表似的结构。此时时间复杂度就变成了O(N),为了解决这种情况,出现了二叉平衡树。

平衡二叉树(AVL)

全称平衡二叉搜索树,也叫AVL树。是一种自平衡的树。

AVL树也规定了左结点小于根节点,右结点大于根节点。并且还规定了左子树和右子树的高度差不得超过1。这样保证了它不会成为线性的链表。
AVL树的查找稳定,查找、插入、删除的时间复杂度都为O(logN),但是由于要维持自身的平衡,所以进行插入和删除结点操作的时候,需要对结点进行频繁的旋转

如果搜索的次数远远大于插入和删除,那么选择AVL树。

红黑树(RBT)

红黑树也叫RBT,RB-Tree。是一种自平衡的二叉查找树,它的节点的颜色为红色和黑色。它不严格控制左、右子树高度或节点数之差小于等于1。也是一种解决二叉查找树极端情况的数据结构。
红黑树规定了:

  • 1.节点是红色或黑色。
  • 2.根节点是黑色。
  • 3.每个叶子节点都是黑色的空节点(NULL节点)。
  • 4 每个红色节点的两个子节点都是黑色。也就是说从每个叶子到根的所有路径上不能有两个连续的红色节点)。
  • 5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

红黑树是保持“黑平衡”的二叉树。
对于黑平衡是指,从根节点开始搜索,一直搜索到叶子节点,所经历的黑色节点的个数是一样的。
时间复杂度是O(logn),最大高度:2logn.红黑树不会像二分搜索树一样退化为链表。
查找的时间上面会比AVL树慢一点,因为最大高度为2logn,添加操作和删除操作比AVL树要快一些。因为:红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。

RBT对比ALV

AVL 和RBT 都是二叉查找树的优化。其性能要远远好于二叉查找树。

  • 结构对比: AVL的结构高度平衡,RBT的结构基本平衡。平衡度AVL > RBT.
  • 查找对比: AVL 查找时间复杂度最好,最坏情况都是O(logN)
  • 插入删除对比: 1. AVL的插入和删除结点很容易造成树结构的不平衡,而RBT的平衡度要求较低。因此在大量数据插入的情况下,RBT需要通过旋转变色操作来重新达到平衡的频度要小于AVL
  • 如果数据分布较好,则比较宜于采用 AVL树(例如随机产生系列数),但是如果你想处理比较杂乱的情况,则红黑树是比较快的。

2.HashMap

HashMap 的底层数据结构是哈希表(散列表),具体实现为数组+链表(JDK1.8前)或数组+链表+红黑树(JDK1.8及以后)
主要特点:

  • 数组:用于存储桶(Bucket)的数组,每个桶要么存储一个元素(键值对),要么存储一个指向链表头结点的引用(哈希冲突时)
  • 链表:用于解决哈希冲突,的那个多个键值对银蛇到数组的同一位置时,会形成一个链表。
  • 红黑树:联保长度超过某个阈值(默认为8),链表会转换为红黑树以提高查找效率。红黑树是自平衡的二叉查找树,能保持较低的高度,从而减少查找时间。

将每一个字符串元素通过Hash计算索引位置,存放到数组中。
在字符串存放到数组的过程,如果遇到相同的元素,使用链表进行链接。

在计算索引Hashcode的过程中使用扰动函数

使用扰动函数就是为了增加随机性,让数据元素更加均衡的散列,减少碰撞。

哈希表

hash函数就是根据key计算出应该存储地址的位置,而哈希表是基于哈希函数建立的一种查找表
hash函数设计的考虑因素:
1.计算散列地址所需要的时间(即hash函数本身不要太复杂)
2.关键字的长度
3.表长
4.关键字分布是否均匀,是否有规律可循
5.设计的hash函数在满足以上条件的情况下尽量减少冲突

这个博客对哈希表数据结构有详细介绍 数据结构 Hash表(哈希表)

3.B-树(即B树),B+树

B树

其实是一颗特殊的二叉查找树(binary search tree),是多路搜索树,可以拥有多于2个子节点。
每个节点不止存储一个数据值,每个节点也不止有两个子节点,比起平衡二叉树,它能很大程度减低树的高度,提高树的检索效率。
这种数据结构常被应用在数据库和文件系统的实现上。

一个M阶的B树特点如下:
1.定义任意非叶子结点最多只有M个儿子;且M>2;
2.根结点的儿子数为[2, M]
3.除根结点以外的非叶子结点的儿子数为[M/2, M];
4.每个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
5.非叶子结点的关键字个数=指向儿子的指针个数-1;
6.非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1];
7.非叶子结点的指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树;
8.所有叶子结点位于同一层

B+树

B+树是B树的变体,也是一种多路搜索树。比起B树,B+树所有的节点数值都会出现在叶子节点中,并且,所有叶子节点组成了一个增序的链表。

小结:

  • 二叉搜索树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
  • B(B-)树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;
    所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
  • B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;
    B+树总是到叶子结点才命中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模拟实现c++中的string

c内置string库的相关函数&#xff1a;string - C Reference 目录 一string类构造&#xff0c;拷贝构造和析构&#xff1a; 二string内正向迭代器实现&#xff1a; 三赋值运算符重载实现&#xff1a; 四reserve&#xff0c;empty&#xff0c;clear实现&#xff1a; 五push_b…

动手学深度学习——6.循环神经网络

1.序列模型 处理序列数据需要统计工具和新的深度神经网络架构。 为了简单起见&#xff0c;我们以 图8.1.1所示的股票价格&#xff08;富时100指数&#xff09;为例。 图8.1.1 近30年的富时100指数 其中&#xff0c;用&#x1d465;&#x1d461;表示价格&#xff0c;即在时间…

LIS检验信息软件源码,适合二级医院的应用

LIS系统主要面向医院检验科&#xff0c;包含检验医生日常处理、报告处理、质量控制、条码管理、仪器双工通讯、无人值守等诸多功能模块&#xff0c;能与HIS系统、体检系统和电子病历信息系统实现无缝连接&#xff0c;已成功应用于多家各种规模的医院&#xff0c;满足客户各方面…

Git之repo sync -c与repo sync -dc用法区别(四十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

InternLM学习笔记

入门岛 1. Linux基础知识 2. Python 基础知识 from collections import Countertext """ Got this panda plush toy for my daughters birthday, who loves it and takes it everywhere. Its soft and super cute, and its face has a friendly look. Its a …

论文阅读【检测】:Facebook ECCV2020 | DETR

文章目录 论文地址AbstractMotivation模型框架详细结构小结 论文地址 DETR Abstract 提出了一种将目标检测视为直接集预测问题的新方法。简化了检测pipeline&#xff0c;有效地消除了许多手工设计的组件的需求&#xff0c;例如非最大抑制过程或锚生成&#xff0c;这些组件明…

设计模式|观察者模式

观察者模式是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时&#xff0c;它的所有观察者都会收到通知并更新。观察者模式常用于实现事件处理系统、发布-订阅模式等。在项目中&#xff0c…

GPU算力:驱动现代计算的引擎

在当今的计算密集型应用中&#xff0c;GPU&#xff08;图形处理单元&#xff09;算力已成为推动科学计算、人工智能、数据分析等领域发展的关键因素。GPU最初设计用于处理复杂的图形和图像任务&#xff0c;但随着技术的进步&#xff0c;它们已经演变为通用并行计算的强有力工具…

磁盘管理与磁盘卷--红帽Linux操作系统<>

分区的两种格式 1、MBR分区 MBR(Master Boot Record&#xff0c;主引导记录)是传统的分区机制&#xff0c;使用BI0S引导PC设备&#xff0c;寻址空间只有32bit长。 分区空间最大支持2.2TB 支持的分区数量:4个主分区或者3个主分区1个扩展分区 为什么MBR最多只能有4个主分区?…

云服务部署项目(Spring + Vue)

云计算&#xff1a;腾讯云 操作系统&#xff1a;Ubuntu 22.04.4 LTS 项目&#xff1a;若依前后端分离项目&#xff08;SpringBoot Vue&#xff09; 首先要安装基本的一些依赖环境&#xff0c;大家可以看一下我往期的文章&#xff1a; Ubuntu在线JDK Ubuntu在线安装Nginx Ubunt…

入门C语言Day19——猜随机数游戏

之前学了分支与循环的很多内容&#xff0c;所以今天可以试着来运用之前的知识来试着写一些有趣的程序——猜随机数游戏。&#xff08;当然&#xff0c;还有一些知识要补充。&#xff09; 这个多数人都应该有所耳闻&#xff0c;就是规定一个数字范围&#xff0c;然后去猜数字&a…

C#开机启动秘籍:唤醒沉睡的巨人

开机启动简介 在软件开发的世界里&#xff0c;有些程序需要在电脑启动时即刻唤醒&#xff0c;执行它们的关键任务。这就像是唤醒一位沉睡的巨人&#xff0c;确保它在第一时间内守护我们的数字世界。但是&#xff0c;如何使用C#实现这一功能呢&#xff1f;让我们一起探索这个技术…

文件解析的终极工具:Apache Tika

文件解析的终极工具&#xff1a;Apache Tika Apache Tika 简介 Apache Tika 是一个开源的、跨平台的库&#xff0c;用于检测、提取和解析各种类型文件的元数据。 它支持多种文件格式&#xff0c;包括文档、图片、音频和视频。 Tika是一个底层库&#xff0c;经常用于搜索引擎…

Android 列表或网格形式展示大量数据:RecyclerView

目录 RecyclerView是什么如何使用RecyclerView 涉及到的类LayoutManager为Item设置不同的布局样式制作拖动的RecyclerView 一、RecyclerView是什么 RecyclerView是Android支持库中的一个控件&#xff0c;用于在列表或网格形式展示大量数据。它是ListView的升级版&#xff0c…

《梦醒蝶飞:释放Excel函数与公式的力量》18.1 图表类型与设计

第18章&#xff1a;创建图表和数据可视化 18.1 图表类型与设计 Excel提供了多种图表类型&#xff0c;帮助用户以直观的方式展示数据。选择合适的图表类型和设计可以显著提高数据的可读性和理解度。以下将介绍常见的图表类型及其应用&#xff0c;并通过具体案例进行说明。 18.…

如何利用Jenkins自动化管理、部署数百个应用

目录 1. Jenkins 安装与部署步骤 1.1 系统要求 1.2 安装步骤 1.2.1 Windows 系统 1.2.2 CentOS 系统 1.3 初次配置 2. Gradle 详细配置方式 2.1 安装 Gradle 2.1.1 Windows 系统 2.1.2 CentOS 系统 2.2 配置 Jenkins 中的 Gradle 3. JDK 详细配置方式 3.1 安装 JD…

Java:防止输入输出超时

一、防止输入超时 当我们直接使用Scanner进行输入操作的时候&#xff0c;每次读取输入的数据都会进行一次硬盘的IO操作&#xff0c;这个操作是很慢的&#xff0c;如果要读取的数据过多&#xff0c;那么我们在刷题网站上就很有可能因为多次的数据读取操作产生超时&#xff01;那…

渠道查问卷调查个人怎么做?

大家好&#xff0c;我是橙河老师&#xff0c;今天讲一讲渠道查问卷调查个人怎么做&#xff1f; 对海外问卷项目有过一些了解的人呢&#xff0c;都应该知道一些渠道查的优势&#xff0c;首先是省去了注册账号、养号一系列的繁琐操作&#xff0c;那通过测题、做题&#xff0c;然…

vscode调试nextjs前端后端程序、nextjs api接口

最近有一个项目使用了nextjs框架&#xff0c;并且使用nextjs同时实现了前后端&#xff0c;由于之前前后端都是分离的&#xff0c;前端的调试可以通过在代码种添加debugger或者直接在浏览器中打断点实现&#xff0c;现在想调试后端接口&#xff0c;前面的方式就不适用了。故研究…

CMA软件实验室评审如何做好人员技术能力的评价?

人员作为实验室的一个重要质量因素&#xff0c;其技术能力和素质水平体现了实验室水平的高低。人员能力是随着时间动态变化的&#xff0c;有效地评价实验室人员的技术能力&#xff0c;是保证实验室活动的必要条件。CMA软件实验室评审也要求实验室要注意对人员能力的监督&#x…