数据结构回顾(Java)

1.数组 线性表

定义的方式

int[] a=new int[10]

为什么查询快?

        1.可以借助O(1)时间复杂度访问某一元素,

        2.地址连续,逻辑连续

        3.数组长度一旦确定就不可以被修改

当需要扩容的时候需要将老数组的内容复制过来

在Java中数组是一个对象

ArrayList 数组列表

ArrayList的添加(自动扩容)

        对应的源码

        值得一看的是ensureCapacityInternal方法

        Ctrl+鼠标右键点进去

        看这个231行的这个方法,modCount这个不用关注,是并发下的一个计数,重点看234行的代码,minCapacity是新加入的值的位置,如果比数组的长度大就会执行grow(),数组扩容的方法

private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;//取到老的容量int newCapacity = oldCapacity + (oldCapacity >> 1);//构建新的容量,新的容量是老的容量的+老的容量右移一位(1.5倍)if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);//把老数组的值赋值给新的数组
}

底层就是构建了一个新的数组,并且把老的数组内容复制过来,从而就实现了自动扩容。

总结:初始容量是多少 10

扩容机制: 当elementData已经满了,才会扩容

扩容的方式:原容量加原容量右移一位

优点:随机访问,

缺点:需要连续的空间

2.链表

1.可以不断的扩容

2.由node结点组成,每个node由data和next组成

3.两种插入方式,头插法和尾插法

链表的构建,以及两种插入方法(头插法和尾插法)

class MySingleLinkedList{public Node head;class Node{public int value;public Node next;public Node(int value, Node next) {this.value = value;this.next = next;}}//头插法public void addFirst(int value){Node node =new Node(value, null);if (head==null){head=node;}else {node.next=head;head=node;}}//尾插法public void addEnd(int value){Node node=new Node(value,null);Node temp=head;if (head==null){head=node;}else {while (temp.next!=null){temp=temp.next;}temp.next=node;}}//循环输出public void loop(){Node temp=head;while (temp!=null){System.out.println(temp.value);temp=temp.next;}}
}

         Java中提供的LinkedList是一个双端的队列

        练习:

        leetcode中

               单链表的反转

                链表成环的判断、环的长度        

                两个有序链表的合并

3.二叉树

二叉树的三种遍历代码实现

前序遍历

中序遍历

后序遍历

 3.1 搜索二叉树

左边的节点比根小,右边的节点比根大(不保证平衡)

时间复杂度最好O(log(n)),最坏O(n)

3.2 平衡二叉树:

搜索二叉树基础上,任一节点的左右子树高度差不超过1.

LL旋转,RR旋转,LR旋转,RL旋转

3.3 红黑树:

红黑树是一棵近似平衡的二叉树,是一种高效的查找树。

所有的结点要么红色要么黑色,非黑即红

根结点是黑色的,叶节点是不存储数据的黑色 空结点

不能连续两棵红色相连

从任意结点到其所有的叶子结点所经过的黑色叶子结点数是一样的

推导出来,从红黑树的叶子结点到另一最近结点上的与到另一最远结点上,不超过一倍(任一结点的左右子树的高度差不超过两倍)

AVL树(平衡树)和红黑树的对比

AVL严格的平衡树,红黑树近似的平衡树

AVL在查询上更高效,红黑树在插入和删除上更高效

红黑树插入的时候默认结点是红色的,因为只是有可能会违反根叶黑或者不红红的规则

如果插入破坏了规则分以下三种情况:

1)插入结点是根节点

直接把根结点变黑

2)插入结点的叔叔是红色结点

父亲层和爷爷层同时变色,黑色变红色,红色变黑色,再看是否破坏红黑树的规则。

3)插入结点的叔叔是黑色

(LL,RR,LR,RL)旋转,然后变色,变色规则是旋转中心点,旋转点进行变色

LL:右旋,向右旋转,冲突的右孩变左孩

RR:左旋,向左旋转,冲突的左孩子变右孩子

LR: 左旋左孩子,然后右旋

RL:右旋右孩子,然后左旋

4.B树

红黑树虽然是近似平衡的,而且插入,删除上很高效,但是如果插入数据非常的多,也会出现树的深度过深,导致内存和磁盘间的I/O次数过多的情况,这时候就可以使用多叉树。

对于一个m叉树

(1)树中每个结点至多有m个孩子结点(m-1个关键字)

(2)每个结点的结构

(3)除根结点外,其他结点至少有m/2个孩子结点

