数据结构篇_编程思想板块_第六章查找
编程思想板块最主要的内容是数据结构经典题目及解答题目所需的编程思想,愿对您能有所帮助
六、查找
1)答题(画图)格式
| 答题(画图)格式 | |
|---|---|
| 判定树 | ![]() |
| 散列表 | ![]() |
| 冲突解决的拉链法 | ![]() |
2)折半查找
- 当有一组集合查找概率不一样时:
① 若用链式存储结构:除了可以使用顺序查找外,还可以构造二叉排序树的形式,采用二叉链表存储结构构造二叉排序树
3)分块查找
- 易错点:对索引表进行折半查找时,若索引表中不包含目标关键字,则折半查找最终停在low>high,要在low所指分块中查找
4)B树
(1)B树查找
- 思想:
① 通过“查找”确定插入位置(一定是在终端结点)
② 若插入后结点关键字个数未超过上限,则无需做其他处理
③ 若插入后结点关键字个数未超过上限,则无需做其他处理
④ 若插入后关键字个数超过上限,则需要将当前结点的中间元素放到父节点中,当前结点分裂为两个部分;该操作会导致父节点关键字个数+1,若父节点关键字个数也超过了上限,则需要再向上分裂;根节点的分裂会导致B树高度+1
(2)B树删除
- 若删除的是非终端结点关键字:
① 用其直接前驱或直接后继替代其位置,转化为对“终端结点”的删除
② 直接前驱:当前关键字左边指针所指子树中“最右下”的元素
③ 直接后继:当前关键字右边指针所指子树中“最左下”的元素
- 若删除的是终端结点:
① 删除后结点关键字个数未低于下限,无需任何处理
② 低于下线:
(1) 右兄弟够借,则用当前结点的后继、后继的后继依次顶替空缺
(2) 左兄弟够借,则用当前结点的前驱、前驱的前驱依次顶替空缺
(3) 左(右)兄弟都不够借,则需要与父结点内的关键字、左(右)兄弟进行合并。合并后导致父节点关键字数量-1,可能需要继续合并
5)散列表
1. 题目:数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数字。读者也许会想到先进行排序,位于位置(n+1)/2的数即为要找的数,这样最小时间复杂度就为O(nlogn);若进行散列查找,数字的范围又未知,那么应如何将时间复杂度控制在O(n)内呢?
算法思想:出现的次数超过数组长度的一半,表明这个数字出现的次数比其他数字出现的次数的总和还多。所以我们可以考虑每次删除两个不同的数,则在剩下的数中,待找数字出现的次数仍然超过总数的一半。通过不断重复这个过程,不断排除其他的数字,最终剩下的都为同一个数字,即为要找的数字)




浙公网安备 33010602011771号