Maven生命周期
下午面试
数据结构
数组
链表:单向链表、双向链表、双向循环链表
栈:栈也有顺序表示和链式表示,分别称作顺序栈和链栈。
队列:也存在这两种存储方式,即顺序队列和链式队列
字符串:存储结构与线性表相同,也有顺序存储和链式存储两种。
树:二叉树、完全二叉树、满二叉树、二叉查找树(也称作二叉搜索树),单词查找树,链式存储法、顺序存储法,前序遍历,中序遍历,后序遍历
哈希表:直接定制法、数字分析法、平方取中法、折叠法、除留余数法
如何解决哈希冲突:开放定址法(找空位)、链地址法(hashmap)

查询算法
递归:
分治法:
动态规划:

排序算法
下午面试

下午面试
稳定性:原数组1在2之前,排序过程中,1不会跑到2之后,这样就是稳定的
稳定性的意义
1、如果只是简单的进行数字的排序,那么稳定性将毫无意义。
2、如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义(所谓的交换操作的开销已经算在算法的开销内了,如果嫌弃这种开销,不如换算法好了?)
3、如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。
4、除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的算法,例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得想同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。(当然,如果需求不需要保持初始的排序意义,那么使用稳定性算法依旧将毫无意义)。

插入排序:选择最左边的一个元素默认是有序数组,从第二个元素开始不断插入到已排好序的数组中进行排序。遍历整个数组为N,排序为N,所以是N^2
应用场景:适用于数据量不大,对算法的稳定性有要求,且数据局部或者整体有序的情况。

希尔排序:使用步长进行插入排序,不断缩小步长,等到基本有序的时候使用插入排序效率最高,因为插入排序在元素基本有序的时候效率最高
应用场景:其排序的效率受到比较距离大小的影响,不稳定

选择排序:拿第一个元素去比较, 把最小的放在第一个
应用场景:当数据量不大,且对稳定性没有要求的时候,适用于选择排序

堆排序:堆本质是一个数组,构建大顶堆,跟元素就是最大值。不断去构建大顶堆,初始化建堆过程时间:O(n),更改堆元素后重建堆时间:O(nlogn)
应用场景:

冒泡排序:每一轮排序把最大的放在最后边,控制循环次数N,比较次数N,所以是N^2
应用场景:比较少,效率比较低

快速排序:每次选择第一个元素为中间数,把比较大的放右边,小的放左边,递归。二分法logN,大小进行排序为N,所以是NlogN
应用场景:

归并排序:使用分治法,把数组对半分,然后左右再进行对半分,每对半分一次就为一层,当归并的时候进行排序,归并好了之后就是有序的了,和快速排序一样都是二分法logN,大小进行排序为N,所以是NlogN
应用场景:

基数排序:先对个位的进行排序,然后再对十位的进行排序,再对百位的排序,以此类推
应用场景:

查询算法
下午面试

软负载和硬负载的区别
Ribbon和LoadBalancer的区别
Ribbon和Nginx的区别

相关文章: