自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 顺序二叉树的增删查学习笔记

顺序二叉树就是每一个节点的左子节点都要比当前节点小,每一个节点的右子节点都要比当前节点大;增加节点思路:判断待插入节点和当前节点的大小,如果待插入节点更大的话并且当前节点的右节点为空直接插到当前节点的右子节点上,否则当前节点的右子节点进行递归;如果待插入节点更小并且当前节点的左子节点为空直接插入,否则当前节点的左子节点进行递归。查找节点的思路:根据顺序二叉树的特点进行查找,不需要像普通二叉树一样遍历;先和当前节点进行比较,如果相等直接返回,如果当前节点更大并且当前节点的左子节点为空直接返回null,否则

2020-10-04 15:49:45 140 1

原创 堆排序学习笔记

堆排序:利用带大顶堆的特点(从小到大时),按照从右向左、从下自上的顺序将所有的非叶子节点都调整成以当前非叶子节点为根的大顶堆,这样遍历完成之后,整棵树就变成了一个大顶堆,最大的元素在根节点上,这时将这个最大的元素和最后一个位置上的元素进行交换,这样最大值就跑到了最后,这样操作之后,由于整棵树原本就是大顶堆,虽然把根节点调换了,但底下的还是维持原来的大顶堆特点的,因此只需要对根节点进行调整就好了,也就是调用上面的那个方法,这样length-1次之后就完成了排序;将指定节点为根节点的树调整成大顶堆思路:将指定

2020-10-04 11:06:47 106

原创 简单二叉树的查找学习笔记

查找也有前序查找、中序查找、后序查找三种方式,以中序查找为例,如果某次查找到了待查找节点直接将这个节点返回,这时候栈来到上一层,直接返回的话,如果没有找到,那就不会继续找也直接返回了,因此需要判断在下一层是否已经找到了,如果找到了那就不需要继续寻找直接返回。如果没找到还是要继续去找,使用一个临时节点来接受下一层返回的数据,如果是空的,说明没找到,继续寻找,如果不是空的,那就直接返回,对右遍历来说,也是如此,不过发现不管找没找到都要返回这个接受变量,因此直接返回即可;代码如下:Node infixFind

2020-10-02 11:44:27 85

原创 斐波那契查找学习笔记

