
Java数据结构与算法
海绵虎宝爱Smile
这个作者很懒,什么都没留下…
展开
-
背包问题(填表法 动态规划 代码分析)
要求达到的目标为装入的背包的总价值最大,并且重量不超出。解决类似的问题可以分解成一个个的小问题进行解决,假设存在背包容量大小分为1,2,3,4的各种容量的背包(分配容量的规则为最小重量的整数倍):package dynamic; /** * i是行,即表中的第几个物品 * j是列,即表中的各种容量的背包 * */public class...原创 2020-11-11 09:54:07 · 364 阅读 · 0 评论 -
kmp算法(思路分析+个人理解)
举例来说,有一个字符串 Str1 = “BBC ABCDAB ABCDABCDABDE”,判断,里面是否包含另一个字符串 Str2 = “ABCDABD”?1.首先,用Str1的第一个字符和Str2的第一个字符去比较,不符合,关键词向后移动一位5.遇到Str1有一个字符与Str2对应的字符不符合。6.这时候,想到的是继续遍历Str1的下一个字符,重复第1步。(其实是很不明智的,因为此时BCD已经...原创 2020-11-10 09:31:28 · 316 阅读 · 0 评论 -
马踏棋盘(骑士周游问题 思路分析及疑问分析)
所谓“马踏棋盘”问题,就是指在中国象棋的棋盘上,用马的走法走遍整个棋盘,在8*8的方格中,每个格都要遍历,且只能遍历一次。思路分析每一个马都有八个下一步的选择,我们在满足要求的点中任意找一个进行遍历,当八个点都不满足要求时,就回溯上一步,找其他点进行遍历。解决方法:我们从图中可以看到,一个位置的马可以有八个不同方向的下一步。如何表示下一步呢?设当前马的坐标为(x,y),则下一步为(x-2,y+1)、(x-1,y+2)、(x+1,y+2)、(x+2,y+1)、(x+2,y...原创 2020-11-06 11:15:18 · 1137 阅读 · 0 评论 -
弗洛伊德算法(floyd 代码分析)
代码思路的分析package floyd;import java.util.Arrays;public class FloydAlgorithm { public static void main(String[] args) { // 测试看看图是否创建成功 char[] vertex = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' }; //创建邻接矩阵 int[][] ma...原创 2020-11-04 21:28:49 · 472 阅读 · 0 评论 -
狄杰斯卡尔(Dijkstra 最短路径 代码分析)
package dijkstra;import java.util.Arrays; /** * 代码思路: * 调用从顶点G开始 , graph.dsj(6); * 创建初始化 * */public class DijkstraAlgorithm { public static void main(String[] args) { char[] vertex = {'A'.原创 2020-11-04 09:35:38 · 550 阅读 · 0 评论 -
Prim(最小生成树算法 思路分析)
package prim;import java.util.Arrays; /** * 代码思路: * 1.创建图结构 MGraph graph = new MGraph(vertexes); * 2.创建最小生成树对象 MinTree minTree = new MinTree(); * 3.最小生成树对象调用createGraph,填充图的相...原创 2020-11-03 09:46:00 · 501 阅读 · 0 评论 -
Kruskal(最小生成树算法 思路分析)
package kruskal;import java.util.Arrays; /** *首先构造一个只含n个顶点的森林, * 然后依权值从小到大从连通网中选择边加入到森林中,并使森林中不产生回路,直至森林变成一棵树为止 * * 本文代码思路: * 1初始化图,即将相关节点加入到 顶点数组 邻接数组,并计算有多少个边 public KruskalCase(char[] vertexes,in...原创 2020-11-03 09:12:06 · 214 阅读 · 0 评论 -
二叉排序树(思路分析+疑惑解析)
package binarysorttree; /** *二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点, * 要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。 * 特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点(当前代码是把相同的值放入到右子结点) * * 二叉排序树的删除 * 第一种情.原创 2020-10-28 09:51:02 · 230 阅读 · 0 评论 -
哈夫曼树编码(最优二叉树 文本 文件的压缩与解压)
统计字符(其实这里是ASCII码的形式统计字符出现的权值(字符出现的字数)统计字符出现的权值(字符出现的字数)统计字符出现的权值(字符出现的字数)统计字符出现的权值(字符出现的字数))出现的字数/** * * @param bytes 接收字节数组 * @return 返回的就是 List 形式 [Node[date=97 ,weight = 5], Node[]date=32,weight = 9]......], */ private static List<Nod.原创 2020-10-23 21:40:26 · 774 阅读 · 3 评论 -
线索化二叉树以及遍历(根据图片分析 注意递归)
package tree.threadedbinarytree; /** *思路 * 看图 * */public class ThreadedBinaryTreeDemo{ public static void main(String[] args) { HeroNode root = new HeroNode(1, "tom"); HeroNode node2 = new HeroNode(3, "jack"); ...原创 2020-10-21 18:04:47 · 196 阅读 · 0 评论 -
顺序存储二叉树(使用数组存储二叉树,并且前中后遍历)
顺序存储二叉树的特点:顺序二叉树通常只考虑完全二叉树第n个元素的左子节点为 2 * n + 1 第n个元素的右子节点为 2 * n + 2第n个元素的父节点为 (n-1) / 2n : 表示二叉树中的第几个元素(按0开始编号 与数组下标保持一致)package tree;import java.util.Arrays; /** * 预备知识 * (1) * 1) 顺序...原创 2020-10-20 20:51:21 · 1112 阅读 · 0 评论 -
散列表查找(哈希表)的简单实现(员工信息管理)
package search.hashTable;import java.util.Scanner; /** * 哈希表的简单实现 员工信息管理 * * (1)注意:创建HashTab即数组时,不要只创建数组empLinkedListArray = new EmpLinkedList[size]; * empLinkedListArray数组中存放的是每条链表的头结点,如果忘记初始化在接下来的add中会出现空指针异常 * empLink.原创 2020-10-19 21:48:26 · 681 阅读 · 0 评论 -
散列表查找(哈希表)
通过查找关键字不需要比较就可获得需要的记录的存储位置。 这就是一种新的存储技术——散列技术。(把记录散布在每个数组上)散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f, 使得每个关键字key对应一个存储位置f(key) 。 查找时, 根据这个确定的对应关系找到给定值key的映射f(key) ,若查找集合中存在这个记录, 则必定在f(key) 的位置上。这里我们把这种对应关系f称为散列函数, 又称为哈希(Hash) 函数。按这个思想, 采用散列...原创 2020-10-19 20:39:00 · 738 阅读 · 0 评论 -
散列表的引入
有些数据不必每次都去数据库取数据,且每次查数据库,速度较慢,且数据库压力较大一般在数据库前加缓存层,比如redis,常用的数据放到缓存层中可以有多级缓存,多级缓存层自己写缓存层,使用哈希表,把数据加载到内存,把数据放到哈希表中数组+链表数组+二叉树散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函...原创 2020-10-19 20:37:56 · 103 阅读 · 0 评论 -
斐波那契查找(二分法的改进,mid借助斐波那契数列计算)
package search;import java.util.Arrays; /** *为什么需要使用斐波那契数列? * 斐波那契数列指的是这样一个数列: *0,1,1,2,3,5,8,13,21,34,55(数组F) * 这个数列从第3项开始,每一项都等于前两项之和。 *比如temp = {1,8, 10, 89, 1000, 1234, 0, 0} =>...原创 2020-10-17 21:18:32 · 358 阅读 · 0 评论 -
插值查找(思路分析)
上面的1/2代表区间长度每次缩减一半,也就是控制区间缩减幅度的因子。二分查找并没有考虑数据中数值的情况,仅仅使用了数值是有序的这一信息插值查找(interpolation search)实际上是二分查找的改良版。现在,来看下述的数值有序且分布均匀数据:data = [1, 2, 3, 5, 6, 7, 10, 13, 14,, 17, 19 22, 23, 25, 27]为什么使用插值查找?如果搜索的目标是2,那么区间长度每次都缩减为一半合理吗?显然是...原创 2020-10-17 20:27:53 · 283 阅读 · 0 评论 -
二分搜索(返回单个下标及返回多个下标)(思路分析+疑惑解析)
思路及疑惑解析package search;import java.util.ArrayList;import java.util.List; /** *课后思考题: int arr[] = {1, 3, 5, 7, 9,9,9}; 当一个有序数组中, *有多个相同的数值时,如何将所有的数值都查找到,比如这里的 9 * * * 思路分析 * 前提 二叉搜素之前数组是排序好的,即多个相同数据的下标是连续..原创 2020-10-17 20:01:49 · 275 阅读 · 0 评论 -
基数排序(思路分析+疑惑解析)
本人看的韩顺平老师的数据结构与算法的视频,做的总结和笔记基本介绍思想及排序的过程基数排序需要注意的地方疑惑解析package sort;import java.util.Arrays; /** * 基数排序的思路: * (1) 将每个元素的个,十,百等位数取出,然后看这个数应该放在哪个对应的桶(一个一维数组),并根据其放入到相应的数组下标中 ...原创 2020-10-15 11:43:08 · 256 阅读 · 0 评论 -
希尔排序(选择排序的优化 思路分析+疑惑解析)
思路package sort;import java.util.Arrays; /** * 插入排序的缺点:当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响 * 希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。 * * 希尔排序法基本思想: * 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序; * 随着增量逐渐减少,每组包含的...原创 2020-10-14 09:57:37 · 257 阅读 · 0 评论 -
迷宫问题(递归的应用)
package recursion;public class MiGong { static int count = 0; public static void main(String[] args) { // 先创建一个二维数组,模拟迷宫 // 地图 int[][] map = new int[8][7]; // 使用1 表示墙 // 上下全部置为1 for(int i = 0 ;i &l.原创 2020-10-13 21:59:27 · 171 阅读 · 0 评论 -
插入排序(思路分析+疑惑解析)
思路及疑惑后的思考解答package sort;import java.util.Arrays; /** * 插入排序(Insertion Sorting)的基本思想是: * 把n个待排序的元素看成为一个有序表和一个无序表 * 开始时有序表中只包含一个元素,无序表中包含有n-1个元素 * 排序过程中每次从无序表中取出第一个元素 * 把它的排序码依次与有序表...原创 2020-10-13 21:56:49 · 281 阅读 · 0 评论 -
冒泡排序(思路+疑惑解析)
过程分析思路及疑惑后的思考解答代码package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Date; /** * 思路: * 相邻的两个元素比较,如果不符合要求,就交换顺序 * 总结: * 1一共进行 数组的大小-1 次 大的循环 ...原创 2020-10-13 20:50:29 · 163 阅读 · 0 评论 -
快速排序(思路分析+疑惑解析)
它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此对快速排序作了进一步的说明:挖坑填数+分治法:以一个数组作为示例,取区间第一个数为基准数。 0 ...原创 2020-10-13 15:24:31 · 219 阅读 · 0 评论 -
归并排序(思路分析+疑惑解析)
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。合并的时候思路package sort;import java.text.SimpleDateFormat;import java.util.Arrays;import java....原创 2020-10-13 10:27:03 · 272 阅读 · 0 评论 -
中缀表达式转后缀表达式(含计算)
中缀表达式转后缀表达式思路分析计算思路分析运算符优先级的解释package stack;import java.util.ArrayList;import java.util.List;import java.util.Stack;public class PolandNotationTest { public static void main(String[] args) { //完成将一个中缀表达式转成后缀表达式的功能 //说明.原创 2020-10-06 11:52:07 · 132 阅读 · 0 评论 -
栈的应用计算器(实现多位数字的运算)
package stack;/*使用栈完成表达式的计算 思路 1. 通过一个 index 值(索引),来遍历我们的表达式 2. 如果我们发现是一个数字, 就直接入数栈 3. 如果发现扫描到是一个符号, 就分如下情况 3.1 如果发现当前的符号栈为 空,就直接入栈 3.2 如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符, 就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,原创 2020-09-30 21:30:10 · 617 阅读 · 2 评论 -
双向链表(更新了按照顺序插入结点)
```javapackage linkedlist;public class DoubleLinkedListDemo { public static void main(String[] args) { System.out.println("双向链表的测试"); // 先创建节点 HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨"); HeroNode2 hero2 = new Her原创 2020-09-30 16:16:50 · 1055 阅读 · 0 评论 -
约瑟夫环(环形单向链表)
package linkedlist;public class Josepfu { public static void main(String[] args) { CircleSingleLinkedList circleSingleLinkedList = new CircleSingleLinkedList(); circleSingleLinkedList.add(5); circleSingleLinkedList.showBoy();原创 2020-09-30 09:48:48 · 185 阅读 · 0 评论 -
双向链表
package linkedlist;public class DoubleLinkedListDemo { public static void main(String[] args) { System.out.println("双向链表的测试"); // 先创建节点 HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨"); HeroNode2 hero2 = new HeroNode2(2原创 2020-09-30 09:46:49 · 80 阅读 · 0 评论 -
单链表的操作
package linkedlist;import java.util.Stack;public class SingleLinkedListDemo { public static void main(String[] args) { HeroNode hero1 = new HeroNode(1, "宋江", "及时雨"); HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟"); HeroNode h原创 2020-09-26 11:47:05 · 76 阅读 · 0 评论 -
循环队列
import java.util.Scanner;public class CircleArrayQueueDemo { public static void main(String[] args) { CircleArrayQueue queue = new CircleArrayQueue(4); char key = ' ';//接受用户的输入 Scanner scanner = new Scanner(System.in);原创 2020-09-24 11:57:04 · 118 阅读 · 0 评论 -
稀疏数组(写入文件并读取)
import java.io.*;import java.util.ArrayList;import java.util.List;public class SparseArray { public static void main(String[] args) throws IOException { // 创建一个原始的二维数组 11 * 11 int[][] chessArr1 = new int[11][11]; // 0: 表示没有棋原创 2020-09-23 21:23:49 · 407 阅读 · 0 评论