数据结构与算法
文章平均质量分 89
数据结构
狂奔的蜗牛已被占用
这个作者很懒,什么都没留下…
展开
-
字符串搜索算法:暴力搜索,KMP
最近脑子有点昏昏沉沉,喝点那种红枣泡的白酒居然神奇的好了一些,感觉很舒服。看来喝少量的酒可以让人更清醒,长期喝可能有养生的效果?写道这里去百度了下,发现红枣还真有养生效果。对于长期坐在电脑旁的人,不止眼睛,其实整个身体状况就注定不会很好,平时还是要注意养生。虽然现在整个行业很卷又是互联网的寒冬,但还是尽量抽出一点时间出去走走运动运动,这样人更精神做事效率也会更高。前段时间有个大佬左耳朵才40多岁就心梗去世了,应该是平时没注意自己身体或者没有精力管自己的身体健康问题?原创 2023-06-04 23:42:17 · 794 阅读 · 0 评论 -
Huffman二进制编码以及文本的压缩与解压
Huffman树转化成二进制编码。原创 2022-12-23 04:02:38 · 1882 阅读 · 0 评论 -
Huffman编码
一本玄幻小说,在相近的章节中一定大量的重复出现人名,地名,功法境界,以及主角在一段时间内修炼的功法。在数据传输,保存的时候,特别是在数据量特别大的时候传输,保存数据是一件特别麻烦的事。比如逛淘宝的时候,首页会有很多商家展示自己产品的高清图片,如果不对图片进行压缩服务端保存图片会占用大量空间,在将图片传输给客户端的时候传输过程会特别耗时。原创 2022-12-21 03:57:34 · 1457 阅读 · 3 评论 -
较大数字的乘法
在知乎上,刷到过n次同样的话题:比较2个数的大小:45321与 54321;一般正常的做法是两边取对数,再计算对数的大小;这样就能把这2个很大的数转换成较小的数,然后利用计算器就搞定了。但是呢,总有很沙雕的答案===>直接把45321与 54321结果算出来比大小。每次刷到那个答案都会笑得不行*_*。45321与 54321这2个数字的长度都很长用long,BigDecimal这写是不行的,只能用原始的方法了。首先这2个数的幂都很大,如果直接for循环效率可能不高,这个可以利用指数的性质:(ab)n。原创 2021-06-18 19:48:09 · 250 阅读 · 0 评论 -
二叉树的树状打印(Java)
树型结构的打印难点是如何处理好同一行不同节点之间的位置关系,空格和连接线的位置长度;只要弄清楚这些就可以写代码了。原创 2022-07-27 15:54:19 · 4281 阅读 · 6 评论 -
红黑树RBT的原理分析及实现
上一篇文章讲了 AVL 树是自平衡的二叉搜索树;在 add 和 remove 之后是通过节点的左右子节点高度差来判断调节节点的平衡;红黑树RBT,也是自平衡的二叉搜索树;RBT是通过下列条件来约束节点实现的平衡: RBT的叶子节点 连续红色节点 这是一颗红黑树,可以观察到任意一个节点到叶子节点的路径上黑色的节点数都是相等的;比如 根节点500到叶子节点的路径一共10条;这10条路径上每一条路径的黑色节点数都是都是3个;再比如 200节点到叶子节点的路径有4条,这4条路径从叶子到200节点的黑色原创 2022-07-10 17:30:01 · 877 阅读 · 10 评论 -
AVL树的Java实现
二叉搜索树有一个很大的弊端就是很不稳定。输入数字的顺序不同可能导致二叉树退化成链表;比如:顺序输入: 1 -> 5;与乱序输入:3,2,4,1,5;会有不同结果; 苏联的科学家G. M. Adelson-Velsky和E. M. Landis发明了自平衡的二叉搜索树:AVL(名字缩写)树;AVL树本质上还是一棵二叉搜索树,它的特点是:也就是说,AVL树,本质上是带了平衡功能的二叉查找树; htarget = max(hleft , hright) + 1; 例子:有2个子节点;比较左........原创 2022-07-07 18:40:43 · 756 阅读 · 1 评论 -
二叉搜索树的Java递归实现
打算从二叉搜索树开始,然后AVL树,最后会写红黑树和B+树;目标:希望看完整个系列的文章大家能够自己手写红黑树和B+树;话说为什么要写这系列文章呢?可能是在网上白嫖太多好文章以及视频,希望写这篇文章能够帮助大家更好理解红黑树和B+树吧。 红黑树是比较重要的结构HashMap,ConcurrentHashMap中就使用到了这种数据结构。不理解红黑树就很难说完全理解了HashMap,ConcurrentHashMap;如果直接写红黑树的add,remove过程又会引出二叉搜索树以及AVL树中的节点旋转的知原创 2022-07-05 17:26:24 · 677 阅读 · 0 评论 -
线段树的修改和求和
@线段树 网上有很多讲线段树原理的文章,如果你是第一次接触【线段树】这种数据结构,看这些文章估计会把你脑子弄得很晕。强烈推荐直接看这个视频:线段树;1.线段树有什么用?我们可以先看一个例子;给你一个很大的数组nums,现在有个需求,给定一个区间[left,right],求该区间nums的元素和:nums[left] +nums[left+1] +…+nums[right];常规做法直接for循环叠加就原创 2022-04-07 21:55:07 · 605 阅读 · 0 评论 -
汉诺塔递归算法Java实现
有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,请问至少需要多少次移动,设移动次数为H(n)。回到问题本身,如何求解?规则:每次移动,同一根柱子上都不能出现,小盘在大盘上方;现在假设:A柱有三个盘,从上到下依次编号:1、2、3;...............原创 2018-06-10 11:55:15 · 6680 阅读 · 2 评论 -
算法:堆排序
要将乱序数组进行堆排序,首先最重要的就是要将数组的数据结构看成堆的数据结构;然后将无序堆调整成大顶堆或者小堆顶,利用大/小顶堆堆顶值的特性,进行排序;原创 2018-06-10 04:37:23 · 320 阅读 · 0 评论 -
Java快速排序
Java快速排序,思路:选择一个基准数将数组利用递归二分,直到数组不能再分为止;步骤:(升序)1、选择一个基准数(本文选择数组第一个数作为基准数);(后面称基准数为A)2、用A将数组分为2部分:比A小的在左边,比A大的在右边;经过这一步 操作之后,就将整个数组分为了2个数组;3、分别对左右两边的数组,重复上诉1,2步操作;4、退出递归的条件,数组长度length =1;实现代码:...原创 2018-06-10 03:06:05 · 5426 阅读 · 0 评论 -
冒泡排序
冒泡是最简单的排序,思路和实现都是比较简单的;其本质是交换排序;实现代码(升序): for(int i=0;i<a.length;i++) { for(int j = 0;j<a.length-i-1;j++) { if(a[j]>a[j+1]) { int t =a[j]; a[j]=a[j+1]; a[...原创 2018-06-09 22:19:35 · 126 阅读 · 0 评论 -
螺旋矩阵
题目描述:给定一个正整数 n,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。思路:生成一个 n * n的空矩阵,然后按照顺序,随后模拟整个向内环绕的填入过程:定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n;当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:执行 num += 1:得到下一个需要填入的数字;更新边界:例如从左到右填完后,上边界 t +原创 2020-08-09 18:53:38 · 197 阅读 · 0 评论 -
从矩阵中查找数字是否存在
题目:一个矩阵,从左往右依次增大,从上往下依次增大;在矩阵中查找,给定数字是否存在;分析:从矩阵整体左往右看:在矩阵的最右边的一排,是各自一排中最大的,(灵魂画手来了)如图右上角的第一个点(称作A点吧),有一个性质,如果比A点大,那么在第一排肯定找不到该数字的只能往下一排找;如果比A小,只能往左边移动;在移动到下一个点时,依然可以用上面的思路继续判断;按照这个思路,最坏的结果,则是在矩阵的左下角:找到/没找到;那么,这个算法的边界也就好确定了;```public boolean find(原创 2020-05-24 01:43:11 · 840 阅读 · 0 评论