思路是和二分差不多的,是利用斐波那契的特点进行了优化,斐波那契的前一个/后一个很接近黄金分割的,斐波那契的特点是:f[k]=f[k-1]+f[k-2],变形可得f[k]-1=f[k-1]-1+f[k-2]-1+1,这样的话另mid等于f[k-1]-1,进行迭代就好了,不过要让数组的长度为f[k]-1,因此通过while(length>f[k]-1){k++;}来调整K,直到找到一个k满足f[k]-1大于length,这时候将数组填充为长度为f[k]-1的临时数组进行查找,而且可以分成长度是f[k-

2020-10-01 17:58:21 276

原创 归并排序学习笔记

归并排序时典型的分治算法,就是把一个大的问题分成很多个小问题,而小问题就容易处理;思路:将待排序数组不断分割,直到两个两个一组,对这两个进行排序,一层层往上走,最终全都排序了;由于是由上而下的算法,因此每一层的两组待排序的部分数组内部都是按顺序排列好的,只需要通过两个指针将这两个数组不断比较,较小的进入临时数组,直到其中一组全部进入,此时再把剩余的那一组也全部进入临时数组,完成之后,将原数组的传进来的left 和right 之间的元素全部用对应的临时数组里的元素进行替代,递归完成之后,整个数组排序完成;

2020-10-01 11:33:53 118

原创 快速排序学习笔记

快速排序就是最左边和最右边各有一个哨兵、有一个初值(这里用left位置作为初值),通过两个哨兵的移动,将小于哨兵的全部放置到初值的左边,将大于哨兵的全部放在初值的右边;具体思路:对于左哨兵只要其所在位置的值小于等于初值就一直右移直到移到一个大于初值的位置(要考虑右边全是小于初值的情况,因防止越界需要加一个l<right),对于右哨兵只要其所在位置的值大于等于初值就要一直左移直到移动到一个小于初值的位置(要考虑左边全是小于等于初值的情况,也要加一个r>0的条件防止越界),如果l<r的话就将

2020-10-01 10:14:38 116

原创 希尔排序学习笔记

希尔排序时对插入排序的优化,当较小元素在靠后位置时,将会发生大量的移位,效率比较低下,而希尔排序通过分组使得后面的元素移到前面只需要很少的移位就可以完成,随着分组的的容量逐渐减少,等到分组容量为1的时候排序基本完成了,再使用插入排序就只涉及很少的移位了;思路:一开始另分组容量为length/2,每次循环都要/2直到容量为1,对于每一个容量,对第二组及后面的所有元素进行插入排序,步长就是此时的组容量;平均时间复杂度为nlogn,最好情况下也就是已经按顺序排列好就不会进入while循环了,所以此时复杂度为n

2020-09-30 17:17:53 146 1

原创 插入排序学习笔记

插入排序就是把一个未排序的数组看成两部分,一部分认为是有序的,另一部分认为是无序的,最开始的时候有序数组只有开头的第一个元素,剩下的都是无序的,要做的就是每次从无序数组中拿出一个去找到其在有序数组中应该待的位置,这样一共需要length-1次才能完成,每一次循环拿出来的那一个元素要么从0索引开始比较,比较到一个大于他的元素为止,但是索引不能超过i-1,要么就从i-1位置开始比较,比较到一个小于他的元素位置,索引最多>=0,对于前一种情况,index所在的位置就是被拿出的那个元素该待的位置,后面的都要后

2020-09-30 11:47:22 123

原创 选择排序学习笔记

选择排序就是找出没排序所有元素中最小的那一个(从小到大排序),然后把将其和未排序中元素的第一个进行交换,由于每次都找到一个最小的,因此只需要length-1次就可以把最小的length-1个排好,因此就是for(int i=0;i<length-1;i++),而每一次找最小值都是从未排序的元素中去找,一次每次找最小值都是从i开始找,找到最后未知,而定义最小值的时候,就可以把i位置的值赋上,一次你其实就是从i+1开始,找到最小值并记录下最小下标;很明显,选择排序时间复杂度也是n²,但是在排序的时候不需

2020-09-29 20:08:04 99

原创 冒泡排序学习笔记

冒泡排序就是从头开始将每相邻的两个元素都进行比较,将大的移到后面(从小到大排序),这样一大次比较完成之后,最大的那个数就跑到最后面去了,一共有N个数的话,只需要N-1次就可以把最大的N-1个数挪到后面去了,排序也就完成了,因此有个外圈循环N-1次,每次循环都要比较还没排好序的剩下的数,如果是第i次排序的话,此时剩余N-i个元素还没排,因此索引要指到N-i-1,而每次排序时,都是索引位置和索引位置加一比较大小,因此最终索引只要移到N-i-2就好了也就是<N-i-1,由此思路就完成了;很明显时间复杂度是

2020-09-29 19:36:21 113

原创 八皇后问题学习笔记

八皇后问题就是一个八行八列的棋盘上放棋,要求每一行、每一列、每一条斜线上不能有两个棋,同一行相当于说的废话,也就是从第一行放到第八行,要求同一列和同一条斜线上不能有两个棋。由于是个二维棋盘按理应该来个二维数组,但由于只是找出所有路线,二维还不好操作,而一维数组却很好用:建立一个8个容量的一维数组,0索引上的数就是第一行皇后的位置,7索引位置上的数就是第八个皇后的位置思路:明显是递归回溯,而且每一行有八个位置,因此使用一个index变量来记录当前在放第几个皇后,使用一个for循环,当前皇后接下来放置的位置只

2020-09-29 17:07:14 88

原创 中缀转后缀表达式学习笔记

中缀表达式就是我们见到的表达式形式如:(1+2)-79+5-8,这种表达式对人类很友好,但是计算机操作起来还是很麻烦的,因此一般都使用后缀表达式,就是操作符跟在操作数之后的形式如:(3+4) 5-6的后缀形式就是 3 4 + 5 *6 -;计算后缀表达式:按序遍历,操作数入栈,遇到操作符就将数栈出栈两个(次顶元素在前),直到最后剩下的就是计算的结果了;如何将中缀转后缀:1、首先通过转换把中缀转成一个List 。 2、对这个List进行遍历:(1)、初始化两个栈,一个用来存放运算符,一个用来存储中间结

2020-09-29 13:39:36 155

原创 KMP算法(next数组生成原理)学习笔记

昨天看到了KMP算法,感觉整出这个算法的三个天才真厉害,这个算法设计的也很巧妙,正是因为巧妙,理解起来也有点问题。主要思路:通过一个next数组来记录当前字符串的最大公共长度,在遍历的时候,就不需要对i进行回溯了,直接将j对应到根据next数组得出的匹配位置就好了。**一、next数组的生成next数组有两种含义,一种就是代表当前字符之前的字符串的最大公共长度,另一种就是代表当前字符串(包括当前字符)的最大公共长度,其实也各有优劣;第一种的话:因为next数组的最后一个根本不会用上(当j等于匹配串

2020-09-23 17:37:28 1406

原创 动态规划0-1装包问题学习笔记

题目要求,有一个容量为4的背包,要求把质量为1,4, 3的三个物品放进去,每个物品价值分别为1500,3000,2000,要求放完之后总价值最高。思路:建立一个二维数组,有3+1行,4+1列,多出来的一行和一列用来存不放物品和容量为0的情况,然后从第一个物品开始放,如果当前物品质量没有超出,说明这个可以放,而且还剩下当前容量-当前物品质量的容量,对于这些剩余的容量,可以放上一个物品对应的容量的放置的物品,将这个和再和上一个物品这个容量放置的物品的价值进行比较,那个大放那个,这样一来就可以得到最终价值表,但

2020-09-21 20:35:40 255

原创 二叉平衡树学习笔记

二叉排序树一定程度上提高了查找、删除、插入的效率,但是如果是按顺序插入的话:例如数组{1, 2,3, 4,5 ,6,7,8 ,9}这时候二叉排序树就成了一条链表了,不仅没有体现出该有的优点,由于判断左右子树还降低了效率。这时候二叉平衡树应运而生。二叉平衡树就是任何一个节点的左右子树的深度之差不能超过一;既然要用到深度,那就应该有一个计算给定节点左右子树深度的函数,而计算左右子树深度都相当于计算指定节点的深度,而一个节点的深度就是其左右子树深度中较大的那个加上一,明显使用递归完成,代码如下: publi

2020-09-19 20:36:23 93

原创 二叉排序树增加和删除__学习笔记

概念:二叉排序树的每一个节点的左子节点都要比这个节点的值小。右子节点都要比这个节点的值大增加节点:首先判断大小,小的话如果当前节点左子节点为空则直接插入否则向左递归,大的话如果当前节点右子节点为空直接插入否则向右递归;(一般不能出现相等的情况,出现的话左右都可)删除:删除情况有三种:1、删除的是叶子节点2、删除的是只有一个子树的非叶子节点3、删除的是左右子树都有的非叶子节点PS:为了满足删除需要,需要一个查找要删除节点的函数和一个查找要删除节点的父节点的函数,以下用node表示要删除节点,par

2020-09-19 14:18:10 210

转载 原码、反码、补码学习笔记

今天在学习哈夫曼树的时候,又遇到了原码、反码、补码问题,上次虽然看了,但没有深入的了解,特此在网上了解了一下,以下内容来自转载,觉得原作者解释的很好,记录下来,留作笔记。机器数:一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。(最高

2020-09-16 19:49:30 272

原创 线索化二叉树及遍历_笔记

线索化二叉树能够充分使用空余的left和right指针,left放前驱,right放后继指针;一、中序线索化1、实现思路:正常的中序思想,只不过中间实现前驱和后继节点的指向,为了确定前驱节点需要使用一个preNode来记录上一个处理的节点,当前节点left为空时,让其指向preNode,这样前驱节点确定;要确定后继节点就要知道当前节点的下一个节点是什么,所以直接使用preNode来处理上个节点的后继节点,也就是在当前节点来处理上一个节点的后继节点。不过这样的话,最后一个节点的后继节点就没法处理了,可以通

2020-09-15 12:20:25 134

原创 数据结构_算法_快速排序_笔记

看韩老师讲的感觉有点抽象,而且感觉以中间位置的值作为初值有点多余,如果跳过还好,不跳过的话,会多一些将初值位置不断交换的操作,效率比起以0位置作为初值也差一点(八十万条排序下);又去看了网上的一种思路,感觉也还可以,理解起来比较简单。他的思想就是以0位置为初值,跳过初值,而且加上了l<r的限制,这样就不会出现l>r的情况,最终肯定是l=r,但他这样写的话只能让r先左移,不然就出错了。这是因为在不会出现l>r的基础上,让r先左移,最终r会停在一个小于初值的位置上,接着l也会停在这个位置上,

2020-08-25 15:22:57 121

原创 数据结构_单链表_分组翻转_笔记

昨天刷头条的时候,看到一篇文章提到字节跳动的面试题“从尾部将单链表以k个一组进行翻转,若剩余一组不到k个,则这剩余的k个不需要翻转”,浏览了一番,其中作者又提到了一道相关的题目“将单链表以k个一组进行反转,如果最后剩余不足一组,则剩余的不需要反转”,正巧这一块最近又温习了一遍,就实现一下咯,不过踩了个坑,等下会说。先说正序翻转的思路:1、通过链表长度和k计算出要翻转的组数和最后剩余不足k的有几个2、将原链表分组进行翻转,需要两个中间头结点,一个用来存放按组遍历的节点,另一个就是存放最终结果的3、最后

2020-08-20 11:41:46 297

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除