java-数据结构与算法
文章平均质量分 64
以Java语言讲解和实现编程中常见的数据结构,以及围绕这些数据结构而产生的基础算法
命运之手
这个作者很懒,什么都没留下…
展开
-
【数据结构与算法】【16】红黑树
我们统一将被删除节点称为D节点,D节点兄弟为B节点,D节点父亲为P节点,B节点孩子分为LN和RN节点。由于D为黑色,且为叶节点,要保持平衡性,则P右侧必有一个黑色节点,且最多两层,只可能是以下五种情况。这又分为D在P左侧,以及D在P右侧的情况,我们只讲解D在左侧的情况,另一种情况处理方式是一样的。根节点到任意叶节点的最长路径,不多于最短路径的两倍(路径全黑时最短,红黑相间时最长)由于在实际场景中,很难有数据只查询不修改的,因此红黑树的适用场景更广,综合效率更高。再以GP作为新的N节点,递归修复平衡性。原创 2022-10-05 17:33:44 · 457 阅读 · 0 评论 -
【数据结构与算法】【15】AVL树
AVL树的删除和插入基本类似,由于AVL树本来就是高度平衡的,删除一个元素只会影响到parent节点的平衡因子。对于第二种情况,则需要向上递归,更新parent的parent的平衡因子,直到某个parent的平衡因子为0。AVL树的优点在于,查询效率很高,但要维护其平衡性,在插入时需要进行一些转换,这样就会导致其插入效率比较低。判断删除后,parent节点的平衡因子是否大于1,如果大于1,按照一样的方法进行旋转即可。可以看出,最终的树结构和环境因子,和我们上面图示的情况一模一样,完全正确。.........原创 2022-07-19 14:27:28 · 752 阅读 · 0 评论 -
【数据结构与算法】【14】以树状形式打印二叉树
技术难点以树状形式打印二叉树的关键难点在于,如何计算和控制每个节点的打印位置解决思路将二叉树的所有节点从左往右全部打印出来,正好和二叉树中序遍历的结果是一样的利用这个特点,我们就可以通过中序遍历结果,来反推每个节点位置,再按广度优先遍历算法,逐行打印即可具体方案和流程图如下二叉树中序遍历每个字符间要保持一定间隔,所以加上占位符广度优先遍历保持每个节点横向位置不变,根据广度优先遍历调整节点层次位置将占位符替换为连接符和空白字符这样就大功告成了,思路有了,实现就不难了注意细节实现代码这里我们只讲解怎么打原创 2022-06-14 18:16:56 · 3599 阅读 · 0 评论 -
【数据结构与算法】【13】二叉查找树
什么是二叉查找树二叉查找树,英文名Binary Search Tree,又叫二叉搜索树,二叉排序树二叉查找树是一种特殊的二叉树,它在二叉树的基础上,增加了如下规定简单来说,就是数值左小右大的二叉树二叉查找树的特点就决定了,它是用来排序和查找用的二叉查找树插入规则二叉查找树的插入操作特别简单,小的往左插,大的往右插,已存在的不插就行了二叉查找树删除规则二叉查找树的删除操作,则要讲究一点技巧了因为树中间的枝节点被删除后,会留下一个空洞,一定要想办法补上空位才行我们的做法是,将被删除位置的右子节点移上来填充空位原创 2022-06-11 17:11:03 · 376 阅读 · 0 评论 -
【数据结构与算法】【12】前缀表达式、中缀表达式、后缀表达式
什么是前缀表达式、中缀表达式、后缀表达式前缀表达式、中缀表达式、后缀表达式,是通过树来存储和计算表达式的三种不同方式以如下公式为例(a+(b−c))∗d( a+(b-c) )*d(a+(b−c))∗d通过树来存储该公式,可以表示为那么问题就来了,树只是一种抽象的数据结构,它必须要通过某个形式的文本来才能存储和输入此时,就有了三种表示方法:前缀表达式、中缀表达式、后缀表达式它们分别相当于树的前序遍历、中序遍历、后序遍历,前中后指的是遍历时符号的遍历顺序前序遍历:符号 - 左操作数 - 右操作数中序遍历:左操原创 2022-06-06 10:22:48 · 17456 阅读 · 0 评论 -
【数据结构与算法】【11】树的遍历算法
为什么要学习树的遍历算法二叉树的遍历方式有多种,根据每种遍历方式的不同特性,在现实中有着不同的应用价值随着我们学得越深入越底层,就会发现二叉树的应用无处不在,很多基础技术,底层都是通过二叉树实现的比如数据库系统、文件系统、编译系统、组织架构展示等等我们先掌握每种遍历算法,以后再学习其具体应用时,就很容易理解了广度优先遍历和深度优先遍历二叉树遍历方式整体分为两大类深度优先遍历的几种方式上面已经提到,深度优先遍历是先遍历当前子树,再遍历同级节点而子树如何遍历,根据父节点的访问顺序,可分为三种方式定义树原创 2022-06-03 16:07:34 · 644 阅读 · 0 评论 -
【数据结构与算法】【10】数据结构之树
树结构树是一种嵌套型结构,用来表达上下级和归属关系每个树节点可以拥有若干个下级节点,并且下级节点的结构和上级节点的结构完全相同,可以再拥有自己的下级树的分类原创 2022-05-30 11:49:13 · 118 阅读 · 0 评论 -
【数据结构与算法】【09】LinkedList API 详解
JDK中和栈、队列相关的类JDK中提供了若干和栈、队列相关的类或接口,主要有如下几个 List,JDK自带的线性表接口,Java中几乎所有的线性表结构,都实现了List接口 Vector,Vector相当于一个线程安全的ArrayList,在它的基础上,控制元素的插入删除位置,就能实现栈和队列的功能 Stack,继承自Vector,是JDK自带的栈类型 Queue,JDK自带的队列类型,但只是一个接口 Deque,JDK自带的双向队列类型,也是一个接口,双向队列本身的结构决定了,它既能当栈原创 2022-05-28 15:55:36 · 494 阅读 · 0 评论 -
【数据结构与算法】【08】数据结构之栈和队列
什么是栈和队列栈和队列是两种特殊的线性表结构,它们不像数组和链表一样,可以在任意位置插入数据 栈规定,数据只能从顶部插入,只能从顶部移除就像堆砖块一样,只能从顶部添加新砖块,也只能从顶部拿走旧砖块,不能从中间抽走砖块 队列规定,数据只能从尾部插入,只能从头部移除就像食堂的取饭队伍一样,只能从后面排,前面出去,不能插队 栈的特点,可以用后进先出来概括,队列的特点,可以用先进先出来概括可见,栈和队列,跟数组和链表并没有太大区别,只是限制了插入删除位置而已因此,数组和链表,都可以用来实现栈和队原创 2022-05-26 09:49:03 · 118 阅读 · 0 评论 -
【数据结构与算法】【07】数据结构之双向链表
双向链表上章我们提到了静态链表,这严格来说,并不算是标准的链表只是以顺序表的方式,间接实现了链表的随机存储功能,以供没有指针功能的语言使用这节我们开始讲解标准的链表,即以指针方式实现的链表标准的链表常见的形式有单向链表、双向链表、循环链表三种顾名思义,单向链表只能向后查找,只有next指针,双向链表可以向前查找,有next和previous两个指针循环链表是一种特殊的单向链表,它仅仅是将单向链表的尾节点next指向了头节点,主要用来实现循环遍历的功能由于它们的功能都差不多,所以我们只讲解双向链原创 2022-05-25 10:43:15 · 118 阅读 · 0 评论 -
【数据结构与算法】【06】数据结构之静态链表
什么是静态链表静态链表是一种特殊的链表,它以数组和游标,来间接实现指针的连接效果这种方式,主要适合一些,没有指针,没有面向对象特性的语言游标在这里指的就是数组下标,因为没有指针,就用数组下标来标记数据地址静态链表的主要存储原理包括 用数组来代替随机存储 数组中的元素,必须包含data数据和next游标两部分,next游标指示下个元素在数组中的下标 用两个特殊的值来代表和表尾和闲置,比如游标等于-1表示已经到达表尾,游标等于-2表示数组该位置无元素 由于链表存在插入、删除、移动等操作,这些操原创 2022-05-23 11:20:37 · 160 阅读 · 0 评论 -
【数据结构与算法】【05】数据结构之链表
线性表线性表统指可以按顺序逐个访问的数据结构前面讲到的数组,本章要讲的链表,后面要讲的栈和队列,都是线性表链表线性表只定义了数据的访问方式,至于数据如何存储,那就有两种方式一种是数据在内存中连续存储,这种叫做顺序表,即上章提到的数组一种是数据在内存中随机存储,哪里有位置存哪里,但通过一个指针连接起来,也能起到按顺序访问的效果第二种就是本章要讲的链表链表的优点由于数组必须一次性开辟大量内存,并且不能修改长度,因此添加和删除特别不方便而链表的数据位置是任意的,这样就可以很方便的新增元素,或原创 2022-05-17 14:13:26 · 224 阅读 · 0 评论 -
【数据结构与算法】【04】数据结构之数组
数组数组,英文名Array是一种最简单的数据结构,即用一段连续的内存,存储若干个相同类型的对象这种结构只需要根据对象数量,直接在内存中分配连续的空间就行了,是所有语言都默认支持的基本类型数组特点 内存连续分配,按下标就能直接找到对象地址,所以访问和修改速度非常快,相当于直接根据内存地址查数值 由于是连续内存,所以只能一次性分配,不可能后面再修改数组长度 由于数组长度不可改变,因此添加和删除只能变通进行,不方便且效率低动态数组虽然数组长度不可变,但我们可以新建一个数组,再将旧数组的数据原创 2022-05-13 10:38:20 · 118 阅读 · 0 评论 -
【数据结构与算法】【03】算法复杂度
什么是算法算法就是解决问题的一套步骤,任何领域都存在算法,本专栏的算法则是和编程中的数据结构相关的算法前面提到,数据结构就是数据在内存中的存储和组织方式那么我们如何对这些数据进行添加、删除、修改、查找、排序,这就形成了一套套的算法它们完整的说法应该是,通用数据结构操作算法算法性能一个算法的好坏,即性能评价指标,主要包括两方面一是时间上的,即CPU进行了多少次运算,消耗了多长的时间一是空间上的,即计算过程中,程序本身、用户输入、运算过程中产生的临时变量,总共占用了多大内存时间和空间两方面的性原创 2022-05-12 20:00:00 · 124 阅读 · 0 评论 -
【数据结构与算法】【02】Java常用集合类特性分析和底层实现
Java集合类和通用数据结构的区别Java集合类是从数据使用方式的角度,对复杂数据类型进行分类的 List存储有序的单列数据,是纯数值集合,可以根据位置查找数据 Set存储无序的单列数据,是纯数值集合,但是没有顺序和位置的概念 Map存放双列数据集合,是键值対集合,每个数据包含关键字和实际值两列,可以通过关键字查对应值通用数据结构则是从数据内存结构的角度,对复杂数据类型进行分类的误区大多时候,数据的使用方式,就已经决定了其底层采纳的内存结构比如一想到List,就想到数组、链表,一想到Ma原创 2022-05-11 17:17:14 · 339 阅读 · 0 评论 -
【数据结构与算法】【01】数据结构与算法知识点纲要
前言本博客专栏主要讲解通用的数据结构和算法,并通过Java语言实现同时还会讲解各种数据结构在JDK源码中的应用其它语言的读者也可以阅读,毕竟数据结构都是通用的,不同语言的语法也大同小异我们只是实现一下算法,也不会用到很高深的语法,无非就是类、判断、循环、赋值这些基础语法知识点纲要...原创 2022-05-07 11:10:04 · 450 阅读 · 0 评论