1. 说下种常的排序算法和分别的复杂度
【快速排序】
原理:快速排序采的是种分治的思想,它先找个基准数(般选择第个值),然后将这个基准数的数字都放到它的左边,然后再递归调,分别对左右两边快速排序,直到每边只有个数字.整个排序就完成了.
- 选定个合适的值(理想情况中值最好,但实现中般使数组第个值),称为“枢轴”(pivot)。
- 基于这个值,将数组分为两部分,较的分在左边,较的分在右边。
- 可以肯定,如此轮下来,这个枢轴的位置定在最终位置上。
- 对两个数组分别重复上述过程,直到每个数组只有个元素。
- 排序完成。
复杂度:O(n)
特点:快速排序是我们平常最常使的种排序算法,因为它速度快,效率,是最优秀的种排序算法.
【冒泡排序】
原理:冒泡排序其实就是逐较交换,进外两次循环,外层循环为遍历所有数字,逐个确定每个位置,层循环为确定了位置后,遍历所有后没有确定位置的数字,与该位置的数字进较,只要该位置的数字,就和该位置的数字进交换.
复杂度:O(n^2),最佳时间复杂度为O(n)
特点:冒泡排序在我们实际开发中,使的还是较少的.它更加适合数据规模较少的时候,因为它的效率是较低的,但是优点是逻辑简单,容易让我们记得.
直接插排序:
原理:直接插排序是将从第个数字开始,逐个拿出来,插到之前排好序的数列.
复杂度:O(n^2),最佳时间复杂度为O(n)
直接选择排序:
原理:直接选择排序是从第个位置开始遍历位置,找到剩余未排序的数据最的,找到最的后,再做交换
复杂度:O(n^2)
特点:和冒泡排序样,逻辑简单,但是效率不,适合少量的数据排序。
2. java写个冒泡排序算法
3. 描述下链式存储结构
a. 线性结构的优点是可以实现随机读取,时间复杂度为O(1),空间利率,缺点是进插和删除操作时较麻烦,时间复杂度为O(n),同时容量受限制,需要事先确定容量,容量过,浪费空间资源,过不能满使要求,会产溢出问题。
b. 链式存储结构的优点主要是插和删除常简单,前提条件是知道操作位置,时间复杂度是O(1),但如果不知道操作位置则要定位元素,时间复杂度为O(n),没有容量的限制,可以使过程中动态分配的分配内存空间,不担溢出问题,但是它并不能实现随机读取,同时空间利率不。
4. 如何遍历一颗二叉树
树节点:
b. 递归先序遍历:先输出节点的值,再递归遍历左右树。中序和后序的递归类似,改变根节点输出位置即可。
c. 递归中序遍历:过程和递归先序遍历类似
d. 递归后序遍历:
5. 倒排个LinkedList
Collections.reverse(linkedList);
6. java写个递归遍历录下的所有件(directory.listFiles())
7. 叉树与红树
叉树
特性:
- 左树上所有结点的值均于或等于它的根结点的值。
- 右树上所有结点的值均于或等于它的根结点的值。
- 左、右树也分别为叉排序树。
查找:
- 分查找(通过层层的较来查找位置):如查找值为10的节点:9–13–11–10
缺陷:
- 插容易变成线性形态,查找性能打折扣,这时需要引红树来解决
红黑树
特点:是种平衡的叉查找树,除了符合叉树的特点之外,还符合以下点:
- 节点是红或。
- 根节点是。
- 每个叶节点都是的空节点(NIL节点)。
- 每个红节点的两个节点都是。(从每个叶到根的所有路径上不能有两个连续的红节点)
- 从任节点到其每个叶的所有路径都包含相同数的节点。
添加删除:通过旋来保证平衡
8. b-tree、b+tree多叉树
b-tree(件系统)
B树也称B-树,它是颗多路平衡查找树。我们描述颗B树时需要指定它的阶数,阶数表示了个结点最多有多少个孩结点,般字m表示阶数。当m取2时,就是我们常的叉搜索树。
定义:
- 1)每个结点最多有m-1个关键字。
- 2)根结点最少可以只有1个关键字。
- 3)根结点少有Math.ceil(m/2)-1个关键字。
- 4)每个结点中的关键字都按照从到的顺序排列,每个关键字的左树中的所有关键字都于它,右树中的所有关键字都于它。
- 5)所有叶结点都位于同层,或者说根结点到每个叶结点的度都相同。
插数据,向兄弟节点借,兄弟节点不够则向节点借;
b+tree(mysql索引)
定义:
- 1)B+树包含2种类型的结点:内部结点(也称索引结点)和叶结点。根结点本身即可以是内部结点,也可以是叶结点。根结点的关键字个数最少可以只有1个。
- 2)B+树与B树最的不同是内部结点不保存数据,只于索引,所有数据(或者说记录)都保存在叶结点中。
- 3)m阶B+树表示了内部结点最多有m-1个关键字(或者说内部结点最多有m个树),阶数m同时限制了叶结点最多存储m-1个记录。
- 4)内部结点中的key都按照从到的顺序排列,对于内部结点中的个key,左树中的所有key都于它,右树中的key都于等于它。叶结点中的记录也按照key的排列。
- 5)每个叶结点都存有相邻叶结点的指针,叶结点本身依关键字的顺序链接。
9. 谈谈数据结构,如TreeMap
TreeMap实现了红树的结构。
10. 图的深度遍历和度遍历
1、深度优先遍历:
2、度优先遍历:
11. 介绍下红树、叉平衡树
12. 说说java集合,每个集合下有哪些实现类,及其数据结构。
HashMap:
- 在HashMap内部,采了数组+链表的形式来组织键值对Entry<Key,Value>(利数组的查询快+链表的插删除快)
- HashMap在存储键值对Entry<Key,Value>的时候,会根据Key的hashcode值,以某种映射关系,决定应当将这对键值对Entry<Key,Value>存储在HashMap中的什么位置上
- 在JDK1.7进多线程put操作,之后遍历,直接死循环,CPU飙到100%,在JDK 1.8中进多线程操作会出现节点和value值丢失,为什么JDK1.7与JDK1.8多线程操作会出现很不同,是因为JDK 1.8的作者对resize法进了优化不会产链表闭环。
结构:
HashMap扩容:
扩容步骤:
2. 为何扩容为原来的两倍(性能):
- 在HashMap通过键的哈希值进定位桶位置的时候,调了个indexFor(hash, table.length
- 通过限制length是个2的幂数,h & (length-1)和h % length结果是致的。
- 如果length是个2的幂的数,那么length-1就会变成个mask, 它会将hashcode低位取出来,hashcode的低位实际就是余数,和取余操作相,与操作会将性能提升很多。
put流程:
get流程: