静态查找表:
1.顺序查找表:从线性表一端开始扫描,将扫到的关键字与给定值比较,相同则查找成功
2.有序表查找:若线性表有序,则可以折半查找。折半查找升级版为插值查找,及不取1/2处。斐波那契查找,也是折半查找的变种
3.索引顺序表查找:效率介于1)2)之间。又称分块查找。块与块之间有序,块内无序。实际进行两次查找,第一次折半查找,第二次顺序查找
动态查找表:相比于静态查找表,查找过程中会修改元素
1.构造查找树:
二叉查找树:
1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3)任意节点的左、右子树也分别为二叉查找树。
4)没有键值相等的结点
23树:二叉查找树的升级版:往三结点插入元素需要将三节点裂成二结点
红黑树:是23树的简化版,红链链接3node黑链链接2node,查找方法同一般二叉查找树
b树:堆23树的进一步升级
m阶B树的定义如下:
1. 根节点至少包括两个孩子;
2. 树中每个节点最多含有m个孩子(m>=2);
3. 除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子(ceil()为向上取整);
4. 所有叶子节点都位于同一层;
5. 每个非叶节点包括n个关键字信息,其中ceil(m/2)-1<=n<=m-1。
b+树:与b树相比主要区别在于只有叶结点存放信息,非叶结点只起索引作用。所有的叶子结点和相连的节点使用链表相连,便于区间查找和遍历
B+ 树的优点在于:
1.由于B+树在内部节点上不好含数据信息,因此在内存页中能够存放更多的key。 数据存放的更加紧密,具有更好的空间局部性。因此访问叶子几点上关联的数据也具有更好的缓存命中率。
2.B+树的叶子结点都是相链的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元
素可能在内存中不相邻,所以缓存命中性没有B+树好。
B树也有优点:由于B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。
hash查找:
构造哈希函数:
1)直接定址(整型)
2)数字分析法
3)平方取中法
4)取余法
5)折叠法:将关键字分块折叠
6)减去法:关键字减特定变量
7)基数转化法:关键字变为其他进制
8)伪随机数法:用伪随机函数
冲突的处理:
1)开放地址法:
线性探测法:若重复,在哈希表中遍历空缺位置并插入。缺点:①会堆聚,即冲突比较频繁的话哈希表就会乱②如果删除元素会导致计算机以为一定找不到对应元素③处理溢出不方便
线性补偿探测法:线性探测法的改进,遍历时步长不选一,选为n
伪随机探测:另一种改进方法,步长由伪随机函数确定
2)链地址法:
3)再哈希法:有冲突时再哈希一次,一直到无冲突
4)建立公共溢出区:将所有有冲突的放在哈希表外,为其建立公共溢出区