《Java初阶数据结构》----10.<Map和Set---TreeSet和TreeMapHashSet和HashMap >

前言:

      大家好,我目前在学习java。我准备利用这个暑假,来复习之前学过的内容,并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区进行讨论!!!

      喜欢我文章的兄弟姐妹们可以点赞,收藏和评论。如果感觉有所收获可以关注我呦。我会持续更新滴,望支持!!!!!!一起加油呀!!!!

语言只是工具。

决定你好不好找工作的是你的能力!!!!

学历本科及以上就够用了!!!!!!!!


本篇博客会讲解

Map/Set 及实际实现类 HashMap/TreeMap/HashSet/TreeSet 的使用

HashMap 和 HashSet 背后的数据结构哈希表的原理和简单实现

 

我们在回顾一下在JavaSE最后一篇说的集合类这个图。今天我们要详细讲的就是

TreeSet和TreeMap还有HashSet和HashMap 

TreeSet和TreeMap其底层是一个红黑树。而红黑树的本质其实就是一颗特殊的二叉搜索树。

一、二叉搜索树(二叉排序树)

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
  • 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
  • 它的左右子树也分别为二叉搜索树

图示:

当我们对二叉搜索树进行中序遍历的时候。

我们发现此时是有序的,中序(左根右)遍历结果。

0,1,2,3,4,5,6,7,8,9 

如上就是一颗二叉搜索树。

1.1二叉搜索树的查找 

    public boolean search(int val){TreeNode cur = root;while (cur != null){if(val < cur.val){cur = cur.left;} else if (val > cur.val) {cur = cur.right;}else {return true;}}return false;}

定义一个当前节点等于root。在cur不为null的情况下。

①如果要找的值小于于根节点。那么就进入左节点再去查找。

②如果要找的值大于根节点。那么就进入右节点再去查找。

找的值等于当前节点的值返回true。

如果当cur为null没找到的话返回false。

我们可以看出查找的效率是很高的 

 1.2二叉树的插入

注:二叉搜索树的插入只会插入进叶子节点。

    public boolean insert(int val){TreeNode cur = root;TreeNode parent = null;if(root == null){root = new TreeNode(val);return true;}while (cur != null){if(cur.val < val){parent = cur;cur = cur.right;} else if (cur.val > val) {parent = cur;cur = cur.left;}else {return false;}}TreeNode node = new TreeNode(val);if(val < parent.val){parent.left = node;}else {parent.right = node;}return true;}

1.若根节点为空,那么直接新建一个节点存入val值,令root=node。

2.如果跟节点不为空。我们想找到合适的位置插入,那么就跟查找类似。

需要比较插入的值,与根节点比较。

①如果插入的值小于根节点。那么进入左子树

②如果插入的值大于根节点。那么进入右子树

直到找到一个节点为空(cur == null时),那么此时。就可以插入这个节点。新建一个节点,放入val值。令当前空节点为新建节点。

但是存在一个问题。我们需要连接节点,因此还需要知道插入位置的父亲节点才能进行插入

 因此我们需要多定义一个parent节点。每次cur节点移动的之前,令parent = cur。

  1.3二叉树的删除(难点)

设待删除结点为 cur, 待删除结点的双亲结点为 parent。

分以下三种情况进行删除

1. cur.left == null

  • 1. cur 是 root,则 root = cur.right
  • 2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.right
  • 3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.right

2. cur.right == null

  • 1. cur 是 root,则 root = cur.left
  • 2. cur 不是 root,cur 是 parent.left,则 parent.left = cur.left
  • 3. cur 不是 root,cur 是 parent.right,则 parent.right = cur.left

3. cur.left != null && cur.right != null

