- 博客(57)
- 收藏
- 关注
原创 maven专题
2.选择Maven时要和自己的idea相适配(window选择zip,tar.gz是linux,也注意和java版本适配)idea2021/2022兼容Maven3.8.1及以前。3.配置Maven的环境变量,检查是否配好:mvn -v。idea2020兼容3.6.3。idea2018兼容3.6.1。一,Maven的下载。
2025-11-11 13:08:13
250
原创 javaWeb基础
添加<Context path="/virtual" docBase="D:\01\01frontend\javaWeb基础\actual"/>在浏览器地址栏输入网址: http://localhost:8080/firstApp/first.html 进行访问。2.主机地址包括了主机 IP 地址和端口号,比如 IP 地址 localhost ,端口号 8080。互联网发展到现在出现过两种结构:C / S结构 和 B / S结构。3.资源地址 比如 /firstApp/first.html。
2025-10-04 21:16:36
509
原创 B树的概述以及插入逻辑
1.B树(B-树)又称多路平衡查找树,B树所有节点中孩子数量的最大值n称为B树的阶,通常用m表示比如当m为2就是常见的二叉树。4)每个节点中的关键字都按照从小到大的顺序排列,每个关键字的左子树的所有关键字都小于它,而右子树中的所有关键字都大于它;5)所有叶子节点都位于同一层,或者说根节点到每个叶子节点的长度相同;3)非根节点至少有ceil(m/2)- 1个关键字;1)每个结点最多有m-1个关键字;2)根节点最少可以只有1个关键字;2.B树的插入(上溢出)
2025-08-29 19:38:54
285
原创 红黑树的删除
2️⃣兄弟孩子都为黑(双黑转移):兄弟变红,双黑上移。LL:兄子染兄色,兄父右旋。RR:兄子染兄色,兄父左旋。LR:兄弟左旋,同LL。RL:兄弟右旋,同RR。b.兄弟为红(双黑转移):兄弟变黑往双黑旋转。2.节点为黑:变双黑,看兄弟。删除节点,孩子补上变黑。1.节点为红:直接删除。
2025-08-28 11:46:55
116
原创 红黑树的概述及插入逻辑
3.一颗红黑树的黑高 bh >= h/2,引理:一棵有n个内部结点的红黑树的高度h<= 2lg(n+1)(4)如果一个节点是红色的,则它的子节点必须是黑色的。[不存在两个相邻的红色节点](5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。c.每个叶子节点是黑色。[注意:这里叶子节点,是指为空的叶子节点!1.什么是红黑树:红黑树(R-B TREE)是一种特殊的二叉树。a.每个节点或者是黑色或者是红色。
2025-08-24 12:07:33
180
原创 二分查找和哈希查找
1.从数据结构(如数组)的起始位置开始,逐个检查每个元素,直到找到目标值或遍历完所有元素,时间复杂度最差为O(n)2.监视哨思想,不管在数据中能不能找到待查找值,我们可以先把待查找值放到我们在创建原数据空间时预留的0索引位置,这样就不需要判断有没有找到,如果没找到返回的就是0索引如下图,我们待查找数据为8,把8放在0索引上,从末尾数据开始找如果不存在返回的是01.什么是哈希查找根据要查找的元素(称为),通过一个预先设计好的函数(称为)计算出其应该存放的地址,然后直接去这个地址检查元素是否存在。
2025-08-22 11:05:58
883
原创 XML文档说明
e.xml文档内容中的标签属性值必须用''或""引起来。a.xml是一种文本文档,后缀名必须是xml。c.当出现特殊字符,可以用以下格式转义使用。d.xml文档中内容必须严格闭合。d.xml标签必须严格区分大小写。c.xml中有且仅有一个根标签。
2025-08-18 23:40:19
238
原创 JAVA字符串的说明以及应用
2.使用new创建字符串对象会在常量池创建一个对象,再到堆里面创建一个对象存常量池的地址。9.intern()在字符串常量池中查找是否有当前字符串,有就使用现有的,没有就创建新的。1.使用字符串类型字面量给变量赋值是在字符串常量池创建一个对象。7.split()按照参数中的符号分割返回字符串数组。8.matches()检测字符串是否满足正则表达式。5.concat()将两个字符串拼接起来。1.subString()字符串截取。4.getBytes()获取字节数组。6.trim()将字符串两端空格剪掉。
2025-08-17 21:27:29
149
原创 JAVA异常概念及应用
5.finally中的语句无论上面的代码有没有异常都会执行,除非有系统退出的代码(比如System.exit)1.如果try遇到多个问题可以写多个语句与之对应,catch的多个异常中存在子父关系,应该把父类写在最下面。2.如果try语句遇到了问题没被捕获,就相当于try catch语句白写,还是被jvm默认处理。4.jdk7以后catch中可以是多个异常用"|"隔开,表示出现这些异常采用同一种处理方式。3.try中遇到了问题下面的语句就不会执行,直接执行相应的catch的语句体。1,自定义运行时异常。
2025-08-17 10:54:32
310
原创 归并排序和统计排序
0.5, 1.5)[1.5, 2.5)[2.5, 3.5)[3.5, 4.5)[4.5, 4.5] 具体需要建立多少个桶,如何确定桶的区间范围,有很多种不同的方式。我们这里创建的桶数量等于原始数列的元素数量,除最后一个桶只包含数列最大值外,前面各个桶的区间按照比例来确定。第二步:遍历数组[1,4,1,2,5,2,4,1,8],访问第一个元素1,然后将数组标为1的元素加1,表示当前1出现 了一次,即 count[1] = 1;我们以数组[1,4,1,2,5,2,4,1,8]为例进行说明。
2025-08-15 21:23:40
271
原创 堆排序以及实现
我们之前学过二叉树,如果从索引1开始按照从上到下,从左到右的顺序将元素存入一张表,那他们的父节点、当前节点、左孩子、右孩子的索引满足规律[i/2,i,2i,2i+1]我们会接触到很多不同的关于堆的概念,这里我们要讲的是数据结构中的堆。在代码实现过程中就可以用上这一规律,下图是小顶堆的实现逻辑。1.概念:堆是一种基于完全二叉树的特殊数据结构。假如要删除上图中的1,删除后的效果为下图2。a.大顶堆(Max-Heap)b.小顶堆(Max-Heap)根节点大于他的孩子节点。孩子节点大于他的根节点。
2025-08-12 16:39:41
662
原创 快速排序以及实现
当遇到小于基准值的元素时,将mark右移,并交换当前元素与mark位置的元素。选择基准值(pivot):通常选择数组的最后一个元素作为基准值。选择基准值(pivot):通常选择数组的第一个元素作为基准值。放置基准值:遍历完成后,将基准值与mark+1位置的元素交换。递归排序:对基准值左右两边的子数组递归执行上述过程。递归排序:对基准值左右两边的子数组递归执行上述过程。放置基准值:将基准值与左指针当前位置的元素交换。左指针向右移动,直到找到大于等于基准值的元素。右指针向左移动,直到找到小于等于基准值的元素。
2025-08-11 11:01:37
391
原创 冒泡排序实现以及优化
随着我们的交换可能不需要n轮就已经将所有元素排好序了,比如我们在对第一个最大值进行排序时就可以把所有元素排好序,就没必要进行第二轮了,我们就可以用一个变量来记录这轮内循环是否有过交换,若果没有就说明已经排好序了。冒泡排序是从第一个元素开始和后面一个元素进行判断是否满足左小右大,如果不满足就交换位置,再拿第二个和第三个进行上述操作一直到第n-1和第n个。如下图假如经过第一轮排序,从65开始后面的元素就已经有序了,那么下轮排序就只需要循环到65为止后面的就不需要比较了。
2025-08-10 20:51:05
559
原创 排序概念、插入排序及希尔排序
c.虽然很多算法本身具有稳定或不稳定排序性质但是任何排序只要稍作修改就可以修改稳定性,例如在冒泡排序中判断交换顺序的依据是if(a>b)只要变成if(a>=b)就可以破坏稳定性。2.内部排序和外部排序:待排序数据可以一次性载入到内存中为内部排序,反之数据量过大就是外部排序。3.稳定排序:排序前后序列中键值相等的元素在相对位置不发生变化的就是稳定排序。就地排序只是在原数组空间进行排序处理,也就是输入的数组和得到的数组是同一个。3.如果待排序的元素,已经有序,只有极个别的元素是无序,插入速度较快。
2025-08-09 20:08:31
1151
原创 关键路径以及代码实现
已知V8的最早发生时间为18,则V6最晚发生时间为18-2=16,V7最晚发生时间为18-4=14。因为3条路都要满足,只要影响了一条最终结果都会受到影响,因此最终V0的LTV为0。在AOE网的工程当中,只有一个0入度的顶点称为源点,只有一个0出度的点称为汇点。由于V4事件必须等这两条路都到了才算发生因此V4的ETV为7,因此。V4的LTV为7,V1的LTV为6,V2的LTV为6。如下图:V4最早发生时间为(ETV)7。V0的最晚发生时间LTV为0。从V1过来LTV为0。从V2过来LTV为2。
2025-08-07 21:24:11
573
原创 JAVA面向对象
而当我们的传递引用数据类型是堆空间中地址的拷贝。形参:person{age = 100}实参:person{age = 20}因为我们的传递基本数据类型是值的拷贝。
2025-08-07 16:22:22
340
原创 拓扑算法以及实现
若果是右图,我们先从没有入度的边开始执行, V1和V6都可以,我就先从V1开始,执行完V1后就可以把V1的出度删除,再执行V6后把V6的出度删除,此时V3和V4就没了入度,我们执行V3后把V3的出度删除,再执行V4后把V4的出度删除,此时V2和V5没了入度,我们先执行V2再执行V5。图的存储行为:我们要存的是一个有向图,首先会想到邻接表,但算法中要找入度,所以我们会再创建一个入度数组,入度数组存储各个顶点的入度个数,每次出栈更新入度数组的值。a.找到一个入度为0的点,放入缓存(队列、栈)
2025-08-06 15:34:17
977
原创 Dijkstra算法
a.如下图当我们把每个点之间的路径当做绳子,最开始所有点平放在桌面上,把a提起来时顶点离开桌面的顺序取决于其到A的距离。更新dist和path:假如该点未被激活过且新的路径长度比当前更短就覆盖当前路径长度并更新path,否则不更新。我们图结构如下,假如单源点为0,标记mark[0]为1,更新0的邻接点的dist和path。c.当所有顶点离开桌面时,绷直的绳子就是他到其他顶点的最短路径。找与当前节点边最短的邻接点为待激活点,重复上述单源点的操作。b.下图离开桌面的顺序为A,B,D,C,E。
2025-08-04 21:52:19
552
原创 Prim算法
a.采用邻接矩阵表示,考虑要查找最小值,初始化不存在的边的值为INF。1.理解:克鲁斯卡尔算法关注的是边,普里姆算法关注的是点。把图中每个顶点比作孤岛,点亮一座孤岛就可以解锁附近的孤岛。在边集数组中保存visit和当前节点的编号,以及权值。从cost数组找到权值最小的顶点,激活该顶点。cost边的权值数组,保存到该条边的权值。任意找到一个激活点,更新三个数组。每次解锁的点都是离自身最近的点。visit从哪个顶点访问过来的。2.将头文件中的接口一一实现。mark标记已访问的点。3,测试是否有bug。
2025-08-01 22:11:48
498
原创 Kruskal算法
1.定义:n个顶点的的连通图取其n-1条边,构成一个最小连通子图,并使该连通子图中n-1条边上权值之和达到最小值,则称其为连通网的最小连通子图。b.如何判断是否生成环,需要之前学过的并查集,添加一条边有两个顶点<a,b>,判断a和b是否在一个集合。a.生成树当中不存在环(环:一个顶点经过若干条边能回到本身,且经过的边不能重复)a.总共找n-1条边,每次都找权值最小的那条边,但必须保证这条边的加入不会产生环。b.对于n个顶点的无向完全图,最多包含n^n-3棵生成树。
2025-07-29 23:05:06
1153
原创 邻接多重表逻辑以及实现
在我们的边结构中,iVex和jVex的位置可以互换,因此在一条边中需要判断iVex为当前节点还是jVex为当前节点,再去修改iLink或jLink。上次学过的十字链表是实现邻接表既能存储出度也能存储入度,多用于有向图。之前我们的无向边需要两条边表示,但是我们的邻接多重表只需要一条边。这次我们学的邻接多重表是为了解决无向图中重复存储边的问题。
2025-07-28 18:31:45
275
原创 十字链表以及实现
要使得链表能够存储入度和出度,我们的节点得有两个指针,一个指向入度firstin、一个指向出度firstout。而我们的边结构有四个成员,弧尾tailvex、弧头headvex、以当前节点为弧头、以当前节点为弧尾。4.邻接多重表:适合无向图,一条无向边,用一个节点表示,便于删除。5.边集数组(小众):只关心边的情况,常用于最小生成树。3.十字链表:适合有向图,顶点集里既存出度也存入度。:适合表示无向图、有向图、有权无权图。缺点:a.只存出度,计算入度非常麻烦。b.无向图时,边要表示两次,删除麻烦。
2025-07-27 19:42:49
287
原创 图的BFS和DFS
广度遍历首先也是需要一个队列,当我们访问完一个节点就把激活的新节点入队,然后每出队一个节点就访问它并把新激活的节点入队。但是和树不一样,图也是有可能重复访问的,比如从v1开始访问到v3,当我们访问完v3会激活v1、v6、v7,但是v1已经被访问过了,因此需要引入一个存储已访问节点的表。现在我们要学习图的遍历操作和树类似可以分为深度遍历和广度遍历,而深度遍历也是用递归实现,广度遍历是用队列实现。如左图当我们选择v1为起点找到和v2的这条边,此时激活了v2那么就需要处理v2的三条边,但v1我们已经走过了。
2025-07-23 22:59:36
835
原创 图的表示法以及实现
正常邻接表每个节点上记录出度链表的首地址,为了方便查找入度出现了逆邻接表,每个节点记录入度链表的首地址。邻接指的是将所有元素用表相邻的连接起来,而矩阵是指用一个二维数组存储边的关系。当存储无向表时,会重复记录边的关系,邻接多重表就是为了解决这种情况出现的。每个节点既要记录出度首地址,也要记录入度首地址。
2025-07-20 23:54:53
401
原创 Huffmantree的代码实现
优化思路:在存储编码时,可以从数组temp的末尾n开始存入,使用变量start表示temp的索引,每存一个就减1,再使用strcpy或memcpy从temp的start索引开始拷贝到Codes。1.首先需要从所有字符中找到权值最小的两个,将两个字符的权值相加生成新的节点,这个新节点的左孩子是更小的那个,右孩子是次小的那个,而这两个字符的父节点为新生成的节点。3.初始化所有字符的权值(权值按百分比填,权值之和为100),然后从n+1的位置开始循环第一步的操作,结束条件为表的最大容量2n。
2025-07-19 14:32:23
627
原创 图的概述和表示
连通图:如果顶点x、y存在可相互抵达的路径(直接或间接)则称x、y是连通的,如果图G任意两个顶点都是连通的,则称G为连通图,否则就是非连通图。比如四个节点四条边,去掉一条还是连通的所以不是极小连通子图,如果是四个节点三条边则去掉任意一条边都不会再联通,那么这个连通图就是极小连通子图。欧拉环路:将图中所有边都恰好走过一遍,也就是路径长度等于边的总长度,如下图{C,A,B,A,D,C,D,B,C}集合G包含顶点和顶点之间的偶对记为G(V,E),偶对连接两个顶点称之为边或弧,V集合包含所有顶点,E集合边或弧。
2025-07-17 21:42:14
856
原创 Huffman树的性质
2.因为总共有2n-1个节点,索引又从1开始,可以创建长度为2n的表(n为字符种数),表中的元素为一个节点拥有的成员为weight、parent、leftchild、rightchild。1.首先需要从所有字符中找到权值最小的两个,将两个字符的权值相加生成新的节点,这个新节点的左孩子是更小的那个,右孩子是次小的那个,而这两个字符的父节点为新生成的节点。如果huffman树的元素个数为n假设总节点数为m,总结点数为度为0的节点数和度为2的节点数之和。元素个数为n的哈夫曼树的总结点数为2n-1。
2025-07-15 17:17:45
582
原创 QuickUnion优化及Huffman树
指的是从根结点到该结点之间的路径长度与该结点的权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。例如在一棵树中,规定根结点所在层数为1层,那么从根结点到第i层结点的路径长度为从根结点到结点 c 的路径长度为 3。当我们进行根节点的查找,可以将每个经过的节点放入一个栈,找到根节点后再把栈的所有节点一一出栈并把这些节点的父节点改为根节点。由于每次合并、查找都需要得到元素的根节点,而当我们的树路径过长效率不高,因此我们可以将每个元素的父节点都指向根节点。例如,结点al17,结点b 的权为5。
2025-07-13 23:41:09
255
原创 并查集理论以及实现
并查集可以理解为一个部落,部落的每个元素是个村庄,村庄之间有的可以互通,所有互通的村庄的集合就是一个部落,而每个部落都会有个代表村庄,也可以说是老大。如果我们要合并3和2,合并的其实是他们所在集合的根,也就是把4的下标改为1,合并他们根的过程就是从2找到1,然后从3找到4,最后将4和1合并。每一个元素,可以有个标号,代表这个元素的老大,当改变这个元素的老大,则这个元素的小弟也会认这个元素的老大做大哥。再将4、2合并后4认2做老大,以及4元素的小弟也要认2做老大,也就是把所有下标是4的都改成2。
2025-07-12 14:36:39
1572
原创 平衡二叉树的删除和森林变换
平衡二叉树的删除其实相当于之前讲过的二叉搜索树的删除再加上平衡判断操作,先从根节点开始往后递,到了要删除的点再判断度的个数执行各自的操作,只是度为1时我们可以换一种写法,把待删点的值替换成度的值,再把度的左子树和右子树接到待删点的左子树和右子树,最后把待删点释放。3. 森林转换为二叉树森林中每个树先转换为二叉树 将第二棵二叉树作为第一棵树的右孩子,第三棵树的根作为第二棵树的右孩子。1. 树转换为二叉树 将同一个父节点的孩子相连,水平串在一起 保留同一个父节点的第一个孩子,其余孩子都去掉。
2025-07-11 12:01:37
564
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