![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA数据结构和算法学习
彷徨的我第一次尝试
这个作者很懒,什么都没留下…
展开
-
JAVA数据结构(13) 常用十种算法 、 2 分治算法解决汉诺塔问题
常用十种算法2 分治算法算法介绍:分支法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,在把子问题的解合并。这个技巧是很多高效算法的基础,入排序算法(快速排序、归并排序)等分治算法的基本步骤: 分治算法在每一层递归上都有三个步骤:分解:将原问题分解成若干个规模较小,相互独立,于原问题形式相同的子问题;解决:若子问题规模较小而容易被解决则直接解决掉,否则递归地拆解各个子问题;合并:将各个子问题的解合并为原问题的解。分治算法的设计模式原创 2020-11-30 17:34:31 · 229 阅读 · 0 评论 -
JAVA数据结构(13) 常用十种算法 、二分查找算法(非递归)
常用十种算法1 二分查找算法(非递归)对于数组{1,3,8,10,11,67,100},使用非递归的方式完成二分查找。实现思路:递归方式的实现思路通过传入本轮查找的起始位置和终止位置作为参数,实现不断的分段递归。非递归方式则无需传参,只需要在循环中不断改变查找的左右位置即可。完整代码实现(递归+非递归):/** * 非递归二分查找 */public class BinarySearch { public static void main(String args[]){原创 2020-11-30 17:32:30 · 169 阅读 · 0 评论 -
JAVA 数据结构 12-图的实现、深度遍历DFS、广度遍历BFS
JAVA 数据结构 12-图--图创建、深度、广度遍历完整代码见最后问题:为什么要有图? 线性表局限于一个直接前驱和一个直接后继的关系,当我们需要表示多对多的关系时,就需要用到图的结构。图的基本介绍: 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。结点也可以称为顶点。如图:图的表示方式: 图的表示方式有两种:二维数组表示(邻接矩阵)和链表表示(邻接表)邻接矩阵是表示图中顶点之间直接相邻关系的矩阵,对于n个顶点的图而言,矩阵的行和列表示第n个点。若原创 2020-10-21 14:35:42 · 261 阅读 · 1 评论 -
JAVA数据结构与算法 11(5)树-平衡二叉树介绍、动画解析 平衡二叉树的构建操作、右旋转、左旋转、双旋转
JAVA数据结构与算法 11.树4 平衡二叉树4.1 平衡二叉树介绍 平衡二叉树也叫平衡二叉搜索树,又被称为AVL树,可以保证查询效率较高。具有以下的特点:在二叉排序树的基础上,它是一颗空树或它的左右两颗子树的高度差绝对值不超过1,并且左右两个子树都是一颗平衡二叉树。问题1:如何构建一颗平衡二叉树? 在构建二叉排序树的时候,每添加一个结点,判断根结点的左右子树的高度差,若大于1,则需要进行相应的处理。问题2:处理分为哪几种情况,每种情况需要做什么处理? 当当前结点右子树的高度-左子树的原创 2020-10-20 14:18:33 · 249 阅读 · 0 评论 -
JAVA数据结构与算法 11(4)树-二叉排序树介绍、二叉排序树的创建、二叉排序树的删除
JAVA数据结构与算法 11.树3 二叉排序树3.1 二叉排序树介绍 二叉排序树:BST(Binary Sort Tree),对于二叉排序树的任何一个非叶子结点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。3.2 二叉排序树的创建实现思路:对于数列{7,3,10,12,5,1,9},先将第一个数字7设置为二叉排序树的根节点;遍历数列,将剩余的数字插入树中:每一次插入均从根节点出发;若待插入的值大于当前节点,判断当前节点的左子树是否为空,若为空则直接将待插入节点原创 2020-10-19 13:58:20 · 147 阅读 · 1 评论 -
JAVA数据结构与算法 11(3)树-哈夫曼树的基本介绍、哈夫曼树创建实现、哈夫曼编码、利用哈夫曼编码压缩
JAVA数据结构与算法 11.树2 哈夫曼树2.1 哈夫曼树的基本介绍 给定n个权值作为n个叶子结点,构造一颗二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称哈夫曼树。因此权值较大的结点距离根节点较近。哈夫曼中的一些概念: 路径和路径长度:在一颗树中,从一个结点往下可以达到的孩子或孙子结点hi前的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为1,则从根节点到第L层结点的路径长度为L-1。 结点的权和带权路径长度:若将树中结点赋给一个有某原创 2020-10-14 16:35:00 · 255 阅读 · 1 评论 -
JAVA数据结构与算法 11(2)树-顺序存储二叉树 线索化二叉树 线索+遍历(遍历、查找、子树删除)
JAVA数据结构与算法 11.树1 二叉树1.4 顺序存储二叉树 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。堆排序会使用到顺序存储二叉树要求:要求以数组的方式来存放二叉树要求在遍历数组arr时,仍然可以以前序、中序和后序的方式完成结点遍历存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为2*n+1第n个元素的右子节点为2*n+2第n个元素的父节点为(n-1)/2n:表示二叉树中的第几个元素(按0开始原创 2020-10-13 16:16:54 · 134 阅读 · 0 评论 -
JAVA数据结构 08.排序算法(4) 堆排序 的算法思路图解和代码实现
JAVA数据结构 08.排序算法2. 八大排序算法 实现 解析 和优化2.7 堆排序算法介绍: 堆排序是利用堆这种数据结构而设计的一种排序算法,是一种选择排序,是不稳定的。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆。注意:没有要求结点左右结点值的大小关系。每个结点的值都小于等于其左右孩子结点的值,称为小顶堆。 大顶堆举例: 可以对堆中的结点按层进行编号,顺序存储二叉树得到数组arr: 大顶堆的特点:由顺序存储二叉树的可得,arr[i] &原创 2020-10-13 16:14:20 · 119 阅读 · 0 评论 -
JAVA数据结构与算法 11(1).树-为什么需要树这种数据结构? 二叉树的概念、二叉树的操作(遍历、查找、子树删除)
JAVA数据结构与算法 11(1).树前景问题:为什么需要树这种数据结构?回答:对于数组存储方式而言,通过下标方式访问元素,速度快,但若需要插入或删除某一个值时,效率很低;对于链式存储方式而言,插入删除数据时,只需要将结点插入或删除,速度很快,但进行检索时,效率很低;有没有一个数据结构可以同时增加数据的存储和读取的效率?树型结构能提高数据存储和读取的效率,比如利用二叉排序树,即可以保证数据检索的速度,同时也可以保证数据的插入,删除,修改的速度。1 二叉树1.1 二叉树的概念树有很多种,每个节原创 2020-10-12 17:12:20 · 328 阅读 · 2 评论 -
JAVA数据结构与算法 10.哈希表基本概念、结构介绍、JAVA代码实现
JAVA数据结构与算法 10.哈希表使用场景: 有一个公司,当有新的员工来报道时,要求改员工的信息加入(id,性别,年龄,名字…),当输入该员工的id时,要求查找该员工的所有信息。要求:不适用数据库,尽量节省内存,速度越快越好解决方法:哈希表(散列)1 哈希表的基本概念什么是哈希表? 哈希表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫散列函数,存原创 2020-10-12 10:24:21 · 116 阅读 · 0 评论 -
JAVA数据结构与算法 09.四大查找算法思路解析和代码实现 【线性查找、二分查找、插值查找、斐波那契(黄金分割法)查找】
JAVA数据结构与算法 09.查找算法在java中,常用的查找有四种:顺序(线性)查找二分查找/折半查找插值查找斐波那契查找按照上面的顺序依次介绍1. 线性查找算法介绍:最简单的查找,通过遍历集合,匹配数组中数与待查询数value相同的数字,返回下标;匹配失败返回-1。特点:顺序遍历;不需要数组有序代码实现:public class SeqSearch { public static void main(String args[]){ int[] arr原创 2020-10-10 15:32:58 · 232 阅读 · 0 评论 -
JAVA数据结构 08.排序算法(3) 基数排序 桶排序 的算法思路图解和代码实现
JAVA数据结构 08.排序算法2. 八大排序算法 实现 解析 和优化2.7 基数排序(桶排序)算法介绍:基数排序是桶排序的扩展,是使用空间换时间的经典算法。桶排序顾名思义,它是通过键值的各个位的值,将要排序的元素分配到某些“桶”中,达到排序的目的。基数排序是效率高的稳定性排序法,它是将整数按位数切割成不同的数字,然后按每个位数分别比较。算法思想:创建10个桶bucket,标号分别为0~9,对应个位数值为0~9;获取数组arr中最大值的位数maxLength,算法的循环次数就是位数的值max原创 2020-10-10 10:57:36 · 130 阅读 · 0 评论 -
JAVA数据结构 08.排序算法(2) 快速排序和归并排序的算法思路图解和代码实现
JAVA数据结构 08.排序算法2. 八大排序算法 实现 解析 和优化2.5 快速排序算法介绍:快速排序是对冒泡排序的一种改进。算法思想:设置两个索引指针指向待排序数据的头和尾;通过一趟排序将要排序的数据分割成两部分(将数组最左边的数作为基准点);通过移动头尾指针,寻找逆序的两个数字(头指针值比基准点大和尾指针比基准点小),对两个数字进行交换,实现第一轮交换。一次移动头尾指针,交换所有逆序数,当头指针和尾指针重合时,循环结束;当一轮循环结束后,使得头(尾)指针前一部分的所有数据都比另外一原创 2020-10-09 17:04:24 · 157 阅读 · 0 评论 -
JAVA数据结构 08.排序算法(1) 排序算法的介绍和分类 算法的时间复杂度 冒泡排序 选择排序 插入排序 希尔排序
JAVA数据结构 08.排序算法(1)1.排序算法的介绍和分类排序:将一组数据,以指定的顺序进行排列的过程排序的分类:内部排序:将需要的所有数据加载到内存中进行排序**(8大排序算法)**插入排序直接插入排序希尔排序选择排序简单选择排序堆排序交换排序冒泡排序快速排序归并排序基数排序外部排序:数据量过大,无法全部加载到内存中,需要借助外存进行排序,先部分排序后合并度量一个排序算法:算法的时间复杂度算法的空间复杂度2. 八大排序算原创 2020-09-19 18:33:10 · 151 阅读 · 0 评论 -
JAVA数据结构 07.递归 迷宫问题 八皇后问题
JAVA数据结构 07.递归 迷宫问题 八皇后问题1. 递归介绍和解决思路递归:简单来说,递归就是方法自己调用自己,每次调用时传入不同的变量. 递归有助于编程者解决复杂的问题(只需要关注每一次递归解决的问题),同时可以让代码变得简洁.递归调用规则:当程序执行到一个方法时,就会开辟一个独立的空间(存储再栈中);每个空间的数据(局部变量)都是独立的;递归必须向退出递归的条件逼近,否则就是无限递归,产生栈溢出错误当一个方法执行完毕,或者遇到return时,就会返回到调用该方法的地方继续执行下原创 2020-09-13 13:56:20 · 194 阅读 · 0 评论 -
JAVA 数据结构-06 (3) 栈结构的应用 前 中 后缀三种表达式 中缀表达式转后缀表达式 逆波兰计算器实现和算法思路
JAVA 数据结构学习-05.栈2. 栈结构的应用(表达式与计算器)2.2 前 中 后缀三种表达式前缀表达式(波兰表达式)运算符位于操作数之前举例:(3+4)*5-6的前缀表达式就是 - * + 3 4 5 6计算机求值的流程:从右至左进行扫描,遇到数字,将数字压入堆栈,遇到运算符,弹出栈顶两个数,用运算符进行计算,并将结果压入栈,重复操作直到表达式最左端,最后得出的结果就是表达式的结果.中缀表达式最常见的运算表达式 (3+4)*5-6对于计算机并不好操作( 需要判断相邻运算符原创 2020-09-12 17:08:17 · 142 阅读 · 0 评论 -
JAVA 数据结构-06 (2) 栈结构的应用 简易计算表达式的计算(中缀表达式)
JAVA 数据结构学习-06 栈2. 栈结构的应用(表达式与计算器)2.1 简易计算表达式的计算(中缀表达式)70*2*2-5+1-5-3+4实现思路:设置2个栈结构,一个数栈numStack只用来保存数字;一个符号栈operStack只用来保存符号.通过一个index值来遍历我们的表达式;如果发现index值是一个数字,就直接入符号栈;如果发现扫描到一个符号:分为一下三种情况:如果符号栈为空,就直接入栈如果符号栈不为空且当前index扫描的操作符优先级小于或等于栈顶的操作符,就需要原创 2020-09-12 17:06:20 · 142 阅读 · 0 评论 -
JAVA 数据结构-06 (1)栈的基本数据结构实现(数组实现,链表实现)
JAVA 数据结构-06 栈栈是一个先入后出的有序列表栈式限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表.允许插入和删除的一端,为变化的一端,称为栈顶,另一端为固定的一端 ,称为栈底.栈的基本应用场景:子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,直到子程序执行完成之后再将地址取出,以回到原来的程序.处理递归调用:和子程序调用类似,只是除了存储下一个指令的地址外,也将参数和区域变量等数据存入堆栈中表达式的转换 [中缀表达式转后缀表达式] 与求原创 2020-09-12 17:04:31 · 99 阅读 · 0 评论 -
递归问题解决思路 83. 删除排序链表中的重复元素 24. 两两交换链表中的节点 203. 移除链表元素
递归问题解决思路 案例小结看了leetcode上一篇博主发的博客套路解决递归问题按照他的思路用递归写了几道题目83. 删除排序链表中的重复元素题目:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。输入: 1->1->2输出: 1->2思路:使用递归方式解题,注重三个方面:找到整个递归的终止条件:递归应该在什么时候结束? 此题在链表遍历到最后一个元素时终止.找返回值:应该给上一级返回什么信息?此题应该返回已经处理好的链表找单次递归的任务:本次递归原创 2020-09-06 15:06:09 · 152 阅读 · 0 评论 -
JAVA数据结构-05 双向链表的实现
JAVA数据结构-04 双向链表 双向链表的结构与单向链表相同,包含数据域和指针域.区别在于双向链表同时包含指向下一个节点的next指针和指向上一个节点的pre指针.单向链表只能从前往后进行遍历,双向链表可以从前和后两个方向进行遍历单向链表不能自我删除,需要靠辅助节点进行,所以单向链表的删除需要找到前一个节点.而双向链表可以进行自我删除.双向链表的结构数据节点://每一个数据节点就是一个music对象class Music2{ public int no; public原创 2020-09-06 14:10:42 · 116 阅读 · 0 评论 -
JAVA数据结构-04 单向环形链表解决约瑟夫问题
JAVA数据结构-04 单向环形链表解决约瑟夫问题问题描述:num个人围成一圈,从第start个开始报数,第k个出圈,最后剩下一个,求出圈的顺序。构建一个单向环形链表思路:先创建第一个节点,让这个节点的next指针域指向自己,并形成环形后面当我们每创建一个新的节点,就把该节点,加入到已有的环形链表即可遍历时判断遍历一圈结束的条件.temp.next == first数据节点:class Child{ public int no; public Child next;原创 2020-09-06 13:29:40 · 135 阅读 · 0 评论 -
JAVA数据结构-3.链表
JAVA数据结构-单链表链表(Link list)是以节点的方式来存储,各个节点不一定是连续存放的每个节点包含data域,next域,指向下一个节点链表分带头节点的链表和没有头节点的链表,根据实际需求来确定链表在内存中的存储情况:链表(带头节点)的逻辑结构: head节点不存放具体的数据,作用就是表示单链表的头和指向第一个数据节点的指针next单链表的结构定义一个节点类,每一个类对象就是一个数据节点每个数据节点包含自己的数据域data和指向下一个对象的指针域next//每一原创 2020-09-05 16:41:56 · 151 阅读 · 0 评论 -
JAVA数据结构-链表算法题 21. 合并两个有序链表 剑指 Offer 22. 链表中倒数第k个节点 剑指 Offer 06. 从尾到头打印链表 剑指 Offer 24. 反转链表
JAVA数据结构-单链表 算法题21. 合并两个有序链表题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:1->2->4, 1->3->4输出:1->1->2->3->4->4方法:循环比较两链表的首个数据节点,将较小的值插入新链表.类似于插入排序,以一个链表L1作为基础,将另外一个链表L2的节点不断遍历比较并插入L1.将两链表相连,直接进行排序操作 (超时)方法一思路:原创 2020-09-05 16:40:21 · 149 阅读 · 0 评论 -
JAVA数据结构-2.普通队列和循环队列的实现以及JAVA的Queue的使用解析
数据结构和算法2. 队列 队列是一个有序列表,可用用数组或是链表来实现. 遵循先入先出的原则.实现思路(普通队列) 使用数组的结构来实现队列时,创建一个类,其中包含数组对象queue,同时需要maxSize来表示该队列的最大容量;因为队列的输入和输出时分别从前后端来处理,因此需要两个变量front以及rear分别记录队列前后端的下标,front会随着数据输出而改变,rear则随着数据的输入而改变;其中,front指向队列中队列头一个对象的前一个位置.rear指向队列尾的位置.原创 2020-08-30 16:58:17 · 148 阅读 · 0 评论 -
JAVA数据结构-1.稀疏数组介绍和使用案例
数据结构和算法学习从JAVA的视角学习数据结构和算法,实现算法的同时分析JDK源码实现.1. 稀疏数组 当一个数组中大部分元素为0 ,或者为同一个数值的数组时,可用使用稀疏数组来保存该数组.处理方法:第一列记录数组一共有几行几列,有多少个不同的值.把具有不同值的元素的行列及值记录在一个小规模的数组中(稀疏数组),从而缩小程序的规模.因此稀疏数组总是一个N行3列的数组,N为原二维数组中不同值个数+1.实现思路: 二维数组转稀疏数组:分析遍历二维数组,找出不同值的个数sum;根原创 2020-08-30 16:53:02 · 141 阅读 · 0 评论