需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被 删除节点中,再来处理该结点的删除问题

    public void remove(int val){TreeNode cur = root;TreeNode parent = null;while (cur != null){if (cur.val < val){parent = cur;cur = cur.right;} else if (cur.val > val) {parent = cur;cur = cur.left;}else {// 删除的逻辑removeNode(parent,cur);return;}}}

// 删除的逻辑

removeNode(parent,cur); 

// 该元素不在二叉搜索树中if(null == cur){return false;}/*根据cur的孩子是否存在分四种情况1. cur左右孩子均不存在2. cur只有左孩子3. cur只有右孩子4. cur左右孩子均存在看起来有四种情况,实际情况1可以与情况2或者3进行合并,只需要处理是那种情况即可除了情况4之外,其他情况可以直接删除情况4不能直接删除,需要在其子树中找一个替代节点进行删除*/// 请同学们根据上课掌握内容,完成删除的关键部分代码return true;}
}

代码后续会补充完整,并进行分析。

1.4 性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。 对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度 的函数,即结点越深,则比较次数越多。 但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:

 最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:logN

最差情况下,二叉搜索树退化为单支树,其平均比较次数为:N/2

问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,都可以是二叉搜索树的性能最佳? 

这就引入了TreeMap 和 TreeSet

TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;实际上用的是红黑树,而红黑树是一棵近似平衡的二叉搜索树,即在二叉搜索树的基础之上 + 颜色以及红黑树性质验证,关于红黑树的内容后序再进行讲解。

本节先讲这么多,由于时间关系,后续会继续更新这篇文章。

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

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

相关文章

Linux守护进程daemon与服务service及systemctl命令的作用

在 Linux 系统的服务管理中会经常提到 daemon&#xff08;守护进程&#xff09; 与 service&#xff08;服务&#xff09;&#xff0c;守护进程 daemon 是指后台运行的进程&#xff0c;随系统启动而为应用程序提供支持&#xff0c; 而服务 service 则用于提供某种功能。 简单的…

C/C++大雪纷飞代码

目录 写在前面 C语言简介 EasyX简介 大雪纷飞 运行结果 写在后面 写在前面 本期博主给大家带来了C/C实现的大雪纷飞代码&#xff0c;一起来看看吧&#xff01; 系列推荐 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳…

C#实现数据采集系统-Mqtt实现采集数据转发

在数据采集系统中,通过ModbusTcp采集到数据之后,再通过MQTT转发到其他应用 MQTT操作 安装MQTT mqtt介绍和环境安装 使用MQTT 在C#/Net中使用Mqtt MQTT类封装 MQTT配置类 public class MqttConfig{public string Ip {get; set;

每日任务:网络协议对比:HTTPS/HTTP与TCP/UDP

1.HTTPS和HTTP有哪些区别 HTTP 是超文本传输协议&#xff0c;信息是明文传输&#xff0c;存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷&#xff0c;在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议&#xff0c;使得报文能够加密传输。HTTP 连接建立相对简单&#x…

【LeetCode】141.环形链表、142. 环形链表 II(算法 + 图解)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构 &#x1f4da;本系列文章为个人学…

网站如何从0-1搭建部署蓝图介绍

第一步&#xff1a;网站规划 确定网站目的&#xff1a;明确网站的目标和预期的受众。内容规划&#xff1a;决定网站将包含哪些内容和功能。技术需求分析&#xff1a;确定所需的技术栈&#xff0c;例如前端和后端技术。 第二步&#xff1a;设计 草图和布局&#xff1a;绘制网…

AI学习记录 - 本地知识库实现的相关知识

在公司内部实现了个知识库&#xff0c;但这里只介绍在实现知识库的过程中用到的知识。 1、分词器 先分词&#xff0c;中文可以使用jieba分词 2、构造数据集 将词汇向量化是自然语言处理中的重要任务&#xff0c;它可以将文本数据转化为计算机能够理解和处理的向量形式。以…

在react中如何计算本地存储体积

1.定义useLocalStorageSize钩子函数 // 计算localStorage大小 function useLocalStorageSize() {const [size, setSize] useState(0);useEffect(() > {const calculateSize () > {let totalSize 0;for (let key in localStorage) {//过滤掉继承自原型链的属性if (loc…

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标&#xff1a;跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…

扫雷游戏小程序

目录 一.文件 1.头文件 2.源文件 二.游戏界面和执行(test.c) 三.函数实现(void game部分,源文件game.c) 1.定义雷二维数组和展示二维数组 2.初始化地雷数组 3.初始化显示的数组 4.显示当前的情况 5.随机放置地雷 6.排雷 ps:深度优先遍历数组 四.结束 一.文件 1.头…

接口测试工具:yapi和postman、Apifox 对比选型

在接口测试工具领域&#xff0c;YApi、Postman和Apifox都是备受推崇的工具&#xff0c;它们各有特点&#xff0c;适用于不同的测试场景和需求。以下是对这三款工具的详细对比选型分析&#xff1a; 一、YApi 1. 概述 YApi是一个可本地部署的、打通前后端及QA的、可视化的接口…

《Single-Stage Extensive Semantic Fusion for multi-modal sarcasm detection》

系列论文研读目录 文章目录 系列论文研读目录文章题目含义ABSTRACTKeywords1. Introduction2. Related work3. Method3.1. Multi-modal projection 多模态投影3.2. Extensive Semantic Fusion Multiway Transformer 可拓语义融合多路Transformer3.3. Multi-objective optimizat…

GO-学习-04-基本数据类型-浮点型

浮点型&#xff1a;float32和float64 %f -3.4e38——3.4e38 package main //import "fmt" //import "math" import ("fmt""unsafe""math" )func main(){//1.定义float类型var a float32 3.12fmt.Printf("值&#xff…

LeetCode 热题 HOT 100 (011/100)【宇宙最简单版】

【图论】No. 0200 岛屿数量 【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#xf…

DjangoRF-10-过滤-django-filter

1、安装pip install django-filter https://pypi.org/ 搜索django-filter基础用法 2、进行配置 3、进行内容调试。 4、如果碰到没有关联的字段。interfaces和projects没有直接关联字段&#xff0c;但是interface和module有关联&#xff0c;而且module和projects关联&#x…

linux下使用yum安装mysql

本文使用常规方式手动安装mysql 第一步 下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm第二步 安装mysql-community-release-el7-5.noarch.rpm包 rpm -ivh mysql-community-release-el7-5.noarch.rpm第三步 安装mysql-server yum -y…

Esp_server 安卓嵌入壳子,原创! 2024/7/28 20:58

用到的软件: uni-app 思路: 让用户感觉是,一个完整的程序.实际上只是一个类浏览器壳子.轻便小巧. 由于是第一次用uni-app开发类软件,所以前前后后耗费7小时! 隔行如隔山,不是白讲的. 软件界面: 软件功能: 简化输入: 输入ip地址,例:http:// www.baidu.com 完整网址 前面…

Javaer 5分钟入门 Golang

文章目录 前言一个 go 文件长啥样&#xff1f;Go 语言的变量变量类型变量声明 Go 语言的函数&方法Go 语言没有的概念访问修饰符面向对象模型异常处理机制 Go 语言高效简洁的并发编程总结 前言 这两年主流的编程语言 Golang&#xff0c;想必大家或多或少都接触过。云原生领…

使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录

前言 RabbitMQ 是一个功能强大的开源消息队列系统&#xff0c;它实现了高效的消息通信和异步处理。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验。 特点 成熟&#xff0c;稳定消息持久化灵活的消息路由高性能&#xff0c;高可用性&#xff0c;可扩展性高支…

Python的异常处理机制

Python的异常处理机制 异常处理是编程中的一个重要概念&#xff0c;用于处理程序运行过程中出现的错误或异常情况。Python提供了强大的异常处理机制&#xff0c;使得程序能够优雅地处理错误&#xff0c;而不是直接崩溃。 1. 异常处理的基本概念 在Python中&#xff0c;异常处…