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 · 1197 阅读 · 0 评论 -
Java最短路径:Dijkstra(迪杰斯特拉)算法、最短路径问题、思路分析、代码实现
Dijkstra(迪杰斯特拉)算法 迪杰斯特拉算法是经典的最短路径算法,用于计算一个节点到其他节点的最短路径。它主要的特点是以起始点为中心向外层层扩展(广度优先搜索算法),直到扩展到终点为止。 案例:最短路径问题 这里有6个村庄,分别是A、B、C、D、E、F,从G点出发需要将邮件分别送到这6个村庄,各个村庄有不同的路线,路线上都标有公里数,计算G村庄到各个村庄的最短距离?如果从其他点出发,各个点的最短距离又是多少? . 思路分析 整体思路: 选择G为起始点,那么G就设为已访问,用一个记录路径的数组.原创 2020-06-14 16:26:52 · 2244 阅读 · 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 · 883 阅读 · 3 评论 -
Java贪心算法之广播台集合覆盖问题、思路分析、代码实现
文章目录贪心算法案例:广播台集合覆盖问题. 思路分析. 代码实现 贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 案例:广播台集合覆盖问题 如何选择最少的广播台,让所有地区都可以收到信号? . 思路分析 用一个arealist集合原创 2020-06-14 16:17:22 · 761 阅读 · 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 · 231 阅读 · 0 评论 -
Java动态规划算法之01背包问题、思路分析、代码实现
文章目录动态规划算法案例:01背包问题. 思路分析. 代码实现 动态规划算法 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够原创 2020-06-14 16:12:20 · 2724 阅读 · 0 评论 -
java分治算法之汉诺塔、思路分析、代码实现
分治算法之汉诺塔 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题可用二分法完成。 1、原问题可以分解为多个子问题 这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似。 2、原问题在分解过程中,递归地求解子问题 由于递归都必须有一个终止条件,因此,当分解后的子问题规模足够小时,应能够直接求解。 3、在求解并得到各个子问题的解后 应能够采用某种方式、方原创 2020-06-14 16:10:00 · 277 阅读 · 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 · 217 阅读 · 0 评论 -
Java排序算法03:归并排序法、基数排序法、推排序法、思路分析、代码实现
文章目录5、归并排序法6、基数排序法7、堆排序法 (不稳定) 5、归并排序法 归并排序是利用归并的思想实现的排序方法。如上图。思路比较简单,就是对数组进行不断的分割,分割到只剩一个元素,然后,再两两合并起来。 归并排序的时间复杂度是比较低的。 归并与快速排序法的平均时间复杂度一致,但是比快速排序法稳定。 示意图: 这里展示将4578和1236合并在一起进行排序的过程: public class MergeSorting { public static void main(String[] a原创 2020-06-14 15:57:47 · 277 阅读 · 0 评论 -
Java排序算法02:希尔排序法、快速排序法、思路分析、代码实现
文章目录4、希尔排序法 (不稳定)5、快速排序法 (不稳定) 4、希尔排序法 (不稳定) 希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 public class ShellSorting原创 2020-06-14 15:52:35 · 181 阅读 · 0 评论 -
Java排序算法01:冒泡排序、选择排序、插入排序、思路分析、代码实现
文章目录排序算法. 排序算法时间复杂度1、冒泡排序法2、选择排序法 (不稳定)3、插入排序法 排序算法 排序是笔试最容易出现的题。 排序依照指定的规则进行排列的过程。 排序分为: 内部排序:在内存中进行排序 外部排序:由于数据过大,无法将所有数据放到内存中进行排序,需要借助外部存储进行排序 . 排序算法时间复杂度 1、冒泡排序法 交换排序法其中的一种 时间复杂度O(n2),需要排序的数量越大,排序时间越久。 public class BubbleSorting { public st原创 2020-06-14 15:48:00 · 140 阅读 · 0 评论 -
Java数据结构与算法:图、图的概念、深度优先搜索DFS、广度优先搜索BFS、思路分析、代码实现
文章目录图一、图概念1、图的名词解释2、图的表示方法3、代码实现二、深度优先搜索 DFS (算法). 思路分析.代码实现三、广度优先搜索 BFS (算法). 思路分析. 代码实现 图 图是一种数据结构,其中节点可以具有零个或多个相邻元素。两个节点之间的连接称为边。节点也可称为顶点。 表示多对多的关系时,就会用到图。 一、图概念 1、图的名词解释 2、图的表示方法 3、代码实现 创建以下无向图: public class GraphDemo { public static void原创 2020-06-14 15:37:18 · 242 阅读 · 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 · 305 阅读 · 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 · 367 阅读 · 0 评论 -
Java数据结构与算法:二叉排序树BST、二叉排序树添加删除、代码实现
文章目录二叉排序树 BST1、二叉排序树 添加1)思路分析2)代码实现2、二叉排序树 删除1)思路分析2)代码实现 二叉排序树 BST 二叉排序树:BTS(Binary Sort Tree),对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子节点或右子节点。 二叉排序树的中序遍历,结果就是从小到大的排列。 二叉排序树的特点: 左子树所有的值一定比根节点小,右子树所有的值一定比根节点大 1、二叉排序树 添加 1)思原创 2020-06-14 15:25:49 · 1066 阅读 · 0 评论 -
JAVA数据结构与算法:哈夫曼树的创建、哈夫曼编码、思路分析、代码实现
文章目录哈夫曼树. 创建哈夫曼树哈夫曼编码. 思路分析. 代码实现 哈夫曼树 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。 带权路径总和最小的就是哈夫曼树。即 WPL=叶子节点权*路径+…+叶子节点权*路径 中间的树就是哈夫曼树。 . 创建哈夫曼树 思路分析: 将数列从小到大排序,此时每个数据就是一个节点 取出前两个节点,作为子节点,计算出父节点的权值(就是两个原创 2020-06-10 20:20:44 · 3094 阅读 · 0 评论 -
JAVA数据结构与算法:二叉树、满二叉树、完全二叉树、前中后序遍历、顺序存储二叉树、线索化二叉树、代码实现
文章目录二叉树1、概念1)二叉树2)满二叉树、完全二叉树3)前序遍历、中序遍历、后序遍历2、前中后序遍历代码实现3、顺序存储二叉树代码实现3、线索化二叉树 为什么要引入树? 数组存储方式:由于数组访问元素速度快,开可以使用二分查找提高速度,但是在按一定顺序插入新元素时,当数组满了再插入新元素时,效率低速度慢。 链式存储方式:链式存储插入很方便,删除效率也高。但是在检索时,效率也比较低,每次都需要从头遍历到尾。 树结构存储方式:能提高数据存储,读取效率。既可以保证检索速度,也可以保证数据的插入、删除、修改的原创 2020-06-10 20:15:35 · 268 阅读 · 0 评论 -
JAVA数据结构与算法:哈希表、思路分析、代码实现
哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 1、关于哈希表的题 有一个公司,当有新的员工来报道时,要求将该员工信息加入(id,姓名,年龄),当输入该员工的id时,要求找到该员工的所有信息。 要求:不使用数据库,速度越快越好。 . 思路分析 有3个类: EmpHashTable类:根据id散列每个存入的值;创建原创 2020-06-10 20:05:41 · 159 阅读 · 0 评论 -
Java 数据结构与算法:递归实现八皇后问题、思路分析、代码实现
八皇后 回溯算法 在8*8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,有多少种摆法? 八皇后游戏连接 . 思路分析 第一个皇后先放在第一行,第一列 第二个皇后放第二行,第一列,然后判断同列是否有皇后,有则放到第二行的第二列,判断是否在同一列,不是再判断是否在同一斜线,如果在同一斜线,就继续放在第二行的第三列,依次类推 每放依次就判断一次,都不行,就回退到上一行,继续放下一列再判断 原则上八皇后可以是8*8的二维数组表示,但是也可以以一维数组.原创 2020-06-02 12:22:20 · 238 阅读 · 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 · 750 阅读 · 1 评论 -
Java数据结构与算法:后缀表达式(逆波兰表达式)、中缀表达式转后缀表达式、思路分析、代码实现
文章目录一、后缀表达式 (逆波兰表达式). 思路分析. 代码实现 逆波兰计算器二、表达式转换. 中缀转后缀表达式. 思路分析. 代码实现 一、后缀表达式 (逆波兰表达式) 后缀表达式又称逆波兰表达式。运算符位于操作数之前。 比如:(3+2)*6-5 对应后缀表达式就是:3 2 + 6 * 5 - 在实际开发中,常常是将中缀表达式转为后缀表达式,因为后缀表达式相对于其他表达式来说对计算机较为友好。 . 思路分析 计算机从左至右扫描表达式,遇到数字直接入栈,遇到运算符,弹出栈顶和次顶的两个数进行运算,最后将原创 2020-05-31 18:19:31 · 559 阅读 · 0 评论 -
Java数据结构与算法:栈数据结构与前缀表达式、中缀表达式(思路分析、代码实现)
文章目录栈实现综合计算器运算1、前缀表达式 (波兰表达式). 思路分析2、中缀表达式. 思路分析. 代码实现 栈实现综合计算器运算 1、前缀表达式 (波兰表达式) 前缀表达式又称波兰表达式。运算符位于操作数之前。 比如:(3+2)*6-5 对应前缀表达式就是:- * + 3 2 6 5 . 思路分析 计算机从右至左扫描前缀表达式,依次将数字入栈。当遇到运算符,弹出栈顶和次顶两个数进行运算,运算结果再次入栈,遇到下一个运算符,又弹出栈顶和次顶两个数进行运算,运算结果再次入栈,依次类推…最终得到运算结果。原创 2020-05-31 18:16:02 · 362 阅读 · 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 · 238 阅读 · 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 · 282 阅读 · 0 评论 -
Java数据结构与算法:双向链表、增删改查、思路分析、代码实现
文章目录双向链表1、双链表的 增 删 改 查 思路分析2、代码实现 双向链表 双链表示意图: 链表是以节点的方式存储,链式存储 每个节点包含pre域(用于存储上一个节点对象)、data域(用于存储该节点中的数据) 和 next域(用于存储下一个节点对象) 各个节点不一定连续存储 链表分带头节点和不带头节点两种,根据实际需求来确定 1、双链表的 增 删 改 查 思路分析 头节点不存任何数据,只用作链表的头,方便对链表操作等。 增加插入新节点 如果直接从双向链表的尾节点添加新的节点new原创 2020-05-30 20:23:15 · 374 阅读 · 0 评论 -
Java数据结构与算法:单向链表、增删改查、求单链表有效节点个数、查找单链表倒数第k个节点、单链表反转、从尾到头打印单链表、合并两个有序链表后依然有序
文章目录单向链表1、单链表的 增 删 改 查 思路分析2、代码实现3、练习题# 1求单链表中有效节点个数# 2查找单链表中倒数第k个节点# 3单链表的反转# 4从尾到头打印链表# 5合并两个有序链表,合并之后链表依然有序,并返回合并后的链表4、对辅助节点的理解5、单链表的缺点 单向链表 单链表示意图: 链表是以节点的方式存储,链式存储 每个节点包含data域(用于存储该节点中的数据) 和 next域(用于存储下一个节点对象) 各个节点不一定连续存储 链表分带头节点和不带头节点两种,根据实际需求来确定原创 2020-05-30 20:18:49 · 592 阅读 · 0 评论 -
Java数据结构与算法:数组模拟队列、环形队列、思路分析
文章目录队列1、数组模拟队列思路分析代码实现存在的问题2、数组模拟环形队列思路分析代码实现 队列 队列可以用数组和链表来实现。遵循FIFO (先进先出) 1、数组模拟队列 该数组模拟队列不是环形的,该列子用于理解队列的工作过程。 思路分析 数组模拟队列示意图 rear表示尾部(指向尾元素),front表示头部(头元素的前一个位置)。 从图中可看出,当数组队列中没有任何元素时,rear和front都是指向-1的位置;当有元素加入到队列中,rear就依次增加指向,front没有动;当有元素移除队列时原创 2020-05-29 21:16:09 · 235 阅读 · 0 评论 -
Java数据结构与算法:稀疏数组、五子棋案例、思路分析、代码实现
文章目录稀疏数组1、思路分析2、代码实现 稀疏数组 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。 1、思路分析 实际运用:五子棋 蓝色棋子以2表示;黑色棋子以1表示。可将其转换成二维数组: 由于0占位太多,也没有具体的意义,可对该数组进行压缩。 压缩后的数组,第一行存储的是原数组有几行几列有几个有效值。从索引为1开始,记录每个元素在原数组的索引位置,以及值。 2、代码实现 代码演示: import java.io.*; import原创 2020-05-29 21:11:40 · 472 阅读 · 0 评论
分享