【数据结构】Map和Set(1)

在这里插入图片描述
🧧🧧🧧🧧🧧个人主页🎈🎈🎈🎈🎈
🧧🧧🧧🧧🧧数据结构专栏🎈🎈🎈🎈🎈
🧧🧧🧧🧧🧧【数据结构】常见的排序算法🎈🎈🎈🎈🎈

文章目录

  • 1.前言
    • 2.搜索树
    • 2.1概念
    • 2.2查询操作
    • 2.3插入操作
    • 2.4删除操作
    • 2.5性能分析

1.前言

Map与Set的底层有两种结构实现,一种是搜索树(TreeMap与TreeSet),还有一个就是哈希表(HashMaP与HashSet),接下来我们先了解搜索树这个底层结构。
在这里插入图片描述

2.搜索树

2.1概念

二叉搜索树又称二叉排序树,它或者是一棵空树,搜索二叉树具备这样性质:
1)根结点的左边的结点都比根结点小
2)根结点的右边的结点都比根结点大
3)通过中序遍历来遍历这个二叉搜索树是一个升序的数据集合
搜索二叉树:
在这里插入图片描述

2.2查询操作

2.2.1 基本思路:
1.将要查询的值先于根结点比较,与根结点不相等,则判断该元素与根结点的大小。
2.根结点 > 该元素 则该元素在根结点的左边
3.根结点 < 该元素 则该元素在根结点的右边
4.遇到null则遍历结束

2.2.2绘图分析
在这里插入图片描述
2.2.3代码实现

/***寻找key元素* @param key* @return*/public boolean search(int key) {TreeNode cur = root;while(cur != null) {//1.判断根结点if(cur.val == key) {return true;} else if(cur.val > key) {//2.根结点大于keycur = cur.left;} else {//3.根结点小于keycur = cur.right;}}return false;}

2.3插入操作

2.3.1基本思路:
1)插入的元素要满足中序遍历之后是一个升序的集合
2)插入的元素只能在搜索二叉树的叶子结点 进行插入
3) 通过一个指针来遍历要插入的位置的同时再让一个指针标记插入位置的父节点

遍历的过程:
1)root == null 直接插入
2)root != null 判断与根结点的大小关系
root.val > val 插入root左边
root.val < val 插入root右边
2.2.2绘图分析
在这里插入图片描述
2.2.3代码实现

