![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
三千炼心
这个作者很懒,什么都没留下…
展开
-
平衡二叉树(AVL树)详细解析-通俗易懂
平衡二叉树定义:二叉排序树的平衡因子绝对值小于等于1,即平衡因子为-1、0、1,那么是平衡二叉树(平衡因子:根结点的左子树深度减右子树深度的差)。最小不平衡子树:子树的根结点距离插入结点距离最近,且平衡因子绝对值大于1的树为最小不平衡子树。平衡二叉树:当插入结点后出现最小不平衡子树,那么就要对最小不平衡子树重新构造,通过顺时针(平衡因子皆为正)或逆时针(平衡因子皆为负)旋转最小不平衡子树的根结...原创 2019-12-20 22:05:15 · 3081 阅读 · 0 评论 -
变态青蛙跳台阶
青蛙跳台阶,跳的阶数不限,跳到第n阶时有几种跳法package com.art.arithmetic.count;public class FrogJumpOrderNoLimit { public static void main(String[] args) { FrogJumpOrderNoLimit frogJumpOrder = new FrogJumpOrderNoLim...原创 2019-12-20 21:55:58 · 118 阅读 · 1 评论 -
斐波那契数列算法,青蛙跳台阶
青蛙跳台阶,一次可跳一阶或两阶,跳到第n阶时有几种跳法package com.art.arithmetic.count;public class FrogJumpOrder { public static void main(String[] args) { FrogJumpOrder frogJumpOrder = new FrogJumpOrder(); System.out...原创 2019-12-20 21:53:49 · 170 阅读 · 0 评论 -
获取1~n的阶乘之和
获取1~n的阶乘之和11*21*2*31*2*3*41的阶乘和 = 1的阶乘12的阶乘和 = 1的阶乘和 + 2的阶乘3的阶乘和 = 2的阶乘和 + 3的阶乘4的阶乘和 = 3的阶乘和 + 4的阶乘5的阶乘和 = 4的阶乘和 + 5的阶乘n的阶乘和 = (n-1)的阶乘和 + n的阶乘package com.art.arithmetic.count;public cla...原创 2019-12-20 21:52:39 · 800 阅读 · 0 评论 -
递归获取1至n相加的和
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字package com.art.arithmetic.count;public class OneToNSum { public static void main(String[] args) { OneToNSum otnFs = new OneToNSum(); Sys...原创 2019-12-20 21:50:02 · 934 阅读 · 0 评论 -
KMP算法思想及改进
如何判断某字符串包含某字符串?首先,我们需要了解一下朴素匹配算法,这个算法要求主串循环遍历,在遍历主串的时候,最差的情况是每匹配一个主串的字符,子串都需要匹配s次,因此假设主串为M(m),子串为S(s),那么时间复杂度O(n) = (m-s)*s + s,由此我们可以看到这个时间复杂度并不是很理想。例如:下表中,主串第1个字符匹配后与之后的3个字符,一共匹配4次,然后第2个字符再进行类似的匹配...原创 2019-12-19 10:21:18 · 137 阅读 · 0 评论 -
完全二叉树的理解
满二叉树:在一颗二叉树中,如果每个结点都存在左子树和右子树,并且所有叶节点都在同一层上,这样的树为满二叉树。完全二叉树:相同深度的满二叉树的所有结点(不包含叶子)在该树上都有相应的节点(包含叶子)与之对应且所有左子树先存在,才会存在右子树,然后才会存在下层子树的情况,这样的树为完全二叉树 。可根据下图区分:...原创 2019-12-19 10:08:17 · 8623 阅读 · 0 评论 -
最短路径-Floyd(弗洛伊德)算法理解
主要思路:和Dijkstra算法所得的最终结果是一致的,但是不同的是,在对比之前节点的时候,如将最小的权值和代替所有到达该顶点的连通线的权值,如V0V2 = 10, V0V1 + V1V2 = 5,则设置V0V2 = 5,后续依次如此推算,得到最终结果。D[V][N] = min{D[V][N],D[V][0] + D[0][N]}...原创 2019-12-19 10:03:57 · 282 阅读 · 0 评论 -
最短路径-Dijkstra(迪杰斯特拉)算法理解
主要思路:要求网图(非网图没有权值)中两点A(start)、N(end)的最短距离,那么我们可以先找出,所有与N有边连接的顶点,那么,我们再找出这些A到这些顶点的最短距离,依次类推,寻本溯源到A点,便可以找出A点到N点中,所有路经的顶点的最短距离。这些顶点与N连通的边上的权值加上A点到这些顶点的最短路径,就是A到N的最路径。核心就是A点开始一直找相关顶点的最短路径,直到N点。...原创 2019-12-19 10:02:21 · 299 阅读 · 0 评论 -
最小生成树-Kruskal(克鲁斯卡尔)算法解析
与prim算法一样,Kruskal算法也是为了图的最小生成树而产生的算法,改算法规定,先将所有边的权值按照小到大排序,每条边的起点和终点也需要加上,先从权值最小的边开始连接,每次连接前判断需要连接的顶点是否会导致树变成环,如果会导致这种情况,则跳过该边,进行下一条边的判定,直到获取该无向加权图的最小生成树。如下图:首先先建表观察beginendweightedges...原创 2019-12-19 10:00:32 · 288 阅读 · 0 评论 -
最小生成树-Prim(普里姆)算法解析
prim算法是无向加权图寻找最小生成树的算法,简单理解他的寻找路径的过程,从一个顶点V0开始,首先找到所有与V0相关联的顶点,查看这些顶点到V0的加权值,找出最小的一个,然后将该顶点纳入已统计顶点中。寻找第三个顶点时,将V0、之前已算出的顶点与所有相关联且未统计的顶点,找出最小的一个,纳入已统计顶点中。后面的寻顶点规则同上所述。最后找出最小的生产树路径。如下图:从任意顶点开始都可以,这里从V0开...原创 2019-12-19 09:50:39 · 2836 阅读 · 0 评论 -
斐波那契查找
裴波那契查找算法其实与二分查找有点类似,都是一分为二,但是,他不是均分的,而是根据裴波那契数列按比例分。如分的左边长,右边短,如果查找的那个数大多数在短的一方,那么这个算法就比二分法效率高一些了;但是,如果查找数大都在长的一方,那么这个效率就会比二分法慢了。因此,具体情况具体分析,看什么场景用什么算法,选择最适合场景的算法即可。mid=low+F[k-1]+1,k为下标。...原创 2019-12-19 09:32:58 · 109 阅读 · 0 评论 -
插值查找
插值查找就是在二分查找的基础上将获取mid的值由mid=(low+high)/2换成mid=low + (high-low)*(key-a[low])/(a[high]-a[low])package com.java.arithmetic.lookfor;public class InsertFind { public static void main(String[] args) {...原创 2019-12-19 09:30:10 · 99 阅读 · 0 评论 -
二分查找
思路:首先,该集合必须是有序的集合;先用low和high指出区间的下界和上界,low=0;high=length-1;比较当low小于high的时候,一直循环,mid=(low+high)/2;判断如果mid等与要查找的数据是否相等,小于放在左边,大于放在右边,以此继续循环,直到找到为止。package com.java.arithmetic.lookfor;public class Two...原创 2019-12-19 09:25:48 · 85 阅读 · 0 评论 -
插入排序的理解
理解:首先,将数组中的前两个数进行比较,小的在前,大的在后。然后对剩余的数一一与排好序的新数组比较,直到小于新数组中的某一位时,将该位数组值插入这个比它大的值的前面。代码:public class chaRu { public static void main(String[] args) { // TODO Auto-generated method stub ...原创 2019-06-13 10:22:11 · 173 阅读 · 0 评论 -
二分排序的理解
理解:在前面已经排好R0,R1,R2…Ri,要插入的是R(i+1)取R((0+i)/2)的排序码K((0+i)/2)与K(i+1)进行比较,如果K(i+1)<K((0+i)/2),则插在R0到R((0+i)/2)之间,反之则插在R((0+i)/2+1)到Ri之间;最后重复使用二分法知道结束...原创 2019-06-13 10:23:17 · 553 阅读 · 0 评论 -
快速排序的理解
(纯数字与对象排序,注意对象排序边界问题)理解:将数组中的元素大于某个值的放在右边,小于某个值的放再左边。然后递归,直到low>=high在返回。在快速排序中,首先要将第一个元素作为key值(其他从某位起就某位做key值也可),前面设置left为第一个元素的索引,right为最后一个元素的索引。一直high–,直到当key值大于high索引的元素时,将high索引对应的元素赋值到low...原创 2019-06-13 10:27:53 · 183 阅读 · 0 评论 -
冒泡排序的理解
理解:两两比较,交换后,得出的数组中的最大的数一次次的移动到数组的末尾,数组比较的次数也会一步步的少比较一个。数组a,两层循环。外层循环,保证比较次数为数组长度减1;内层循环,每次将数组比较a.length-i-1。代码:public class Maopao { public static void main(String[] args) { // TODO Aut...原创 2019-06-13 10:28:44 · 278 阅读 · 0 评论 -
选择排序的理解
理解:将数组中所有元素中最小的元素找出来,然后与第一个元素交换。然后将剩下的所有元素中找出最小的元素找出来,与第二个元素交换,以此类推,最后得出结果。(注意:第一层循环只要比较length-1次就好了,因为最后一个已经不需要比较;第二层循环要比较length次,因为从自身开始比较,下标互换)代码:public class Select { public static void mai...原创 2019-06-13 10:31:00 · 610 阅读 · 0 评论