Java数据结构与算法
Java 数据结构与算法 学习
阿星小天地
邮箱:vincezon@126.com
博客园:https://www.cnblogs.com/vincezon
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java最短路径:Floyd(弗洛伊德)算法、最短路径问题、思路分析、代码实现
Floyd(弗洛伊德)算法dijkstra算法与floyd算法的区别:迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径;弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一个顶点到其他顶点的最短路径。案例:最短路径问题这里有6个村庄,分别是A、B、C、D、E、F,从G点出发需要将邮件分别送到这6个村庄,各个村庄有不同的路线,路线上都标有公里数,计算各个村庄到各个村庄的最短距离?. 思路分析如果已A为中间顶点,即可能的路线为:.原创 2020-06-14 16:30:31 · 1170 阅读 · 0 评论 -
Java最短路径:Dijkstra(迪杰斯特拉)算法、最短路径问题、思路分析、代码实现
Dijkstra(迪杰斯特拉)算法迪杰斯特拉算法是经典的最短路径算法,用于计算一个节点到其他节点的最短路径。它主要的特点是以起始点为中心向外层层扩展(广度优先搜索算法),直到扩展到终点为止。案例:最短路径问题这里有6个村庄,分别是A、B、C、D、E、F,从G点出发需要将邮件分别送到这6个村庄,各个村庄有不同的路线,路线上都标有公里数,计算G村庄到各个村庄的最短距离?如果从其他点出发,各个点的最短距离又是多少?. 思路分析整体思路:选择G为起始点,那么G就设为已访问,用一个记录路径的数组.原创 2020-06-14 16:26:52 · 2150 阅读 · 1 评论 -
Java最小生成树:Prim(普里姆)算法、Kruskal(克鲁斯卡尔)算法、案例、思路分析、代码实现
文章目录Prim(普里姆)算法案例:修路问题(最小生成树). 思路分析. 代码分析Kruskal(克鲁斯卡尔)算法案例:修公路站牌问题(最小生成树). 思路分析. 代码实现. 终点解释Prim(普里姆)算法案例:修路问题(最小生成树)有一乡有7个村庄(A,B,C,D,E,F,G)现在需要修路把7个村庄连通,各个村庄的距离用边线表示(权),比如A-B距离5公里。问:如何修路保证各个村庄都能连通,且总的修建公路总里程最短?修路问题的本质就是最小生成树问题,最小生成树(Minimum Cost Sp原创 2020-06-14 16:23:27 · 839 阅读 · 3 评论 -
Java贪心算法之广播台集合覆盖问题、思路分析、代码实现
文章目录贪心算法案例:广播台集合覆盖问题. 思路分析. 代码实现贪心算法贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。案例:广播台集合覆盖问题如何选择最少的广播台,让所有地区都可以收到信号?. 思路分析用一个arealist集合原创 2020-06-14 16:17:22 · 723 阅读 · 1 评论 -
Java算法之KMP算法、字符串匹配、思路分析、代码实现
KMP算法KMP算法解决模式串在文本串中是否出现过。如果出现过,返回最早出现的索引位置。KMP算法命名,是由3个人的姓氏命名,由D.E.Knuth,J.H.Morris和V.R.Pratt在1997年提出的。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。详尽KMP算法. 思路分析这是因为需要回溯到j位置的上一个字符j-1索引对.原创 2020-06-14 16:14:54 · 212 阅读 · 0 评论 -
Java动态规划算法之01背包问题、思路分析、代码实现
文章目录动态规划算法案例:01背包问题. 思路分析. 代码实现动态规划算法动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够原创 2020-06-14 16:12:20 · 2679 阅读 · 0 评论 -
java分治算法之汉诺塔、思路分析、代码实现
分治算法之汉诺塔分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。1、原问题可以分解为多个子问题这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。2、原问题在分解过程中,递归地求解子问题由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。3、在求解并得到各个子问题的解后应能够采用某种方式、方原创 2020-06-14 16:10:00 · 258 阅读 · 0 评论 -
Java查找算法:线性查找算法、二分查找算法(递归 非递归)、插值查找算法、斐波那契查找算法、思路分析、代码实现
文章目录查找算法1、线性查找算法2、二分(折半)查找算法 (递归)3、二分查找算法 (非递归)4、插值查找算法5、斐波那契(黄金分割)查找算法查找算法1、线性查找算法对无序序列或有序序列的元素查找,线性查找算法就是对数组的遍历,找到该值的索引返回。public class SeqSearch { public static void main(String[] args) { int arr[] = {3,9,-1,-2,20,6}; int index原创 2020-06-14 16:07:50 · 191 阅读 · 0 评论 -
Java排序算法03:归并排序法、基数排序法、推排序法、思路分析、代码实现
文章目录5、归并排序法6、基数排序法7、堆排序法 (不稳定)5、归并排序法归并排序是利用归并的思想实现的排序方法。如上图。思路比较简单,就是对数组进行不断的分割,分割到只剩一个元素,然后,再两两合并起来。归并排序的时间复杂度是比较低的。归并与快速排序法的平均时间复杂度一致,但是比快速排序法稳定。示意图:这里展示将4578和1236合并在一起进行排序的过程:public class MergeSorting { public static void main(String[] a原创 2020-06-14 15:57:47 · 257 阅读 · 0 评论 -
Java排序算法02:希尔排序法、快速排序法、思路分析、代码实现
文章目录4、希尔排序法 (不稳定)5、快速排序法 (不稳定)4、希尔排序法 (不稳定)希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。public class ShellSorting原创 2020-06-14 15:52:35 · 167 阅读 · 0 评论 -
Java排序算法01:冒泡排序、选择排序、插入排序、思路分析、代码实现
文章目录排序算法. 排序算法时间复杂度1、冒泡排序法2、选择排序法 (不稳定)3、插入排序法排序算法排序是笔试最容易出现的题。排序依照指定的规则进行排列的过程。排序分为:内部排序:在内存中进行排序外部排序:由于数据过大,无法将所有数据放到内存中进行排序,需要借助外部存储进行排序. 排序算法时间复杂度1、冒泡排序法交换排序法其中的一种时间复杂度O(n2),需要排序的数量越大,排序时间越久。public class BubbleSorting { public st原创 2020-06-14 15:48:00 · 123 阅读 · 0 评论 -
Java数据结构与算法:图、图的概念、深度优先搜索DFS、广度优先搜索BFS、思路分析、代码实现
文章目录图一、图概念1、图的名词解释2、图的表示方法3、代码实现二、深度优先搜索 DFS (算法). 思路分析.代码实现三、广度优先搜索 BFS (算法). 思路分析. 代码实现图图是一种数据结构,其中节点可以具有零个或多个相邻元素。两个节点之间的连接称为边。节点也可称为顶点。表示多对多的关系时,就会用到图。一、图概念1、图的名词解释2、图的表示方法3、代码实现创建以下无向图:public class GraphDemo { public static void原创 2020-06-14 15:37:18 · 216 阅读 · 0 评论 -
Java数据结构与算法:多路查找树简单介绍、2-3树、B树、B+树、B星树简单介绍理解
多路查找树 简单介绍二叉树操作效率较高,但也存在一些问题。在构建二叉树时,需要多次进行i/o操作(因为数据很可能是通过数据库或本地文件中获取的),节点很多,造成二叉树的层数也多,会降低操作速度。因此就提出了多路树。允许每个节点可以有更多的数据项和更多的子节点,就是多叉树。比如2-3树,2-3-4树就是多叉树,多叉树通过重新组织节点,减少树的高度,能对二叉树进行优化。1、2-3树2-3树:2-3树是最简单的B树。需要保证顺序。性质:2-3树所有的叶子节点都在同一层 (只要是B树都满足这原创 2020-06-14 15:32:13 · 281 阅读 · 0 评论 -
Java数据结构与算法:平衡二叉树AVL、左旋转、右旋转、双向旋转、代码实现
文章目录平衡二叉树 AVL. 向左旋转. 向右旋转. 双向旋转. 代码实现平衡二叉树 AVL平衡二叉树是对二叉排序树的增强。AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of informati原创 2020-06-14 15:29:51 · 340 阅读 · 0 评论 -
Java数据结构与算法:二叉排序树BST、二叉排序树添加删除、代码实现
文章目录二叉排序树 BST1、二叉排序树 添加1)思路分析2)代码实现2、二叉排序树 删除1)思路分析2)代码实现二叉排序树 BST二叉排序树:BTS(Binary Sort Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子节点或右子节点。二叉排序树的中序遍历,结果就是从小到大的排列。二叉排序树的特点:左子树所有的值一定比根节点小,右子树所有的值一定比根节点大1、二叉排序树 添加1)思原创 2020-06-14 15:25:49 · 1045 阅读 · 0 评论 -
JAVA数据结构与算法:哈夫曼树的创建、哈夫曼编码、思路分析、代码实现
文章目录哈夫曼树. 创建哈夫曼树哈夫曼编码. 思路分析. 代码实现哈夫曼树哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。带权路径总和最小的就是哈夫曼树。即 WPL=叶子节点权*路径+…+叶子节点权*路径中间的树就是哈夫曼树。. 创建哈夫曼树思路分析:将数列从小到大排序,此时每个数据就是一个节点取出前两个节点,作为子节点,计算出父节点的权值(就是两个原创 2020-06-10 20:20:44 · 3054 阅读 · 0 评论 -
JAVA数据结构与算法:二叉树、满二叉树、完全二叉树、前中后序遍历、顺序存储二叉树、线索化二叉树、代码实现
文章目录二叉树1、概念1)二叉树2)满二叉树、完全二叉树3)前序遍历、中序遍历、后序遍历2、前中后序遍历代码实现3、顺序存储二叉树代码实现3、线索化二叉树为什么要引入树?数组存储方式:由于数组访问元素速度快,开可以使用二分查找提高速度,但是在按一定顺序插入新元素时,当数组满了再插入新元素时,效率低速度慢。链式存储方式:链式存储插入很方便,删除效率也高。但是在检索时,效率也比较低,每次都需要从头遍历到尾。树结构存储方式:能提高数据存储,读取效率。既可以保证检索速度,也可以保证数据的插入、删除、修改的原创 2020-06-10 20:15:35 · 245 阅读 · 0 评论 -
JAVA数据结构与算法:哈希表、思路分析、代码实现
哈希表散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。1、关于哈希表的题有一个公司,当有新的员工来报道时,要求将该员工信息加入(id,姓名,年龄),当输入该员工的id时,要求找到该员工的所有信息。要求:不使用数据库,速度越快越好。. 思路分析有3个类:EmpHashTable类:根据id散列每个存入的值;创建原创 2020-06-10 20:05:41 · 143 阅读 · 0 评论 -
Java 数据结构与算法:递归实现八皇后问题、思路分析、代码实现
八皇后 回溯算法在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,有多少种摆法?八皇后游戏连接. 思路分析第一个皇后先放在第一行,第一列第二个皇后放第二行,第一列,然后判断同列是否有皇后,有则放到第二行的第二列,判断是否在同一列,不是再判断是否在同一斜线,如果在同一斜线,就继续放在第二行的第三列,依次类推每放依次就判断一次,都不行,就回退到上一行,继续放下一列再判断原则上八皇后可以是8*8的二维数组表示,但是也可以以一维数组.原创 2020-06-02 12:22:20 · 211 阅读 · 0 评论 -
Java 递归:简易迷宫理解递归、思路分析、代码实现
简易迷宫 递归回溯. 思路分析这是一个迷宫地图,红色代表的是阻碍物墙,白色是可走区域。可将迷宫地图,看成8*8的二维数组。由1代表墙,2代表已行走的通路,3表示已行走的不可通的路。起始点为arr[1][1],终止点为arr[6][6]走的策略:右、下、左、上;先往右走,走不通就返回false,再往下走,依次类推,如果走得通就返回true。. 代码实现public class Maze { public static void main(String[] args) {原创 2020-06-02 12:19:37 · 728 阅读 · 1 评论 -
Java数据结构与算法:后缀表达式(逆波兰表达式)、中缀表达式转后缀表达式、思路分析、代码实现
文章目录一、后缀表达式 (逆波兰表达式). 思路分析. 代码实现 逆波兰计算器二、表达式转换. 中缀转后缀表达式. 思路分析. 代码实现一、后缀表达式 (逆波兰表达式)后缀表达式又称逆波兰表达式。运算符位于操作数之前。比如:(3+2)*6-5 对应后缀表达式就是:3 2 + 6 * 5 -在实际开发中,常常是将中缀表达式转为后缀表达式,因为后缀表达式相对于其他表达式来说对计算机较为友好。. 思路分析计算机从左至右扫描表达式,遇到数字直接入栈,遇到运算符,弹出栈顶和次顶的两个数进行运算,最后将原创 2020-05-31 18:19:31 · 533 阅读 · 0 评论 -
Java数据结构与算法:栈数据结构与前缀表达式、中缀表达式(思路分析、代码实现)
文章目录栈实现综合计算器运算1、前缀表达式 (波兰表达式). 思路分析2、中缀表达式. 思路分析. 代码实现栈实现综合计算器运算1、前缀表达式 (波兰表达式)前缀表达式又称波兰表达式。运算符位于操作数之前。比如:(3+2)*6-5 对应前缀表达式就是:- * + 3 2 6 5. 思路分析计算机从右至左扫描前缀表达式,依次将数字入栈。当遇到运算符,弹出栈顶和次顶两个数进行运算,运算结果再次入栈,遇到下一个运算符,又弹出栈顶和次顶两个数进行运算,运算结果再次入栈,依次类推…最终得到运算结果。原创 2020-05-31 18:16:02 · 344 阅读 · 0 评论 -
Java数据结构与算法:数组模拟栈的实现,思路分析,代码实现
文章目录栈1、数组模拟栈的实现1)思路分析2)代码实现栈栈是一个先进后出(FILO)的有序列表。入栈:push出栈:pop栈的应用场景:子程序的调用处理递归调用表达式的转换[中缀表达式转后缀表达式]与求值二叉树的遍历图形的深度优先(depth—first)搜索法1、数组模拟栈的实现1)思路分析定义一个top变量,用于记录最顶层元素索引当数组中没有任何元素时,top的值为-1当添加一个元素时,top++; arr[top]=value,进行添加值当删除顶部元素时,val原创 2020-05-31 18:12:42 · 214 阅读 · 0 评论 -
Java数据结构与算法:单向环形链表、约瑟夫问题、思路分析、代码实现
文章目录单向环形链表1、经典 约瑟夫问题. 思路分析. 代码实现单向环形链表1、经典 约瑟夫问题Josephus约瑟夫环、约瑟夫问题又称“丢手绢问题”。有n个人,编号为1~n,从第k个人开始报数,从1开始报,报到m的人会死掉,然后从第m+1个人开始,重复以上过程。在死了n-1个人后,问最后一个人的编号是?. 思路分析添加新节点:示意图 — 添加7号新节点首先要明确一个头节点,给一个辅助变量head一直指向头节点1。再给一个辅助变量temp,用于遍历链表,当temp.next==h原创 2020-05-30 20:26:53 · 262 阅读 · 0 评论 -
Java数据结构与算法:双向链表、增删改查、思路分析、代码实现
文章目录双向链表1、双链表的 增 删 改 查 思路分析2、代码实现双向链表双链表示意图:链表是以节点的方式存储,链式存储每个节点包含pre域(用于存储上一个节点对象)、data域(用于存储该节点中的数据) 和 next域(用于存储下一个节点对象)各个节点不一定连续存储链表分带头节点和不带头节点两种,根据实际需求来确定1、双链表的 增 删 改 查 思路分析头节点不存任何数据,只用作链表的头,方便对链表操作等。增加插入新节点如果直接从双向链表的尾节点添加新的节点new原创 2020-05-30 20:23:15 · 353 阅读 · 0 评论 -
Java数据结构与算法:单向链表、增删改查、求单链表有效节点个数、查找单链表倒数第k个节点、单链表反转、从尾到头打印单链表、合并两个有序链表后依然有序
文章目录单向链表1、单链表的 增 删 改 查 思路分析2、代码实现3、练习题# 1求单链表中有效节点个数# 2查找单链表中倒数第k个节点# 3单链表的反转# 4从尾到头打印链表# 5合并两个有序链表,合并之后链表依然有序,并返回合并后的链表4、对辅助节点的理解5、单链表的缺点单向链表单链表示意图:链表是以节点的方式存储,链式存储每个节点包含data域(用于存储该节点中的数据) 和 next域(用于存储下一个节点对象)各个节点不一定连续存储链表分带头节点和不带头节点两种,根据实际需求来确定原创 2020-05-30 20:18:49 · 568 阅读 · 0 评论 -
Java数据结构与算法:数组模拟队列、环形队列、思路分析
文章目录队列1、数组模拟队列思路分析代码实现存在的问题2、数组模拟环形队列思路分析代码实现队列队列可以用数组和链表来实现。遵循FIFO (先进先出)1、数组模拟队列该数组模拟队列不是环形的,该列子用于理解队列的工作过程。思路分析数组模拟队列示意图rear表示尾部(指向尾元素),front表示头部(头元素的前一个位置)。从图中可看出,当数组队列中没有任何元素时,rear和front都是指向-1的位置;当有元素加入到队列中,rear就依次增加指向,front没有动;当有元素移除队列时原创 2020-05-29 21:16:09 · 216 阅读 · 0 评论 -
Java数据结构与算法:稀疏数组、五子棋案例、思路分析、代码实现
文章目录稀疏数组1、思路分析2、代码实现稀疏数组在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。1、思路分析实际运用:五子棋蓝色棋子以2表示;黑色棋子以1表示。可将其转换成二维数组:由于0占位太多,也没有具体的意义,可对该数组进行压缩。压缩后的数组,第一行存储的是原数组有几行几列有几个有效值。从索引为1开始,记录每个元素在原数组的索引位置,以及值。2、代码实现代码演示:import java.io.*;import原创 2020-05-29 21:11:40 · 444 阅读 · 0 评论
分享