栈
栈的特点
栈的场景
栈的介绍
Java实现
用数组实现
用链表实现(含尾插法和头插法)
场景应用
栈的表达形式(前缀、中缀、后缀)
以下只给出思路与关键方法,算法的源代码放在了git中,需要的自取
leidl97/algorithm-src
栈的特点LIFO(后入先出)
《算法》将它比喻为桌子上的文件,后放上去的先拿起来阅读
出自《算法第四版》第78页
栈的场景算术表达式求值,比如《算法第四版》所提到的Dijkstra的黄河算术表达式
《算法第四版》第81页
介绍先入后出的一个有序列表
限制线性表中元素的插入和删除只能在同一端进行的特殊线性表。允许插入和删除的一端为变化的一端,成为栈顶(top),另一端为固定的一端成为栈底(bottom)
代码实现可以用数组和链表的方式实现
用数组实现定义变量3个,大小,栈顶,栈本身
方法定义4个,入栈,出栈,判断栈满,判断栈空
Java实现属性定义
123456789101112//栈顶public int top;//栈public int[] stack;//栈的大小public int size;//构造器public MyStack( ...
树
为什么需要树这种数据结构
树的常用术语
树结构Java代码实现
前中后序遍历
赫夫曼部分
赫夫曼树
赫夫曼编码
赫夫曼加密文件
二叉树部分
顺序存储二叉树
线索化二叉树
二叉排序树
平衡二叉树
多叉树部分
B+树和B*树
红黑树
以下只给出思路与关键方法,算法的源代码放在了git中,需要的自取
https://gitee.com/leidl97/algor
为什么需要树这种数据结构因为树结构存入读取数据相较于其他数据结构更有效率!
1、数组存储方式分析
优点:通过下标方式访问元素,速度快。对于有序数组,还可以使用二分查找来提高检索速度
缺点:如果要检索具体的某个值,或者插入会整体移动,效率降低
2、链式结构的分析
优点:插入和删除一个节点效率较快
缺点:进行检索时,效率仍然较低,需要从头节点进行遍历
3、树结构分析
提高存储,读取的效率,比如利用二叉树排序,既可以保证存储速度,也可以保证读取速度,修改、删除等同样
树的常用术语
节点:一个圆圈表示一个节点
根节点:最上方的节点
父节点:谁指向它谁就是父节点
子节点:它指向谁就表示谁是子节点
叶子节点:最下面一层节点(没有子节点的节点 ...
队列
队列的特点
单向队列
环形队列
单向链表
双向链表
环形链表
以下只给出思路与关键方法,算法的源代码放在了git中,需要的自取
https://gitee.com/leidl97/algor
队列的特点先进先出 (FIFO)
可以理解为排队,先排的先进入。如图所示
出自《算法第四版》第78页
单向队列思想(如何定义数据)用数组实现,头指针指向开始的前一个位置用-1表示,默认位置为0
尾指针指向最后一个元素的位置也用-1表示(初始情况下,没有元素,所以指向-1,当元素加入后尾指针会+1,将值添加到尾指针所在的位置)
判断队列为满尾指针指向元素的最后一个位置
判断队列为空头指针=尾指针
存入数据先移在存。先让尾指针+1,在将值赋给尾指针所在的位置
取出数据先移在取。取尾部数据,先让头指针+1,将头指针指向的位置取出
Java实现写出这个队列的入队和出队方法,一般采用数组的方式实现
属性定义
123456789101112131415161718//数组最大容量private int maxSize;//队列头private int begin;//队列尾private int e ...
程序员眼中的《盗梦空间》
不同人眼中的递归
你眼中的盗梦空间:不停做梦
程序员眼中的盗梦空间
那什么是递归?
自己调用自己,最简单的一个案例就是阶乘的问题
1! = 1 | 2! = 2x1 | 3! = 3x2x1 | => f(n) = n x f(n-1) 【当n=1结束】
递归有三个需要知道这个递归要做什么?
这个递归怎么结束?
当程序执行到一个方法时,就会开辟一个独立的空间(栈),而且其中变量互不影响
《盗梦空间》场景重现这个递归要做什么?=> 盗梦空间中做了什么
其实做梦就是一个递归,如果睡觉/下药那么就会做梦
在梦中在睡觉/给下药 那么又做梦,目前是梦中梦
第三层在做梦,就是梦中梦中梦……
用程序可以这么表示
123void dream(String action) { dream("做梦 / 下药 / 听音乐 / 猛烈撞击");}
这样会无限做梦,电影中到第五层之后人的脑子就已经不行了,会烧坏脑子,虽然程序比人脑强上不少,可以循环很多次,但架不住它快啊,烧的比人脑还要快,最终会导致栈溢出,程序停止
所以结束条件就显得十分重要,先来看 ...
程序员必备的软技能
怎么知道这本书的有一天逛博客的时候看到别人推荐,正好想入手两本书了,又不想对一堆技术书。简单的看了下,觉得挺不错,果断入手!
这本书怎么样作者是老美,是个程序员。说的大部分还是能感同身受的。整体来说是一本好书,值得程序员一看。
这书讲的什么提到了一个程序员除了技术之外哪些技能是比较重要的。比如自我营销,理财,健身,职场道理,生产力之类的。看个目录基本也就知道需要培养哪些能力了。
重点环节接下来就来聊一聊这本书传达的一些观点
给老板打工,不如当作为自己打工
工作是属于公司的,职业生涯是你的。干久了,你就是再走公司的路,离了公司,屁也不是。所以每天不要只放眼于工作内容。不干点自己的事,永远都在为公司打工。每个程序员都得有自己的规划,往后不一定是程序员,你需要考虑如何才能实现自己的价值
设定一个目标,将目标分解为可达目标,完成后激励自己
从小这个道理我就知道了,葫芦娃不能白看,一座大山怎么搞,一个个切下来消灭呗。激励这个因人而异,我认为将小任务完成后成就感就可以满足我
给予尊重,学会聆听,换位思考,控制情绪
有点鸡汤了,不过是职场必备,尤其要学会控制你的情绪,没人惯着你,大家 ...
后端程序员应该对vue了解多少
我与vue的相遇按理来说,我一个搞后端的应该是碰不到这玩意儿的,但缘分到了挡都挡不住,目前碰了两次,第一次是在我个人毕设中,第二次是公司项目。
说说第一次吧,当时毕设是spring+bootstrap+vue实现的。当时前端也没用到复杂的东西,比如webpack和vue-cli这些,这次公司项目中接触到vue,看见一些脚手架之类的东西,认为还是有必要看一下的,在之前到公司之前也就零零碎碎开始了解了。借此机会整理有关vue的内容,而且我感觉前端比后端有意思多了,js指不定就是我的第二语言
这篇文章的意义看完这篇文章你将收获身为后端的我们应该掌握哪些内容,为什么这些内容是重要的,去哪学,怎么学效率高。但经验总是别人的,如果你想真正学会什么东西,还需要静下心来学习,从来没有可以速成的东西,学习是一种不断的积累。
前言酸溜溜不如看正文vue是一个前端框架,类似Java中的spring框架。
回到主题,我当时学习spring框架的时候首先是系统性的学习了一遍,在之后就是利用spring框架独立搞了几个项目出来。也算是spring框架的入门了。不过也花费了不少时间,对于时间紧张的打工人来说,作为一 ...
一问一答之spring
谈谈你对spring的理解
是一个轻量级框架,解决企业开发的问题,使开发者可以更加专注于开发
他提供了很多功能,底层依赖于两个特性,DI(Dependency Injection)和AOP(Aspect-Oriented Programming)
IOC控制反转,指对象的调用权由开发者转为Spring容器,负责对象的所有生命周期(创建,管理等)
为什么需要IOC?最重要的就是解耦。
如何实现?工厂 + 反射
IOC是设计理念,DI是实现方式。有接口注入,setter注入和构造器注入
AOP的出现解决了代码重复的问题,并进行了解耦
AOP作为OO(面向对象)的一种补充,常用与业务行为无关,对公共逻辑进行封装,并命名为切面(Aspect)。常用于日志,权限认证和事务处理等
谈谈spring的IOCIOC就是控制反转,指对象的管理权由程序员变为spring管理,用来解决对象管理和依赖的问题
IOC可以理解为一个对象工厂,控制反转是一种思想,而依赖注入就是实现方式了,最大的好处就降低耦合度
在注入一个对象时,很可能不是原本的对象而是代理对象(使用到了AOP)
谈谈spirng的AOPAOP面 ...
一问一答之中间件
消息队列mq就是消息队列,在队列中的成为生产者,取数据的叫消费者
为什么要用解耦:比如对象A依赖B,C,如果不用会频繁改动源码,不便于维护,如果将A与其余对象之间加入消息队列,A只需要给mq,其余对象也只需要从mq中取。不需要在改A的代码
异步:假设A调B,C,D的方法,总时长为A+B+C+D,如果A为核心业务,其余的为非核心,用户体验会很不好,主要的已经完了,将非核心业务交给mq去做,加大吞吐量和用户体验
削峰/限流:请求多的时候,每台服务器承受能力有限,如果过多,容易把系统搞掉,这时候消息队列可以将多余请求加入队列中,来避免这种情况
什么是redisc语言编写,高性能nosql数据库,基于内存,读写快,可做缓存,分布式锁
为什么用redis传统的关系型数据库无法满足所有的场景,无法应对并发高的情况,容易将db打崩。
查的快,并发高,支持持久化
为什么快:
内存操作,访问数据库是从硬盘读取的
基于hashmap的数据结构
单线程避免多线程的上下文切换,不用考虑线程竞争,不用考虑锁的问题
使用多路复用IO模型,非阻塞IO
单线程不应该很耗时吗?会fork子进程来处理,不影响当前线程 ...