(4)若根节点不是叶子结点,则根结点至少有两个孩子结点

(5)所有的叶子结点都在同一层上,即B树是所有结点的平衡因子等于0的多路查找树

B树的查找

首先我们要了解一个概念,我们读取磁盘中的数据时,是按照块或者页读取的,比如,一个word文档大小3.5K,它存储的时候会按照一个页的大小的整数倍去存储,存储占用4K,读取的时候也是一样的。

B树的访问结点是在硬盘上解决的,但是B树对结点内的数据的操作是在内存中使用的。

B树就是一次性去磁盘中读取一个块,数据,指针都在这个块里了

B+树

B+树就是在B树的基础上非叶子结点只存储记录和指针,叶子结点存储数据,B+树的元素个数和分支树是相同的,也就是一个元素值对应一个子树。

B+树的非叶子结点是为了快速定位到叶子结点上的关键字,就相当于给叶子结点层建立了索引。

整个B+树就是一个多级索引结构,目的就是为了加速查询的速度,查询的速度是log(n)级别的

B+树被广泛用作数据库的索引结构

B+树可以用于:顺序查找,随机查找,范围查找

B树和B+树的对比

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

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

相关文章

记录些Redis题集(2)

Redis 的多路IO复用 多路I/O复用是一种同时监听多个文件描述符&#xff08;如Socket&#xff09;的状态变化&#xff0c;并能在某个文件描述符就绪时执行相应操作的技术。在Redis中&#xff0c;多路I/O复用技术主要用于处理客户端的连接请求和读写操作&#xff0c;以实现高并发…

Python_使用pyecharts构建折线图

Pyecharts简介 Pyecharts是一款将python与echarts结合的强大的数据可视化工具&#xff0c;使用 pyecharts 可以生成独立的网页&#xff0c;也可以在 flask , Django 中集成使用。echarts &#xff1a;百度开源的一个数据可视化 JS 库&#xff0c;主要用于数据可视化。pyechart…

嵌入式linux相机 框图

摄像头读取数据显示到LCD流程 重点&#xff1a;摄像头数据&#xff08;yuyv&#xff0c;mjpeg&#xff0c;rgb&#xff09;&#xff08;640,320&#xff09;与LCD显示数据&#xff08;RGB&#xff09;&#xff08;480&#xff0c;240&#xff09;不同&#xff1b;需要转换&…

项目文章|EMBO J(IF=9.4):16S+代谢组解析肠道菌群代谢物改善高脂饮食诱导的胰岛素抵抗机制

肠道菌群及其代谢产物与肥胖相关疾病&#xff08;如2型糖尿病&#xff09;密切相关&#xff0c;但其因果关系和潜在机制尚不清楚。研究表明&#xff0c;肥胖与肠道微生物的丰度和多样性变化有关&#xff0c;例如&#xff0c;高脂饮食&#xff08;HFD&#xff09;诱导的肥胖会增…

AIGC率超标?掌握论文去AI痕迹的高效策略

随着 AI 技术迅猛发展&#xff0c;各种AI辅助论文写作的工具层出不穷&#xff01; 为了防止有人利用AI工具进行论文代写&#xff0c;在最新的学位法中已经明确规定“已经获得学位者&#xff0c;在获得该学位过程中如有人工智能代写等学术不端行为&#xff0c;经学位评定委员会…

ESP32CAM物联网教学11

ESP32CAM物联网教学11 霍霍webserver 在第八课的时候&#xff0c;小智把乐鑫公司提供的官方示例程序CameraWebServer改成了明码&#xff0c;这样说明这个官方程序也是可以更改的嘛。这个官方程序有四个文件&#xff0c;一共3500行代码&#xff0c;看着都头晕&#xff0c;小智决…

S7-200smart与C#通信

https://www.cnblogs.com/heizao/p/15797382.html C#与PLC通信开发之西门子s7-200 smart_c# s7-200smart通讯库-CSDN博客https://blog.csdn.net/weixin_44455060/article/details/109713121 C#上位机读写西门子S7-200SMART PLC变量 教程_哔哩哔哩_bilibilihttps://www.bilibili…

清朝嘉庆二十五年(1820年)地图数据

我们在《中国历史行政区划连续变化数据》一文中&#xff0c;为你分享了中国历史行政区划连续变化地图数据。 现在再为你分享清朝嘉庆二十五年&#xff08;1820年&#xff09;的地图数据&#xff0c;该数据对于研究历史的朋友应该比较有用&#xff0c;请在文末查看领取方式。 …

