1.检索
1.1概述
1.1.1定义
文字描述:
试图在一组记录中找到具有某个关键码值的记录,或者找到关键码值符合某些条件的一些记录,例如关键码值在某个值的范围内。
形式化定义
假定有一个包含n条记录的集合L,形式如下:
(K1,L2),(K2,L2),(K3,L3),…,(Kn,Ln)
其中Lj 是与关键码值Kj相关联的信息,1≤j≤n。给定某个关键码值K,检索问题就是在C中定位记录(Ki,Li),使得KI=K。检索为题就是定位关键码值Kj=K的记录的系统化方法
1.1.2分类
检索分类
- 精确匹配检索
- 范围查找检索
检索算法分类
- 顺序表和线性表方法
- 根据关键码值直接访问方法(散列法)
- 树索引方法
1.1.3适用范围
- 线性表:大多数适用于序列
- 线性表、自组织线性表、集合检索:存储在RAM中的一组记录
- 散列:记录存储在RAM或磁盘中
- 基于树(B树):存储在磁盘的大量记录
注:散列方法只能用于精确匹配查询,而且一般只有在关键码值不允许重复的情况下适用
当散列方法不合适,基于动态磁盘的应用程序就可以选择B树方法。
1.2检索未排序和已排序的数组
1.2.1未排序
顺序检索算法
Θ(n)
1.2.2已排序
1.2.2.1跳跃检索
1.2.2.2字典检索
1.2.2.3二次二分检索
1.3自组织线性表
1.4集合检索
1.5散列方法
1.5.1基本概念
概念 | 定义 |
---|---|
散列 | 根据关键码值直接访问表。通过一些计算,把关键码值映射到数组中的位置来访问记录 |
散列函数 | 把关键码值映射到位置的函数,h |
散列表 | 存放记录的数组,HT |
槽slot | 散列表的一个位置 |
冲突collision | 对于一个散列函数h和两个关键码值k1,k2,如果h(k1)=β=h(k2),其中β是表中的一个槽,那么就说k1和k2对于β在散列函数h下有冲突 |
适用范围
- 不适用于允许多条记录有相同关键码值的应用程序。
- 不适用于范围检索
- 适用于基于主存的检索,适合基于磁盘的检索。
- 组织存储在磁盘上的大型数据库的两种方法:散列表、B树
散列表查找过程
- 计算表的位置h(K)
- 从槽h(K)开始,使用(如果需要)** 冲突解决策略(collision resolution policy)** 找到包含关键码值的记录
1.5.2散列函数
- (1)直接定址法:
取关键字或关键字的某个线性函数值为哈希地址:H(key) = key 或 H(key) = a·key + b
其中a和b为常数,这种哈希函数叫做自身函数。
注意:由于直接定址所得地址集合和关键字集合的大小相同。因此,对于不同的关键字不会发生冲突。但实际中能使用这种哈希函数的情况很少。
- (2)相乘取整法:
首先用关键字key乘上某个常数A(0 <