总结一下面试过程中被问到的关于数据结构的知识。
1.数据结构中的线性结构。
(1)数组
特点:随机访问性强,查找速度快,根据下标随机访问的时间复杂度为O(1);插入和删除效率低。
(2)链表
特点:查找效率低;插入和删除速度快,内存利用率高。
(3)队列
特点:先进先出,表尾插入元素,表头删除元素,时间复杂度均为O(1)。
(4)栈
特点:先进后出,栈顶进行元素的插入和删除,时间复杂度均为O(1)。
2.B+树和红黑树
(1)B+树
B+树的本质是一棵多叉搜索树,m阶B+树包含以下特征:
1)每个结点至多有m个子结点;
2)除根结点外,每个结点至少有m/2(向上取整)个子结点;根结点至少有两个子结点;
3)有k个子结点的结点必有k个关键字;
4)所有中间结点的关键字都同时存在于子结点,在子结点中是最大(或最小)关键字,每个关键字不保存数据,只用来索引。
5)叶子结点存储关键字以及相应记录的地址,且叶子结点本身依关键字的大小自小而大顺序链接。
(2)红黑树
红黑树的本质是一棵自平衡二叉树,能够保证查找、插入、删除操作在O(logn)时间复杂度内完成。红黑树包含以下特征:
1)每个结点都有颜色,红色或黑色;
2)根结点是黑色;
3)每个叶子结点都是黑色的;
4)任一红色结点其子结点只能是黑色;
5)从任一结点到该结点的每个叶子结点的路径上包含相同数量的黑色结点。
3.排序算法及其时间复杂度
(1)快速排序(不稳定)
其思路是选定主元,调整序列中的元素,使得调整后主元左侧的元素均小于等于主元,右侧的元素均大于主元。对主元左侧和右侧元素分别进行递归调整,直到当前调整区间长度不超过1。
调整过程:将序首元素赋给一个临时变量,令left, right分别指向序列首尾。
1.如果right指向的元素大于临时变量,令其不断左移,当right指向的元素小于等于临时变量时,将right指向的元素挪到left处。
2.如果left指向的元素小于等于临时变量,令其不断右移,当left指向的元素大于临时变量时,将left指向的元素挪到right处。
重复以上两个过程,直到left与right相遇。
最好情况下时间复杂度为O(nlogn);
最坏情况下时间复杂度为O(n2);
平均情况下时间复杂度为O(nlogn);
(2)直接插入排序(稳定)
将序列的第一个元素看成是一个有序的子序列,从第二个数据逐个向有序子序列中进行有序插入,直至整个序列有序。
最好情况下时间复杂度是O(n);
最坏的情况下时间复杂度为O(n2);
平均情况下时间复杂度为O(n2)。
(3)冒泡排序(稳定)
重复扫描待排序序列,比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。
最好情况下时间复杂度是O(n);
最坏的情况下时间复杂度为O(n2);
平均情况下时间复杂度为O(n2)。
(4)二路归并排序(稳定)
将序列两两分组,组内单独排序,然后将这些组两两归并,以此类推,组内再单独排序,直到只剩下一个组为止。
最好情况下时间复杂度是O(nlogn);
最坏的情况下时间复杂度为O(nlogn);
平均情况下时间复杂度为O(nlogn)。
简单总结一下,并没有深入的描述,在面试过程中如果提到以上内容,那么像B+树和红黑树的插入删除操作,以及快速排序等排序算法的优化也是必然会被问到的。