斐波那契数列
初衷💁🏻
说来也是惭愧,入行这么久了,一直没有仔细去思考为什么去做这个,之前一直游想法去好好学学数据结构和算法,一直苦于是重点学习Docker、K8S、JVM,多线程,或者是Netty,NIO,分布式相关,Spring源码,MyBaits源码这些,一直陷入到了技术的漩涡,这些技术的专业名词,说不理解,那等于白工作了这么多年,说理解但是好像有事蜻蜓点水一样,我也就只知道这个名词是做啥,但是真正的在工程中应用,怎么可能这个工程即用了Netty,然后有用了SpringCloud,然后还正好需要我进行JVM的调优,各种老年代的内存然后分片分布一下,在或者刚好也有业务场景需要进行分库分表吧,然后在Redis优化一下,然后在MQ在整上,在做一些优化吧,一个人好像可以掌握的东西可以有很多,但是不明白的是,这些真正的东西,到底属于自己真正掌握的到底有多少,其实我自己也不清楚,从去年开始,一直对源码很是执着,但是能看懂一些,但是说为什么这么设计,这么设计是很好,我复刻不出来,还原不出来那种思想,只看到了结果,怎么设计出来的这种结果的过程也不知道。
归根到底其实,也是被网络中的各种IT行业的焦虑所影响的,一直被传播要不停的学习新技术,要不停的紧跟时代的的潮流,比如JDK都出到17了,你应该立马去学习JDK17的新特性,而不用管工作需不需要用的这些特性,学习的本质,应该是让我总结问题,或者分析问题的能力得到提升,而不是让我维了学习去学习,一直没有分清楚主次,有时候仅仅是为了面试,或者为了跳槽,去背一些八股文,其实现在一些公众号,动不动就是最新大厂面试攻略,最新的技术指导方案,这些有多少可溯源的尚且不说,看了这些好像真的能去大厂一样,刻意的传播焦虑才能让这行很累,其实是自己和自己在不停的内耗我也不知道为什么, 总感觉很累,很累,学不完的知识,搞不完的新技术点,工作的本质不就是为了挣一点钱,然后生活的好一点,为什么会被环境折磨的这么累,不知道大家到底是为了什么。
扯远了,现在也是不停的反思,正过来想想,发现一直学新技术,一直不停的追新的一直没有意义,而且一直还学不完,好像就是毛驴头上的胡萝卜一直在自娱自乐。有时候很多事情很有意义,有很多事可以做,但是没有成体系的思考,和刻意的训练其实是一直在浪费时间。其实我的时间管理做的是比较烂的,好多时候都在浪费时间,唉,没办法,水平很一般。最近也是发现了自己之前一直在学数据结构,从上大学的时候开始学,然后中间反复穿插了4次,没有啃下来,那个时候看视频也好,看书也好,甚至是从0-1把代码抄下来也好,但是都没有坚持很长时间,最多也就坚持2个月,无疾而终了,我不知道是不是那个时候没有参加工作的原因,总感觉这些东西给我的提升不如学那些SpringBoot,Cloud,MQ,Redis,Docker,JVM这些东西显而易见的增长的快,还是急于求成了。造成我现在的方向极度混乱,一直学的都是简单的东西。
前几天,线上出了一些问题,我发现靠学的JVM,和优化相关的技巧其实并没有什么卵用,可以看出来的东西,第一点需要对当前平台的业务极其了解,看old和Eden才可以说可以把那些模块下的那些大对象优化一下。整体的说,还得从CPU,内存,磁盘,IO,网络,这几个方面来看,我之前一直想当然的觉得学了JVM调优就可以纵横天下了,可见想法是多么的幼稚和拙劣,格局不够高,看的不够远。其实我最根本的问题还是,对代码的思考,和编码的素养一直非常差,就因为大学的时候,自己一只在自娱自乐,学习学习这,学习学习其他的,没有去深入下去。现在往事又慢慢的爬上来了,唉自己埋下的雷还是的自己吞下去。说了这么多废话也是希望想总结一些东西,刚刚把电脑磁盘又扩了1个T,能坚持到2023年年底吧,还有2天今年上半年就过完了,我发现我之前在CSDN上写的博客也帮助到了不少人,我也希望能在这个公众号上发一些自己的记录希望也能督促我吧,没办法,如果各位觉得啰嗦,可以取关了。兜兜转转绕了一大圈,又会到了起点。希望我可以坚持下去,再次立贴每天会更新数据结构和算法相关的知识。谢谢各位监督和支持。
斐波那契数列
今天就简单总结一些斐波那契数列吧,这个东西每个视频,没个博客什么数据结构的开篇都是这些,就从这个开始吧。我也不复制粘贴了,太偷懒了,简单总结一些。
(0 1 2 3 4 5 )
0 1 1 2 3 5 8 13
这个数列的大概意思就是第三个数就是前面两个数的之和,生动形象的比喻一下就是后天的结构,就是昨天和前天的过程;比如0 1 1 2 3 5 8 13 这一串就是满足斐波那契数列的要求,他的 第三个数,就0 +1 的结果,后面以此同理,2就是1+1的结果,3就是1+2的结果。
算法实现
下面是我做的一些算法实现,都比较简单的主要是分为了两种,第一种就是递归来实现的,第二种就是用迭代了实现的,这里面有牵扯到了递归,递归这方法我在工作中是一次都没有用过,看着简单,用着用着就容易栈溢出,非常坑爹,这家伙要是在生产上崩一次,哭都没办法哭,作为对比我还是简单的写一下。
递归实现:
public static int fib(int n ){
if ( n <= 1 ) return n;
return fib(n -1 )+ fib(n-2);
}
迭代实现:
public static int fib2(int n) {
if (n <= 1) return n;
int first = 0;
int seconde = 1;
for (int i = 0; i < n - 1; i++) {
int sum = first + seconde;
first = seconde;
seconde = sum;
}
return seconde;
}
简单说下区别,递归实现的时候,因为是递归来实现,所以每每次进行实现的时候就需要进行在调用,其实非常不好理解,我个人水平有限,有没有百度上那些大佬解释的清楚,反正递归这个概念我自己的理解,就是函数调函数,然后1-2-3-4,4-3-2-1,这样怎么说呢,就是他不停的往里调用调用,一直调用的有返回值了就往外面吐数据。大概就是这个意思吧,所以第一个实现的时候,看起来是非常简单就两行,fib(n-1)+fib(n-2)也符合对应的调用的斐波那契数列的定义,但是,他这个非常容易栈溢出
直接崩掉了,其实也可以理解就是栈的空间是存放方法的返回值的,你把这个N放得无限大,没有那么多空间可以用了呗;所以就崩了,这是我个人的理解哈,后面的迭代调用的时候,就设计的比较好了,首先用了两个first变量存放一下,seconde变量存放一下,在对应的迭代里面的时,也是比如(0 1 1 2 )这个里面看到第一次first =0 ,seconde =1 ,后面循环到第二次的时候,这个1其实作为第一次的second 其实被当做第二轮循环的first,然后呢第一轮循环的sum =first+second 的sum 值 1 其实就是第二轮的second ,就这种简单的替换,可以看到非常大的差距。fibe1 是使用的递归,fibe2使用的迭代。
初学这个其实还绕不过算法时间复杂度和空间复杂度,学这个学了几次了,只有今天是彻底记住了这个时间复杂度的顺序,之前一直记不住这个o(1),o(logn) o(n),o(nlogn),o(n^2),o(n^3),主要是o(logn)这个和o(nlogn)这俩的顺序记不住,后面自己看了下这个logn不就是一个常数么,肯定比n小,这下顺序一下就记住了,其实好多时候学习的时候,还是想着一蹴而就,想着立马就可以变得很牛逼,多么不现实的想法。
积累,专注,持之以恒。坚持输出一下,就可以了,希望这个帖子的日常更新可以更新到2023.12.31我也希望有那么一天,刚好这个卫星的博文日更一天只能更新一次,也不用多更新,每天只输出一个简单的数据结构的知识点和自己的看法和想法。再次感谢各位粉丝朋友对我的支持和厚爱。谢谢
2023.06.29