【学习总结】《大话数据结构》- 第8章-查找
【学习总结】《大话数据结构》- 总
第8章查找-代码链接
启示:
-
查找(Searching)
查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
目录
- 8.1 开场白
- 8.2 查找概论
- 8.3 顺序表查找
- 8.4 有序表查找
- 8.5 线性索引查找
- 8.6 二叉排序树
- 8.7 平衡二叉树-AVL树
- 8.8 多路查找树-B树
- 8.9 散列表查找-哈希表-概述
- 8.10 散列函数的构造方法
- 8.11 处理散列冲突的方法
- 8.12 散列表查找实现
- 8.13 总结回顾
- 8.14 结尾语
========================================
8.1 开场白
- 一些可以略过的场面话...
========================================
8.2 查找概论
-
定义
-
查找(searching):
- 查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。
-
查找表(search table):
- 由同一类型的数据元素(或记录)构成的集合。如下图的表。
-
关键字(key):
- 数据元素中某个数据项的值,又称为键值,可以标识一个数据元素。
- 也可以标识一个记录的某个数据项(字段),称为关键码。
- 如图圈1和2。
-
主关键字(primary key):
- 若此关键字可以唯一地标识一个记录,则称此关键字为主关键字。
- 对于不同记录,其主关键字均不相同。
- 主关键字所在的数据项:称为主关键码。如图圈3和4。
-
次关键字(secondary key);
- 那些可以识别多个数据元素(或记录)的关键字,称为次关键字。
- 次关键字对应的数据项:次关键码。如图圈5。
- 次关键字是不以唯一标识一个数据元素(或记录)的关键字。
-
注:“字”-数据项的值;“码”-数据项本项,或称为“字段”,即数据的“统一名称”
-
-
查找结果:
- 若表中存在这样一个记录,则是查找成功,查找结果给出整个记录的信息,或指示该记录在查找表中的位置。
- 若表中不存在关键字等于给定值的记录,则是查找不成功,查找结果可给出一个“空”记录或“空”指针。
-
分类:静态查找表和动态查找表
-
查找表按照“操作方式”分为两大类:静态和动态。
-
静态查找表:通常理解的“查找”
-
-
动态查找表:广义的“查找”,找到并操作或找不到并操作
- 例如:新词汇收录:找不到并插入;违规用户:找到并删除。
-
查找结构:
-
面向查找操作的数据结构称为查找结构。
-
========================================
8.3 顺序表查找
-
顺序查找定义:
-
顺序表查找算法:
-
顺序表查找优化:
-
顺序查找分析:
-
缺点:效率极为低下
-
优点:对静态查找表的记录没有任何要求,小型数据查找时很适用
-
查找概率不同的特性:将容易查找到的记录放在前面,不常用的放在后面,可以大幅提高效率。
-
========================================
8.4 有序表查找
-
折半查找
-
定义
-
-
代码实现
-
图示解析
-
时间复杂度:O(logn)
- 对于排序好的静态查找表比较适用
- 如果是频繁插入删除的动态查找表,维护有序是不小的工作量,就不太适用了。
-
插值查找
-
定义
-
-
改进推导
-
时间复杂度:O(logn)
-
斐波那契查找
-
代码实现
-
-
图示解析
-
分析
-
时间复杂度:O(logn)
-
三种方法对比
========================================
8.5 线性索引查找
-
引入
-
数据结构的最终目的:提高数据的处理速度。
-
索引:为了加快查找速度而设计的一种数据结构。
-
索引定义:把一个关键字与它对应的记录相关联的过程。
-
-
稠密索引
-
定义:
- 稠密索引是值在线性索引中,将数据集中的每个记录对应一个索引项。
- 对于稠密索引的索引表来说,索引项一定是按照关键码有序的排列。
-
-
图示:
-
优缺点分析:
- 索引项按照关键码有序排列,因此可以使用折半等查找方式提高效率
- 索引项与数据集的记录个数相同,空间代价很大。
- 数据集非常大时,需要同样数据量的索引,反复访问磁盘,反而降低了查找效率。
-
分块索引
-
分块有序
-
-
分块索引
-
分块索引表的查找
-
复杂度分析
-
倒排索引
-
引例
-
-
定义
-
优缺点分析
- 优点:查找记录非常快。
- 缺点:记录号不定长,维护困难,插入删除都需要作相应的处理。
========================================
8.6 二叉排序树
-
定义
-
二叉排序树查找
-
代码实现
-
-
解析
-
二叉排序树插入
-
插入代码
-
- 注:根据上一段代码,查找不成功时,p指向最后一个结点。
-
利用插入代码创建二叉树
-
二叉排序树删除
-
删除分析:
-
-
删除代码:
-
代码解析:
-
二叉排序树总结
========================================
8.7 平衡二叉树-AVL树
-
相关定义
-
平衡二叉树(AVL树)
-
-
最小不平衡子树
-
平衡二叉树实现原理
-
平衡二叉树构建的基本思想
-
-
构建图示
-
平衡二叉树实现算法
-
改进二叉排序树的结点结构
-
-
右旋操作
-
左旋操作
-
左平衡旋转处理代码
-
主函数代码
-
代码分析
-
时间复杂度分析
========================================
8.8 多路查找树-B树
-
多路查找树引入
-
2-3树
-
定义
-
-
插入操作
-
删除操作
-
2-3-4树
-
B树
-
B+树
========================================
8.9 散列表查找-哈希表-概述
========================================
8.10 散列函数的构造方法
========================================
8.11 处理散列冲突的方法
========================================
8.12 散列表查找实现
========================================
8.13 总结回顾
========================================