查找表分析(总论)
?
? 本来准备用一个文章来写关于查找表这一块的,结果发现内容实在太多了,所以现在决定分为以下三部分进行.? ?
?
?
?
? ?具体查找表特征分析:?
?
? ? ? 静态查找表中
? ? ? ? ?按存储结构: ? ?可以分为顺序结构和链式结构
?? ? ? ? 按元素的有序性:可以分为有序表和无序表
? ? ? ? ?无序表和链式表的查找方式,都需要遍历整个表进行比对,而顺序结构的有序表,可以通过折半查找算法来实现(具体算法/算法性能比较等参见静态表一节)
? ? ? ? ? 分有块序表:将表分成几块,块内无序,块间有序;先确定待查记录所在块,再在块内查找。索引顺序查找:又称分块查找
?
? ? ?动态查找表
? ? ? ? ? 特点:表结构本身是在查找过程中动态生成。若表中存在其关键字等于给定值key的记录,表明查找成功;否则插入关键字等于key的记录。
? ? ? ? ?动态生成二叉排序树(二叉查找树)--------平衡二叉树--------B-树B+树
? ? ? ? (本节主要是各种树的查找,增加,删除等操作的算法实现,放在最后实现)
?
? ? ? ? Hash表:
? ? ? ? ? ? 1)?? 哈希(Hash)函数是一个映象,即: 将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可;
? ? ? ? ? ? 2)? 由于哈希函数是一个压缩映象,因此,在一般情况下,很容易产生“冲突”现象,即:key11 key2,而? f(key1) = f(key2)。
? ? ? ? ? ? 3).? 只能尽量减少冲突而不能完全避免冲突,这是因为通常关键字集合比较大,其元素包括所有可能的关键字,而地址集合的元素仅为哈希表中的地址值
? ? ? ? ? ? ?因此,在构造这种特殊的“查找表” 时,除了需要选择一个“好”(尽可能少产生冲突)的哈希函数之外;还需要找到一种“处理冲突” 的方法。
?
? ? ? ? ? 2. 哈希函数构造的方法:
?
- ?
- 直接定址法
- 数字分析法
- 平方取中法
- 折叠法
- 除留余数法
- 随机数法
? ? ? ? ?3. 处理冲突的方法 :
?? ? ? ? ? ? “处理冲突” 的实际含义是:为产生冲突的关键字寻找下一个哈希地址。
? ? ? ? ? 1.开放定址法
? ? ? ? ? ? 2.再哈希法
? ? ? ? ? ? 3.链地址法
?
?
下一节先实现Hash表,然后模仿JDK中的HashMap自己山寨一份
?