从逻辑结构上来看,数组必须实现定于固定的长度,不能适应数据动态增减的状况,即数组的大小一旦定义就不能改变。当数据增长是,可能超过原先定义的元素的个数;当数据减小时,形成内存浪费;链表动态进行存储分配,能够适应数据动态地增减的状况,且能够方便地插入、删除数据项。程序员
从内存存储的角度看;数组从栈中分配空间(用new则在堆上建立),对程序员方便快速,可是自由度小;链表从堆中分配空间,自由度大可是申请管理比较麻烦。面试
从访问方式类看,数组在内存中是连续的存储,所以能够利用下标索引进行访问;链表是链式存储结构,在访问元素时候只可以经过线性方式由前到后顺序的访问,因此访问效率比数组要低。算法
[!NOTE]
掌握全部常见的排序算法的手写实现,以及复杂度相关细节知识。数据库
选择一个基准元素,一般选择第一个元素或者最后一个元素,数组
经过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另外一部分记录的元素值比基准值大。数据结构
此时基准元素在其排好序后的正确位置指针
而后分别对这两部分记录用一样的方法继续进行排序,直到整个序列有序。blog
平方阶(O(n2))排序
各种简单排序:直接插入、直接选择和冒泡排序;排序
线性对数阶(O(nlog2n))排序
快速排序、堆排序和归并排序;索引
线性阶(O(n))排序
基数排序,此外还有桶、箱排序。
说明:
当原表有序或基本有序时,直接插入排序和冒泡排序将大大减小比较次数和移动记录的次数,时间复杂度可降至O(n);
而快速排序则相反,当原表基本有序时,将蜕化为冒泡排序,时间复杂度提升为O(n2);
原表是否有序,对简单选择排序、堆排序、归并排序和基数排序的时间复杂度影响不大。
[!NOTE]
排序算法的稳定性:若待排序的序列中,存在多个具备相同关键字的记录,通过排序,这些记录的相对次序保持不变,则称该算法是稳定的;若经排序后,记录的相对次序发生了改变,则称该算法是不稳定的。
冒泡排序、插入排序、归并排序和基数排序
选择排序、快速排序、希尔排序、堆排序
通常而言,须要考虑的因素有如下四点:
设待排序元素的个数为n.
当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。
当n较大,内存空间容许,且要求稳定性:归并排序
当n较小,可采用直接插入或直接选择排序。
直接插入排序:当元素分布有序,直接插入排序将大大减小比较次数和移动记录的次数。
直接选择排序 :元素分布有序,若是不要求稳定性,选择直接选择排序
通常不使用或不直接使用传统的冒泡排序。
[!NOTE]
须要对HashTable的底层实现有深刻的理解,知道哈希冲突的产生缘由和解决方法。
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。
1) 线性探测法
2) 平方探测法
3) 伪随机序列法
4) 拉链法
[!NOTE]
若是对数据库有了解的话,该知识点须要深刻理解。
根据B类树的特色,构造一个多阶的B类树,而后在尽可能多的在结点上存储相关的信息,保证层数尽可能的少,以便后面咱们能够更快的找到信息,磁盘的I/O操做也少一些,并且B类树是平衡树,每一个结点到叶子结点的高度都是相同,这也保证了每一个查询是稳定的。
B树和B+树的区别,以一个m阶树为例。
关键字的数量不一样;B+树中分支结点有m个关键字,其叶子结点也有m个,其关键字只是起到了一个索引的做用,可是B树虽然也有m个子结点,可是其只拥有m-1个关键字。
存储的位置不一样;B+树中的数据都存储在叶子结点上,也就是其全部叶子结点的数据组合起来就是完整的数据,可是B树的数据存储在每个结点中,并不只仅存储在叶子结点上。
分支结点的构造不一样;B+树的分支结点仅仅存储着关键字信息和儿子的指针(这里的指针指的是磁盘块的偏移量),也就是说内部结点仅仅包含着索引信息。
查询不一样;B树在找到具体的数值之后,则结束,而B+树则须要经过索引找到叶子结点中的数据才结束,也就是说B+树的搜索过程当中走了一条从根结点到叶子结点的路径。