少年辛苦终身事,莫向光阴惰寸功。——杜荀鹤《题弟侄书堂》
某安语音面试十五题
有没有开发过程序?
- 没有
最近参加过什么项目?
- 没有
发表过论文没有?….
- 没有
常见的数据结构有哪些有何特点?
- 描述:线性表是最常用且最简单的一种数据结构,它是n个数据元素的有限序列。
- 数组实现:固定大小,内存连续,支持元素随机访问,插入删除效率低
- 链表实现:链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
- 栈与队列
- 栈:后进先出的数据结构。(内存的栈桢结构使用的就是栈)
- 队列:先进先出(应用:阻塞队列实现生产者消费者模型)
- 树与二叉树:
- 何谓树:每个节点有零个或多个子节点。
- 二叉树:每个节点最多两个子节点
- 性质:节点数,若规定根节点的层数为1,则一棵非空树的第i层做多有节点2i-1个节点。
- 深度为K的节点数:若规定根节点的层数为1,则深度为K的二叉树的最大节点数为2K-1(K>=0)。
- 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数 为 n2,则有n0=n2+1 ,简单的说就是:度为2的节点数等于叶子节点个数减一n2 = n0 - 1 。
- 具有n个结点的完全二叉树的深度k为为log2(n+1)上取整 。
- 满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树, 并且所有叶子节点都在同一层上。
- 完全二叉树:如果一棵具有N个结点的二叉树的结构与满二叉树的前N个 结点的结构相同,称为完全二叉树
- 二叉搜索树(BST):
- (1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- (2) 若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- (3) 左、右子树也分别为二叉排序树;
- (4) 没有键值相等的结点。
- 二叉搜索树简单实现
- 平衡二叉树(AVL树):
- 它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。
- 红黑树:红黑树是平衡二叉树的一种,红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
常见的数据结构树有哪些有何特点?
- 如上
常见的查找算法?详细内容
顺序查找:序查找也称为线形查找,属于无序查找算法。**时间复杂度**O(n)
二分查找:元素必须是有序的,如果是无序的则要先进行排序操作。**时间复杂度**O(log2n)
插值查找:基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找,其分法也不是简单的1/2,而是
int mid = low+[(key-a[low])/(a[high]-a[low])]*(high-low);
。**时间复杂度**O(log2(log2n))斐波那契查找:也是二分查找的一种提升算法,通过运用黄金比例的概念在数列中选择查找点进行查找,提高查找效率。同样地,斐波那契查找也属于一种有序查找算法。斐波那契查找与折半查找很相似,他是根据斐波那契序列的特点对有序表进行分割的。他要求开始表中记录的个数为某个斐波那契数小1,及n=F(k)-1;最坏情况下,时间复杂度为O(log2n),且其期望复杂度也为O(log2n);
树表查找:
二叉搜索树:
1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 3)任意节点的左、右子树也分别为二叉查找树。
- 4)对二叉查找树进行中序遍历,即可得到有序的数列。
时间复杂度,平均时间复杂度O(log2n),但是有可能降低成线性表,此时时间复杂度为O(n),所以有了平衡树;
平衡查找树之2-3查找树(2-3 Tree)
2-3查找树定义:和二叉树不一样,2-3树运行每个节点保存1个或者两个的值。对于普通的2节点(2-node),他保存1个key和左右两个自己点。对应3节点(3-node),保存两个Key,2-3查找树的定义如下:
1)要么为空,要么:
2)对于2节点,该节点保存一个key及对应value,以及两个指向左右节点的节点,左节点也是一个2-3节点,所有的值都比key要小,右节点也是一个2-3节点,所有的值比key要大。
3)对于3节点,该节点保存两个key及对应value,以及三个指向左中右的节点。左节点也是一个2-3节点,所有的值均比两个key中的最小的key还要小;中间节点也是一个2-3节点,中间节点的key值在两个跟节点key值之间;右节点也是一个2-3节点,节点的所有key值比两个key中的最大的key还要大。
2-3查找树的性质:
1)如果中序遍历2-3查找树,就可以得到排好序的序列;
2)在一个完全平衡的2-3查找树中,根节点到每一个为空节点的距离都相同。(这也是平衡树中“平衡”一词的概念,根节点到叶节点的最长距离对应于查找算法的最坏情况,而平衡树中根节点到叶节点的距离都一样,最坏情况也具有对数复杂度。)
性质2)如下图所示:
复杂度分析:
2-3树的查找效率与树的高度是息息相关的。
- 在最坏的情况下,也就是所有的节点都是2-node节点,查找效率为lgN
在最好的情况下,所有的节点都是3-node节点,查找效率为log3N约等于0.631lgN
距离来说,对于1百万个节点的2-3树,树的高度为12-20之间,对于10亿个节点的2-3树,树的高度为18-30之间。
对于插入来说,只需要常数次操作即可完成,因为他只需要修改与该节点关联的节点即可,不需要检查其他节点,所以效率和查找类似。下面是2-3查找树的效率:
平衡查找树之红黑树(Red-Black Tree)
- R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。
红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。B树和B+树(B Tree/B+ Tree)
- B树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点
- B+树是对B树的一种变形树,它与B树的差异在于:
- 有k个子结点的结点必然有k个关键码;
- 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
- 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。
分块查找
- 分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
- 算法思想:将n个数据元素”按块有序”划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须”按块有序”;即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……
哈希查找
- 通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。
数据库的优化?
- 添加索引,提升数据查询效率;
- 对查询结果进行分页,每次返回部分数据,降低数据吞吐量,提升响应速度;
- 读写分离,将数据分离,然后进行异步处理数据。
- 分页,对于数据量比较大时,将数据分表,分成主表从表;
- 分库,对于数据量十分巨大时,在单一数据库中进行数据操作将会变得十分缓慢,而将不同数据分库,能有效提升访问效率。
数据库的索引分类?
- 主键索引(primary key):
- 一个表中,最多有一个主键索引,当然可以使复合主键
- 主键索引的效率高(主键不可重复)
- 创建主键索引的列,它的值不能为null,且不能重复
- 主键索引的列基本上是int
- 唯一索引(unique):
- 一个表中,可以有多个唯一索引
- 查询效率高
- 如果在某一列建立唯一索引,必须保证这列不能有重复数据
- 如果一个唯一索引上指定not null,等价于主键索引
- 普通索引(index):
- 一个表中可以有多个普通索引,普通索引在实际开发中用的比较多
- 如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引
- 全文索引(fulltext):
- 当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。MySQL提供全文索引机制,但是有要求,要求表的存 储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文。
- 创建索引的原则:
- 比较频繁作为查询条件的字段应该创建索引
- 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
- 更新非常频繁的字段不适合作创建索引
- 不会出现在where子句中的字段不该创建索引
数据库的关键字和特点?
- create:创建语句
- use:使用数据库
- insert:向表中插入数据
- drop:删除数据库
- show:查看
- alter:修改
- desc:查看表结构
- max、count等函数名
- 太多了数不完
常见的数据库对象?
- 有表,索引,视图,图表,缺省值,规则,触发器,用户,函数等。
JVM的内存划分?
- 老生常谈,博客有
常见的异常?
- 老生常谈,博客有
用过的第三方框架有哪些?第三方类库有哪些?特点是什么。
- 第三方框架有:
- Mybatis:五个对比:连接、SQL管理、缓存、结果映射、性能。
- Spring:
- 特点:
- 第三方类库有:
- gson:谷歌GSON这个Java类库可以把Java对象转换成JSON,也可以把JSON字符串转换成一个相等的Java对象。Gson支持任意复杂Java对象包括没有源代码的对象。
- slf4j:SLF4J 是一个日志抽象层,允许你使用任何一个日志系统,并且可以随时切换还不需要动到已经写好的程序