/*** 插入元素*/public void insert(int val) {//1.root == nullif(root == null) {root = new TreeNode(val);return;}//2.root != nullTreeNode cur = root;TreeNode parent = null;while(cur != null) {if(cur.val < val) {//1.根结点小于keyparent = cur;cur = cur.right;} else {//2.根结点大于keyparent = cur;cur = cur.left;}}//说明cur为空,元素插入parent结点的其中两侧TreeNode node =  new TreeNode(val);if(parent.val < val) {parent.right = node;} else {parent.left = node;}}

2.4删除操作

删除操作是最复杂也是最难的一个操作,我们以cur指针来标记删除结点,parent指针标记删除结点的父结点,我们对删除操作分为三种情况:
1.cur.left == null
2.cur.right == null
3.cur.left != null && cur.right != null
我们先画一棵搜索二叉树,这里我们删20这个结点为例子:
在这里插入图片描述
1.cur.left == null
在这里插入图片描述
2.cur.right == null
在这里插入图片描述
3.cur.left != null && cur.right != null
在这里插入图片描述
代码实现:

 public boolean 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 {return removeNode(parent,cur);}}return false;}private boolean removeNode(TreeNode parent,TreeNode cur) {//1.cur.left == nullif(cur.left == null) {if(cur == root) {cur.right = root;} else {if(cur == parent.right) {parent.right = cur.right;}if(cur == parent.left) {parent.left = cur.right;}}}//2.cur.right == nullif(cur.right == null) {if(cur == root) {cur.left = root;} else {if(cur == parent.left) {parent.left = cur.left;}if(cur == parent.right) {parent.right = cur.left;}}}//3.cur.left !=null && cur.right != nullTreeNode child = cur.right;TreeNode p = null;//p为child的父亲结点while(child.left != null) {p = child;child = child.left;}//找到最小值,将最小值赋值给curcur.val = child.val;//最小值的父亲结点的左节点是否等于最小值结点if(p.left == child) {p.left = child.right;} else {p.right = child.right;}return true;}

2.5性能分析

插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的性能。
对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。
但对于同一个关键码集合,如果各关键码插入的次序不同,可能得到不同结构的二叉搜索树:
在这里插入图片描述
最优情况下,二叉搜索树为完全二叉树,其平均比较次数为:以2为底的log(N)
最差情况下,二叉搜索树退化为单支树,其平均比较次数为:N/2

关于Map与Set先分享到这,后面的内容更加精彩,请各位看官慢慢期待。

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

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

相关文章

【jQuery】看一眼就会用的jquery库之续章!

jQuery&#xff08;js框架&#xff09; 17、操作节点 创建节点&#xff1a; 创建节点只需要将元素放在jQuery的工厂函数中//创建一个button按钮let $btn$("<input typebutton>");//创建一个列表项let $li$("<li>选项</li>");添加节点…

医保购药小程序开发指南:利用智慧药房系统源码实现智能服务

医保购药小程序为患者提供了便捷的药品购买渠道&#xff0c;同时也为药店和医疗机构提供了智能化管理和服务的平台。接下来&#xff0c;小编将介绍如何利用智慧药房系统源码实现医保购药小程序的开发&#xff0c;并探讨如何实现智能化的服务。 第一部分&#xff1a;智慧药房系统…

如何使用IDEA直接连接MySQL数据库

如何使用IDEA直接连接MySQL数据库 新建一个空项目打开DataBase窗口连接数据库第一次连接 需要先下载驱动上一步驱动下载太慢怎么办&#xff1f;下载好驱动后 测试连接 新建一个空项目 打开DataBase窗口 连接数据库 第一次连接 需要先下载驱动 如果这里下载的很慢 看下一步解决…

SpringBoot笔记1

继承父工程 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</version></parent>java 无效的源发行版 17 解决方法 <build><plugins>…

RabbitMQ各组件参数详解(9)

这里对各个组件的参数进行详解&#xff0c;可能前面有提到过&#xff0c;这里做一个汇总 交换机 在创建交换机的时候用到建造者类ExchangeBuilder&#xff0c;会创建四种交换机 Direct Exchange 直连交换机是 RabbitMQ 中最简单的交换机类型之一。它的工作方式非常简单&…

python基础知识—while和for循环(三)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 一&#xff1a;while循环1.1程序的三种执行流程1.2while循环1.3循环变量和死循环 二&#xff1a;for循环2.1for循环2.2range 一&…

安装crossover游戏提示容量不足怎么办 如何把游戏放到外置硬盘里 Mac电脑清理磁盘空间不足

CrossOver作为一款允许用户在非原生操作系统上运行游戏和应用程序的软件&#xff0c;为不同平台的用户提供了极大的便利。然而&#xff0c;随着游戏文件大小的不断增加&#xff0c;内置硬盘的容量往往无法满足安装需求。幸运的是&#xff0c;通过一些简单的步骤&#xff0c;我们…

Penpad 再获 Animoca Brands 投资,全新生态历程

Penpad 是 Scroll 生态的 LaunchPad & Yield Aggregator 平台&#xff0c;该平台近日在融资上取得了系列进展。据悉&#xff0c;Penpad 在前不久率先获得了来自于 Gate Labs 以及 Scroll 联合创始人 Sandy Peng 的融资&#xff0c;并且在近日&#xff0c;其又获得了来自于知…

LeetCode题目73:矩阵置零

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据&#xff0c;并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

(学习日记)2024.04.20:UCOSIII第四十八节:各文件功能概览

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

牛客网:S老师的公式 ← 取模运算

【题目来源】https://ac.nowcoder.com/acm/contest/76652/A【题目描述】 S 老师丢给你了一个简单的数学问题&#xff1a; 求 。 请你求出答案。【输入格式】 一行一个整数 n (1≤n≤10^6)。【输出格式】 一行一个整数表示答案。【说明】 例如&#xff0c;若n3&#xff0c;则本题…

设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

对于C# 任务并行库(TPL)的一些理解

C# 的任务并行库&#xff08;Task Parallel Library&#xff0c;TPL&#xff09;是 .NET 框架的一个部分&#xff0c;它提供了一组丰富的API&#xff0c;旨在简化并行编程&#xff0c;使开发人员能够更容易地构建可以利用多核处理器优势的高性能应用程序。TPL 的设计目的是减少…

【redis】Redis数据类型(一)——String类型(包含redis通用命令)

目录 Redis通用命令String类型常用的操作命令一些特殊命令详解setnx示例使用 setrange示例 mset示例 msetnx示例 append示例 getset示例 incr示例使用1.计数器2.限速器 bitcount示例使用&#xff1a;使用 bitmap 实现用户上线次数统计性能 String类型String类型简介String类型的…

统一威胁情报如何赋能SOC应对复杂威胁?

安全运营中心&#xff08;SOC&#xff09;是组织网络安全战略的核心组成部分&#xff0c;扮演着至关重要的角色。其负责实时监控整个IT基础设施&#xff0c;以检测、响应和预防各类网络安全威胁。网络安全威胁日益复杂且多变的数字化时代&#xff0c;攻击平面泛化、基础设施复杂…

GET 和 POST 请求方式的区别

GET 和 POST 请求方式的区别 GET请求和POST请求在HTTP通信中有着不同的用途和限制。以下是两者之间的一些主要区别&#xff1a; URL可见性 GET请求的参数直接附加在URL后面&#xff0c;因此可以被用户看到POST请求的参数位于请求体中&#xff0c;对URL参数是不可见的 数据传输方…

C#技巧之窗体去鼠标化

简介 在窗体程序中不用鼠标&#xff0c;直接使用键盘完成想要的操作。 实现的方法有两种&#xff0c;一种是使用键盘上的Tab键使控件获得焦点&#xff0c;然后用enter键触发该控件上的事件&#xff08;一般为click事件&#xff09;。另一种是&#xff0c;为控件添加快捷键&am…

新手去做视频号小店常见的问题解答!全篇干货!建议收藏!

大家好&#xff0c;我是电商小V 视频号小店现在可以说是越来越火&#xff0c;在创业者的人群中被提及的次数也是越来越高&#xff0c;导致这种情况的原因就是&#xff0c;新项目&#xff0c;正处于红利期&#xff0c;现在去做是可以很轻易分到属于自己的一杯羹&#xff0c;就是…

Android 蓝牙无法发送或接收某些类型文件

Android 蓝牙应用使得用户能够在蓝牙设备之间进行文件传输。用户可以通过蓝牙连接两台设备&#xff0c;并在它们之间传输文件&#xff0c;如照片、音乐、视频等。这对于用户来说是非常便利的&#xff0c;无需使用数据线或互联网连接&#xff0c;可以直接在附近的设备之间进行文…