1.局部预读性原理
一个编写良好的计算机程序,他们倾向于引用其他最近引用过的临近数据项的数据项,或者引用过的数据项本身。这种程序具有良好的局部性,这种倾向性称之为局部性原理。
- 时间局部性:被引用过一次的存储器在不远的将来会再次被引用。
- 空间局部性:如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。
在硬件层,局部性原理允许设计设通过引入高速缓存存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。
2.索引的最左匹配特性
当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的。b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。
3.聚集索引和辅助索引
- 相同点:聚集索引和辅助索引内部都是b+树的形式,高度平衡,叶子结点放着所有的数据。
- 不同点:叶子节点是否存放着一整行的信息。辅助索引的叶子结点除了包含键值以外,每个叶子节点的索引行中还包含一个书签(相应行数据的聚集索引键)。书签用来告诉innode搜索引擎去哪里可以找到与索引相对应的行数据。
聚集索引对主键的排序查找和范围查找速度非常快。
4.索引的两大类型hash和btree
- hash类型的索引:单条查询快,范围查询慢
- btree类型的索引:b+树索引,层数越多,数据量指数级增长。
5.存储引擎
- InnoDB:支持事务,支持btree,不支持hash
- MyISAM:不支持事务,支持btree,不支持hash
- memory:不支持事务,支持btree,支持hash
- NDB:支持事务,支持hash,不支持btree
- Archive:不支持事务,不支持btree和hash
6.红黑树的高度
一棵有 n 个内结点的红黑树的高度至多是 2log(n+1),红黑树的高度是O(logN)级别的。
7.构造函数
构造函数没有返回类型,有一个可能为空的构造函数初始值列表,有一个函数体。
构造函数不能被声明为const,因为构造函数要修改类的成员变量。
无参构造函数:如果声明了其他一般构造函数,系统不会再自动生成一个无参构造函数
一般构造函数:可以重载
拷贝构造函数:
委托构造函数:值初始化列表中调用其他构造函数
移动构造函数:使用对象的右值或者将亡值初始化一个对象。经常和move搭配使用。
赋值构造函数:
插入类排序:
- 直接插入排序
线性扫描待排序列,选取每趟第一个待排序元素作为关键字,插入到已经排好的序列的适当位置,直到扫描完成。
//直接插入排序代码
void insertSort(vector<int> &arr) {
int i, j, tmp;
for (i = 1; i < arr.size(); i++) {
j = i-1;
tmp = arr[i];
while (j>=0&&tmp<arr[j]) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = tmp;
}
}
时间复杂度:
最坏的情况下:序列逆序,时间复杂度为O(n2);
最好的情况下,序列已经有序,内层循环不执行,时间复杂度为O(n);
算法平均时间复杂度O(n)
空间复杂度:O(1);
- 折半插入排序
线性扫描待排序列,选取每趟第一个待排元素作为关键字,通过折半查找寻找待插入的位置,然后移动记录插入元素,直到扫描完成。
//写折半查找的递归非递归代码
int binarySearch(const vector<int> &arr,int lo,int hi,int key) {
//折半查找递归代码
if (lo > hi