HTTP背后的故事:理解现代网络如何工作的关键(一)

一.HTTP是什么 概念 &#xff1a; 1.HTTP ( 全称为 " 超文本传输协议 ") 是一种应用非常广泛的 应用层协议。 2.HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 3.HTTP 往往是基于传输层的 TCP 协议实现的 . (HTTP1.0, HTTP1.1, HTTP2.0 均为 T…

2024世界人工智能大会(WAIC)学习总结

1 前言 在2024年的世界人工智能大会&#xff08;WAIC&#xff09;上&#xff0c;我们见证了从农业社会到工业社会再到数字化社会的深刻转变。这一进程不仅体现在技术的单点爆发&#xff0c;更引发了整个产业链的全面突破&#xff0c;未来将是技术以指数级速度发展的崭新时代。…

【从0到1进阶Redis】主从复制 — 主从机宕机测试

上一篇&#xff1a;【从0到1进阶Redis】主从复制 测试&#xff1a;主机断开连接&#xff0c;从机依旧连接到主机的&#xff0c;但是没有写操作&#xff0c;这个时候&#xff0c;主机如果回来了&#xff0c;从机依旧可以直接获取到主机写的信息。 如果是使用命令行&#xff0c;来…

PyTorch深度学习实战(46)——深度Q学习

PyTorch深度学习实战&#xff08;46&#xff09;——深度Q学习 0. 前言1. 深度 Q 学习2. 网络架构3. 实现深度 Q 学习模型进行 CartPole 游戏小结系列链接 0. 前言 我们已经学习了如何构建一个 Q 表&#xff0c;通过在多个 episode 中重复进行游戏获取与给定状态-动作组合相对…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十四)-无人机操控关键绩效指标(KPI)框架

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

第二证券:转融通是什么意思?什么是转融通?

转融通&#xff0c;包含转融资和转融券&#xff0c;实质是借钱和借券。转融通是指证券金融公司借入证券、筹得资金后&#xff0c;再转借给证券公司&#xff0c;是一假贷联络&#xff0c;具体是指证券公司从符合要求的基金处理公司、保险公司、社保基金等组织出资者融券&#xf…

Python应用开发——30天学习Streamlit Python包进行APP的构建(15):优化性能并为应用程序添加状态

Caching and state 优化性能并为应用程序添加状态! Caching 缓存 Streamlit 为数据和全局资源提供了强大的缓存原语。即使从网络加载数据、处理大型数据集或执行昂贵的计算,它们也能让您的应用程序保持高性能。 本页仅包含有关 st.cache_data API 的信息。如需深入了解缓…

技术成神之路:设计模式(六)策略模式

1.介绍 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;封装每一个算法&#xff0c;并使它们可以相互替换。策略模式使得算法的变化独立于使用算法的客户端。 2.主要作用 策略模式的主要作用是将算法或行为…

什么叫图像的双边滤波,并附利用OpenCV和MATLB实现双边滤波的代码

双边滤波&#xff08;Bilateral Filtering&#xff09;是一种在图像处理中常用的非线性滤波技术&#xff0c;主要用于去噪和保边。它在空间域和像素值域上同时进行加权&#xff0c;既考虑了像素之间的空间距离&#xff0c;也考虑了像素值之间的相似度&#xff0c;从而能够有效地…

手机怎么看WiFi的IP地址

在如今数字化快速发展的时代&#xff0c;无线网络已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们可能都离不开WiFi的陪伴。然而&#xff0c;在使用WiFi的过程中&#xff0c;有时我们可能需要查看其IP地址&#xff0c;以便更好地管理我们的网…

【动态规划】背包问题 {01背包问题;完全背包问题;二维费用背包问题}

一、背包问题概述 背包问题(Knapsackproblem)是⼀种组合优化的NP完全问题。 问题可以描述为&#xff1a;给定一组物品&#xff0c;每种物品都有自己的重量和价格&#xff0c;在限定的总重量内&#xff0c;我们如何选择&#xff0c;才能使得物品的总价格最⾼。 根据物品的个数…

链接追踪系列-07.logstash安装json_lines插件

进入docker中的logstash 容器内&#xff1a; jelexbogon ~ % docker exec -it 7ee8960c99a31e607f346b2802419b8b819cc860863bc283cb7483bc03ba1420 /bin/sh $ pwd /usr/share/logstash $ ls bin CONTRIBUTORS Gemfile jdk logstash-core modules tools x-pack …