- 博客(62)
- 资源 (2)
- 收藏
- 关注
原创 Maven 的打包方式
一、前言刚开始实习不到一个月的时候,从师兄手中接手了团队的项目,当时第一次听到了 “大包”、“小包” 的概念,只见师兄一顿操作,使用 Maven 将项目进行了打包。当时不太理解,只是记得两点:如果想让项目作为一个依赖提供给他人使用,则将项目打为 “小包”;如果希望项目打出来 Jar 包可以作为一个独立服务运行,则将项目打为 “大包”。也就是说,可以将项目打包为两类:一类是作为依赖提供给他人使用,一类是作为独立服务使用。下面将从这两类来讲解使用 Maven 将项目打包的方式。二、将项目打为小包
2021-08-24 00:33:01
22286
原创 SpringBoot+Thymeleaf项目控制台报错 org.thymeleaf.exceptions.TemplateInputException An error happened during
一、问题描述在我写一个社区项目的过程中,运行 SpringBoot 后访问 index.html 页面,浏览器页面出现 500 错误,且 IDEA 控制台出现了如下错误信息:2021-05-03 20:31:40.083 ERROR 9080 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "/i
2021-05-07 17:34:49
6908
3
原创 HashMap 源码阅读(JDK1.8)
文章目录一、HashMap 简单介绍二、HashMap 方法源码阅读2.1 HashMap() 方法2.2 put() 方法2.3 get() 方法2.4 remove() 方法三、总结一、HashMap 简单介绍HashMap 是 Java 中一个比较重要的集合类,从名字就可以看出来,它实现了 Map 接口。也就是说,HashMap 存储的是键值对(key-value)数据,其中 key 是无序的,不可以重复的,value 是无序的,可以重复的。HashMap 的底层数据结构可以理解为一个哈希表,关
2021-04-14 15:45:01
295
原创 ArrayList 源码阅读(从 JDK1.8 源码角度理解扩容机制)
文章目录一、ArrayList 简单介绍二、ArrayList 方法源码阅读2.1 ArrayList() 方法2.2 add() 方法2.3 get() 方法2.3 set() 方法2.3 remove() 方法三、总结一、ArrayList 简单介绍我们都知道:ArrayList 是一个有序的、元素可重复的集合。那么 ArrayList 的底层到底是通过什么来存储元素的呢 ?通过查看 ArrayList 的源码,我们可以看到在 ArrayList 的定义中有这样一个成员变量 —— elementD
2021-04-03 15:42:20
216
原创 马踏棋盘算法(骑士周游问题)
一、问题概述马踏棋盘算法也被称为骑士周游问题。问题内容是:将马随机放在国际象棋的 8× 8 棋盘的某个方格中, 马按走棋规则(马走日字)进行移动。要求每个方格只能走一次, 走遍棋盘上全部 64 个方格,求可行的路径。二、思路分析马踏棋盘问题实际上是图的深度优先搜索(DFS)的应用。该问题的解决思想为:假设以 V 为起点,首先找出在指定规则下 V 点下一步可能的落点。在下一步的可能的落点中选择一个点(假设是 U 点),然后走到 U 点。再以 U 点为起点,找出指定规则下 U 点下一步可能的
2021-02-08 09:12:41
5214
原创 图解弗洛伊德算法(每一对顶点之间的最短路径问题)
一、弗洛伊德算法概述在上一篇博客 图解迪杰斯特拉算法(最短路径问题) 中介绍了迪杰斯特拉算法,该算法用于求解单源最短路径问题。所谓单源最短路径路径就是从某一个顶点出发,求解其到各个顶点的最短路径。那么如果想要求解每一对顶点之间的最短路径,该怎么做呢?其实可以对迪杰斯特拉进行简单的改造,就可以实现上述目的。既然迪杰斯特拉是用于计算单个源点到各个顶点之间的最短路径,那么只需要对每个顶点都执行一次迪杰斯特拉算法,便可以得到每一对顶点之间的最短路径。迪杰斯特拉的时间复杂度是 O(n²),如果对每个顶点都执行一
2021-02-07 10:53:15
14728
7
原创 图解迪杰斯特拉算法(最短路径问题)
一、单源最短路径问题如上图给定一个带权图 G = <V,E>,其中每条边(vi,vj)上的权 W[vi,vj] 是一个非负实数。另外,给定 V 中的一个顶点 s 充当源点。现在要计算从源点 s 到所有其他各顶点的最短路径,这个问题通常称为单源最短路径(single-source shortest paths)问题。用一句话总结来说,单源最短路径就是:从图的某一点(源点)出发,到达其余各顶点(终点)的最短路径。解决单源最短路径问题的一个常用算法是迪杰斯特拉算法,它是由 E.W.Dijkst
2021-02-06 11:41:45
50172
7
原创 最小生成树(图解普里姆算法、图解克鲁斯卡尔算法)
文章目录一、最小生成树概述1.1 背景概述1.2 最小生成树的定义1.3 最小生成树构造算法二、普里姆算法2.1 普利姆算法介绍2.2 普利姆算法代码实现三、克鲁斯卡尔算法3.1 克鲁斯卡尔算法介绍3.2 克鲁斯卡尔算法代码实现一、最小生成树概述1.1 背景概述问题描述:假设要在 n 个城市之间建立通讯联络网,则连通 n 个城市只需要修建 n-1 条线路,每条城市之间的线路修建成本是不完全相同的,如何在最节省经费的前提下建立这个通讯网?问题分析:n 个城市间,最多可设置 n(n-1)/2 条线路
2021-02-04 21:00:41
7505
原创 贪心算法(集合覆盖问题)
一、贪心算法概述贪心算法的核心思想可以总结为:贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,希望贪心算法得到的最终结果也是整体最优的。虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解,如单源最短路经问题,最小生成树问题等。虽然在一些情况下,即使贪心算法不能得到整体最优解,但其最终结果却是最优解的很好近似。二、集合覆盖问题2.1 问题描述假设你办了个广播节目,要让国内的 8 个重要城市的听
2021-02-01 18:53:40
5264
原创 动态规划算法解决背包问题
一、动态规划算法概述动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从子问题解得到原问题解。但是经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解极值问题时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。动态规划 VS 分治法:相同点:基本思想均是将原问题分解成若干个子问题,先求子问题,然后从子问题的解得到原问题的解
2021-01-30 15:06:42
3380
原创 分治算法解决汉诺塔问题
一、汉诺塔问题概述汉诺塔问题是一个古老而又有趣的问题。这个问题的具体内容是:将所有盘子从最左边的塔 A 都移动到最右边的塔 C 上。每次只能移动一个盘子,大的盘子不能压在小的盘子上。二、思路分析我们先分别来看看只有一个、两个、三个盘子的情况下,移动过程是怎样的。一个盘子如上图所示,一个盘子的移动过程为:A→CA→CA→C两个盘子如上图所示,两个盘子的移动过程为: A→BA→CB→CA→B\\A→C\\B→CA→BA→CB→C三个盘子如上所示,三个
2021-01-29 09:28:03
343
原创 图(深度优先遍历、广度优先遍历)
文章目录一、图的概述1.1 什么是图1.2 图对比线性表和树1.3 图的常见概念二、图的存储方式2.1 邻接矩阵2.2 邻接表三、图的遍历3.1 图的深度优先遍历3.1.1 什么是深度优先遍历3.1.2 深度优先遍历的步骤3.1.3 深度优先遍历代码实现3.2 图的广度优先遍历3.2.1 什么是广度优先遍历3.2.2 广度优先遍历的步骤3.2.3 广度优先遍历代码实现一、图的概述1.1 什么是图图(graph)是一种数据结构,它是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E)。
2021-01-27 13:16:00
6106
原创 平衡二叉树(AVL树)
一、平衡二叉树概述1.1 什么是平衡二叉树平衡二叉树也叫 AVL 树。平衡二叉树是具有以下特点的二叉查找树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1, 并且左右两个子树都是一棵平衡二叉树。 图一 平衡二叉树 图二 非平衡二叉树 1.2 为什么要有平衡二叉树在上一篇文章 二叉排序树 中对二叉排序树做了介
2021-01-24 22:19:15
7361
4
原创 二叉排序树(二叉搜索树)
一、二叉排序树概述二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大(如果有相同的值,则该节点放在左子节点或右子节点都可)。在一般情况下,二叉排序树的查询效率比链表结构要高。如下图所示就是一个二叉排序树:二、二叉排序树的基本操作2.1 创建和遍历二叉排序树【案例描述】给定如下数组:arr = {7, 3, 10, 12,
2021-01-23 14:43:29
1223
原创 哈夫曼树
一、哈夫曼树概述1.1 什么是哈夫曼树给定 n 个权值作为 n 个叶子节点,构造一棵二叉树,若该树的带权路径长度(Weighted Path Length of Tree)达到最小, 称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的节点离根较近。1.2 哈夫曼树重要概念路径和路径长度:在一棵树中,从一个节点往下可以到达孩子或孙子节点的通路,称为路径。通路中分支的数目称为路径长度。若规定根节点的层数为 1,则从根节点到第 L
2021-01-23 14:33:38
2968
原创 堆排序
文章目录一、堆排序概述1.1 什么是堆1.2 什么是堆排序1.3 堆排序的思想二、堆排序的步骤分析三、堆排序的代码实现一、堆排序概述1.1 什么是堆堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做为一棵树的数组对象。堆总是满足以下性质:堆中的父节点的值总是小于(或者大于)它的子节点的值;堆是一颗完全的二叉树。根据父节点与子节点的大小关系,堆又可以分为最大堆和最小堆。其中最大堆的父节点的值总是大于它的子节点的值;最小堆的父节点的值总是小于它的子节点的值。
2021-01-21 13:22:01
774
2
原创 线索化二叉树
一、线索二叉树概述在二叉树的节点上加上线索的二叉树称为线索二叉树。对二叉树以某种遍历方式(如先序、中序、后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化。通过考察各种二叉链表,不管二叉树的形态如何,空链域的个数总是多过非空链域的个数。准确的说,n 个节点的二叉链表共有 2n 个链域,其中非空链域为 n-1 个,但空链域却有 n+1 个。如下图所示,二叉树有 6 个节点,其中非空链域的个数为 7 个。利用这些空链域存放在某种遍历次序下该结点的前驱结点和后继结点的指针,这些指针
2021-01-21 13:11:11
1560
原创 顺序存储二叉树
一、顺序存储二叉树概述从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。顺序结构存储就是使用数组来储存,一般使用数组只适合表示完全二叉树,因为不完全二叉树会有空间的浪费。下图就是树和数组对应的关系图:顺序二叉树有下面几个显著的特征(n 表示二叉树中的第几个元素,从 0 开始):第 n 个元素的左子节点为第 2 * n + 1 个元素;第 n 个元素的右子节点为第 2 * n + 2 个元素;第 n 个元素的父节点为第 ( n - 1 ) /
2021-01-19 18:25:15
2184
原创 简单二叉树
文章目录一、二叉树概述1.1 为什么要有树这种数据结构1.2 树的常用术语1.3 什么是二叉树1.4 二叉树的遍历顺序二、二叉树的基本操作2.1 二叉树的节点遍历2.2 二叉树的节点查找2.3 二叉树的节点删除一、二叉树概述1.1 为什么要有树这种数据结构在前面已经学习了数组和链表这两种数据结构,这两种数据结构都有着鲜明的特点。数组存储方式的优缺点如下:优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动
2021-01-19 18:18:28
310
原创 哈希表
一、哈希表概述散列表(Hash table, 也叫哈希表),是根据关键码 - 值(Key - value)而直接进行访问的数据结构。 也就是说, 它通过把关键码 - 值映射到表中一个位置来访问记录, 以加快查找的速度。这个映射的函数叫做散列函数,存放记录的数组叫做散列表。其实把哈希表看做是字典来理解哈希表就很容易明白了,我们通过关键码即可快速定位关键值。显而易见哈希表有一个很大的优点就是查找数据的速度快。如下所示就是一个典型的哈希表:哈希表是数组和链表的结合体,上图的哈希表左边是一个数组,右边
2021-01-17 12:39:33
3338
1
原创 简单查找算法(线性、二分、插值)
文章目录一、查找算法介绍二、顺序查找2.1 什么是顺序查找2.2 顺序查找的代码实现三、二分查找3.1 什么是二分查找3.2 二分查找的基本步骤3.3 二分查找的代码实现四、插值查找4.1 什么是插值查找4.2 插值查找与二分查找的区别4.2 插值查找的基本步骤4.3 插值查找的代码实现一、查找算法介绍在 java 中,我们常用的查找算法有以下四种:顺序(线性)查找二分(折半)查找插值查找斐波那契查找本文将分别介绍顺序查找、二分查找、插值查找;如要访问斐波那契查找算法的文章请点击链接:斐波
2021-01-15 10:31:56
505
原创 斐波那契(黄金分割法)查找算法
文章目录一、斐波那契查找算法概述1.1 什么是斐波那契查找算法1.2 什么是斐波那契数列1.3 斐波那契查找算法的思想二、斐波那契查找的基本步骤三、斐波那契查找的代码实现一、斐波那契查找算法概述1.1 什么是斐波那契查找算法斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术。斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。斐波那契查找同样是查找算法家族中的一员,它要求数据是有序的(升序或降序)。斐波那契查找采用和二分查找/插值查找相似的
2021-01-15 10:28:48
9177
8
原创 基数排序算法
文章目录一、基数排序概述二、基数排序的步骤三、基数排序的代码实现一、基数排序概述基数排序(radix sort)属于 “分配式排序”(distribution sort),又称 “桶子法”(bucket sort)。基数排序的基本思想是:通过待排序元素的各个位的值,将待排序元素分配至某些 “桶” 中,达到排序的效果。基数排序是桶排序的扩展,基数排序法是效率高的稳定性排序法。二、基数排序的步骤基数排序过程一般遵循下面的基本步骤:首先确定待排序序列 arr 中最大的元素,得出元素的位数 N,位
2021-01-12 20:43:07
2458
1
原创 归并排序算法
文章目录一、归并排序介绍二、归并排序的思想2.1 归并排序的基本思想2.2 归并的基本步骤三、归并排序的代码实现一、归并排序介绍归并排序(merge sorting)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide and conquer)策略。分治策略将问题分解(divide)分解为一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案合并在一起,即分而治之。归并排序的时间复杂度为 O(nlogn)。二、归并排序的思想2.1 归并排序的基本思想归并
2021-01-12 10:17:42
3319
原创 快速排序算法
文章目录一、快速排序概述1.1 什么是快速排序1.2 快速排序过程解析二、快速排序的具体步骤三、快速排序的代码实现一、快速排序概述1.1 什么是快速排序快速排序(Quick Sort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对着两部分记录继续进行排序,以达到整个序列有序。1.2 快速排序过程解析假设待排序的序列为 arr[0]~arr[n-1],首先任意选取一个元素(通常选取第一个)为基准元
2021-01-11 13:37:49
58472
6
原创 栈实现逆波兰计算器(前缀、中缀、后缀表达式)
关键词:前缀表达式 中缀表达式 后缀表达式 波兰式 逆波兰式 栈 逆波兰计算器 前缀表达式到后缀表达式的转换 小数计算器 综合计算器
2021-01-02 11:26:30
697
3
原创 栈(数组模拟栈、实现简单计算器)
一、栈的概述1.1 什么是栈栈(stack)是一种基于先进后出(FILO-First In Last Out)策略的集合类型。栈是一种特殊的线性表,它限制元素的插入和删除只能在同一端进行。允许插入和删除元素的一端,为变化的一端,称为栈顶;另一端为固定的一端,称为栈底。根据栈的定义可以知道:最先放入的元素在栈底,最后放入的元素在栈顶;而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。下图形象地描述了元素出栈和入栈的过程: 图一:元素入栈过程
2020-12-31 18:13:00
524
5
原创 Linux 实现透明代理(使用开源项目 tproxy-example)
一、透明代理概述根据百度百科的资料:透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改变你的 request fields(报文),并会传送真实IP,多用于路由器的NAT转发中。透明代理技术中的透明是指客户端感觉不到代理的存在,不需要在浏览器中设置任何代理,客户只需要设置缺省网关,客户的访问外部网络的数据包被发送到缺省网关,而这时缺省网关运行着一个代理服务器,数据实际上被被重定向到代理服务器的代理端口(如8080),即由本地代理服务器向外请求所需数据然后拷贝给客户端。理论上透明代理可以对任何协
2020-12-28 22:01:52
6267
2
原创 单链表之约瑟夫问题
一、问题描述约瑟夫( Josephu ) 问题是一个非常著名的有趣的题目。问题具体描述如下:设编号分别为1、2、3… n 的 n 个人围坐一圈,约定编号为 k(1≤k≤n)的人从 1 开始报数,数到 m 的那个人出列。出列的人的下一位又从 1 开始报数,数到 m 的那个人继续出列。以此类推,直到所有人都出列为止,由此产生一个出队编号的序列,这个序列也就是约瑟夫问题的解。下面将用一个动图来描述一下这个问题:假设有 4 个人围坐一圈,约定编号为 1 的人开始报数,数到 3 的那个出列。最后产生的出队编号
2020-12-27 10:44:56
1465
2
原创 单链表及常见算法题
一、链表概述1.1 链表介绍链表( Linked List ),别名链式存储结构或单链表,是一种常见的基础数据结构,用于存储逻辑关系为 “一对一” 的数据。链表是线性表的一种,但是它并不像顺序表一样是连续存储在内存中的。链表的各个结点散布在各个内存区域,在每一个结点中都存放下一个结点的地址。单链表在内存中是如下存储的:其中:data 域存放的是本结点的数据,next 域存放的是下一个结点的地址。通过上面的图,我们可以得到链表的几个特性:链表是以结点的方式来存储的,是链式存储;每一
2020-12-23 17:29:12
2040
原创 Java8 新特性之集合的流式编程
文章目录一、集合流的概述1.1 集合的流式编程简介1.2 集合的流式编程的优点1.3 使用流式编程的步骤二、数据源的获取2.1 数据源简介2.2 数据源的获取三、最终操作3.1 最终操作简介3.2 collect3.3 reduce3.4 count3.5 forEach3.6 max & min3.7 Matching3.8 Find3.9 特殊的流四、中间操作4.1 中间操作简介4.2 filter4.3 distinct4.4 sorted4.5 limit & skip4.6 map
2020-12-15 11:11:02
603
原创 Java8 新特性之Lambda表达式
说来惭愧,很早就想写一篇 Lambda 表达式的博客了,算下来这篇博客应该拖了快一年了吧。文章目录一、Lambda 表达式介绍1.1 Lambda 表达式概念1.2 Lambda 表达式的使用场景1.3 Lambda 表达式对接口的要求1.4 函数式接口1.4.1 基础概念1.4.2 判别函数式接口二、 Lambda 表达式的语法2.1 Lambda 表达式的基础语法2.2 Lambda 表达式的语法进阶2.2.1 参数部分的精简2.2.1.1 参数类型的精简2.2.1.2 参数括号的精简2.2.2 方法
2020-12-09 11:43:20
118
原创 MQ整合JDBC报错:message from server Host ‘202.199.6.189‘ is not allowed to connect to this MySQL server
文章目录一、问题描述二、问题解决2.1 解决思路2.2 解决步骤一、问题描述在为 ActiveMQ 配置 JDBC 持久化机制之后,在虚拟机中开启 ActiveMQ 时,无法连接到本地主机中的数据库。查看 AcitveMQ 安装目录下的 data/activemq.log 日志文件,可以看到日志文件报错: message from server: "Host '202.199.6.189' is not allowed to connect to this MySQL server"具体报错如图所
2020-11-30 15:34:59
181
原创 ORM和Hibernate和JPA入门(SpringDataJPA_01)
文章目录一、ORM二、Hibernate 和 JPA2.1 Hibernate 和 JPA 概述2.2 JPA 入门案例一(快速入门)2.2.2 创建客户和联系人的数据库表2.2.3 导入 Maven 依赖2.2.4 创建客户实体类并配置与数据库表的映射关系2.2.5 配置JPA的核心配置文件2.2.6 实现保存操作2.3 JPA 的 API 介绍2.4 抽取 JPAUtil 工具类2.5 JPA入门案例二(JPA 完成 CRUD)2.6 JPA 中的复杂查询(JPQL)2.7 JPQL 入门案例一、O
2020-10-30 22:20:59
135
1
原创 Centos7 下搭建 Coturn + SignalMaster + SimpleWebRTC
文章目录前言一、WebRTC1.1 WebRTC 是什么1.2 WebRTC 的发展局限1.3 NAT 地址转换1.4 STUN、TURN、ICE 协议1.5 SDP协议1.6 信令机制1.7 WebRTC 建立媒体流二、搭建 Coturn2.1 环境准备2.2 下载编译安装 Coturn2.3 生成 tls 证书2.4 配置 Coturn2.5 启动 Coturn三、搭建信令服务器 SignalMaster3.1 环境准备3.2 下载安装 SignalMaster3.3 配置 SignalMaster3.
2020-10-30 22:05:11
2599
12
原创 Lucene入门
Lucene文章目录Lucene一、 全文检索二、 Lucene 实现全文检索的流程2.1 创建索引2.2 查询索引三、 入门案例(简单使用 Lucene)3.1 导入依赖 jar 包3.2 建立索引库3.3 查询索引库四、 分析器五、 索引库维护六、索引库查询一、 全文检索数据的分类和查询方法数据的分类结构化数据例如数据库中的数据。格式固定、长度固定、数据类型固定。非结构化数据word 文档、pdf 文档、邮件、html、txt格式不固定、长度不固定、数据类型不固定。
2020-10-20 22:12:22
112
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人