数据结构–搜索–总结
1.(基础要点) 查找的基本概念
- 查找:就是在数据集合中寻找满足某种条件的数据对象。
- 关键码:在每个对象中有若干属性,其中有一个属性,其值可唯一地标识这个对象,称为关键码。
- 静态搜索:搜索结构在插入和删除等操作的前后不发生改变。
- 动态搜索:为保持高的搜索效率,搜索结构在执行插入和删除等操作的前后将自动进行调整,结构可能发生变化。
- 静态:有序查找、折半查找、斐波那契搜索
- 动态:有序查找、折半(跳表)、非线性-树
2.(基础要点) 顺序查找、二分查找、分块查找
2.1 顺序查找
2.2 二分查找
基本思路:设R[low,high]是当前的查找区间,首先确定该区间的中间位置mid=(low+high)/2,然后将待查的k值与R[mid]比较,若相等,则查找成功,返回该位置。否则需要确定新的查找区间。若R[mid]>k,则新的查找区间为[low,…,mid-1],类似地,若R[mid]
2.3 分块查找
又称索引顺序查找。
3.(⭐⭐) 二叉排序树、平衡二叉树、伸展树、红黑树
3.1 二叉搜索树
- 二叉搜索树(Binary Search Tree)定义:二叉搜索树或者是空树,或者是满足以下性质的二叉树:
若它的左子树不空,则左子树上所有关键字的值均小于根关键字的值。
若它的右子树不空,则右子树上所有关键字的值均大于根关键字的值。
左右子树又各是一棵二叉排序树。 二叉搜索树操作
- 查找
- 插入
- 删除:叶子结点直接删除;右子树空用左子女顶替;左子树空用右子女顶替;左右子树都非空在右子树上找中序下第一个结点填补。
二叉搜索树性能分析
3.2 平衡二叉树
- 平衡二叉树(AVL树):一种特殊的二叉排序树,左右子树都是平衡二叉树,且左右子树高度之差的绝对值不超过1.
(先发明的二叉排序树,实现了较高的查找效率。后来发现基于这种查找方法,树越矮查找效率越高) 平衡因子:该结点右子树的高度减去左子树的高度所得的高度差,称为平衡因子。
AVL树操作
- AVL树的平衡化(耐心搞清楚,一点都不难)
- AVL树的插入、删除
- AVL树的平衡化(耐心搞清楚,一点都不难)
3.3 伸展树
伸展树(Splaying Tree)是另一种提高搜索效率的方法,主要考虑的因素是结点被访问的频率。其思路是:每当访问(搜索、插入、删除)一个结点s时,伸展树就执行一次“展开”,将结点s移到二叉搜索树的根部。
伸展树操作:搜索
3.4 红黑树
4.(⭐) B-树、B+树
4.1 B树
- B树基本概念
-
- B树基本操作
4.1 B+树
B+树是B-树的一种变形。
B+树和B-树的区别:
1)分支数:B+树n个关键字的结点有n个分支;B-树n个关键字的结点有n+1个分支。
2)关键字个数:
3)叶节点是否包含信息:B+树叶子结点包含信息
4)B+树中非叶子结点仅起一个索引的作用
5)。。
5.(⭐⭐⭐) 散列表
根据给定的关键字来计算出关键字在表中的地址。
散列中最重要的两部分: 确定散列函数,以及解决冲突问题
5.1 确定散列函数
5.2 解决冲突
解决冲突:当一个元素要插入时,此前已有插入的元素散列,那么就会产生一个冲突,这个冲突必须要消除。解决冲突有两种方法:开放定址法、分离链接法
开放定址法(包含线性探測,平方探測,双散列等)
分离链接法:将散列到同一个值的全部元素保留到一个链表中