定义
查找又称为检索或者是搜索,是指从一批记录中找出满足条件的某一个记录的过程。
分类
- 简单查找
- 二叉树排序树
- 索引查找
- 哈希表
简单查找
顺序查找
(以线性表为基础,静态查找)
从线性表的一端开始,依次将每个记录的关键字与给定值进行比较,若某个记录的关键字等于给定值,表示查找成功,返回记录序号;若所有记录查找完成,仍然未找到与关键字匹配的字段,则表示查找失败,返回一个失败值。
关键代码段
for (int i = 0; i < n && a[i] != key; i++)
;
if (i < n)
return i;
else
return -1;
折半查找
又称二分查找。这种查找方法要求查找表的数据时线性结构存储,并且要求查找表中的数据是按照关键字由小到大有序排列。
关键代码段
int left ,right,mid;
while(left<=right){
mid =(left+right)/2;//计算中间位置
if(arr[mid]==key) //中间位置与关键字相等
return mid; //返回序号
else if(arr[mid]>key)//中间位置大于关键字
right = mid -1; //重新定义查找范围
else //中间位置小于于关键字
left = mid + 1;//重新定义查找范围
}
二叉树排序树
(以线性表为基础,动态查找)
特性:二叉排序树或者是一棵空树,或者具备以下特性的二叉树
- 若它有左子树,则左子树上所有结点的数据均小于根结点的数据
- 若它有右子树,则右子树上所有结点的数据均大于根结点的数据
- 左,右子树本身又各是一棵二叉排序树
索引查找
索引查找是在索引表和主表(即线性表的索引存储结构)上进行的查找。索引查找的过程是:首先根据给定的索引值K1,在索引表上查找出索引值等于K1的索引项,以确定K1对应的子表在主表中的开始位置和长度,然后再根据给定的关键字K2,在对应的子表中查找出关键字等于K2的元素(结点)。
哈希表
概念
以线性表中每个元素的关键字key为自变量,通过一定的函数关系h(key)计算出函数的值,把这个值作为数组的下边,将元素存入对应的数组元素中。
函数h(key)称为哈希函数,函数的值称为哈希地址,这种方式创建的表称为哈希表。
- 直接定址法:关键字本身或者和某些数字一起,要求关键字连续(例如:学号)
- 除数取余法:key%x
- 数字分析法:(例如:身份证)
- 平方取中法:
- 折叠法: 拆分成长度相同的几段,然后再相加。
等等
处理冲突
开发地址法:线性探测法和双哈希函数探测法
- 线性探测法:从发生冲突的单元起,往后查找,找到未存数据的单元,保存冲突数据
- 双哈希函数探测法:如果有冲突,再设计一个哈希函数,重新计算。
链接法
通过关键字计算后,有冲突,在冲突的单元上添加指针,指向一个新的内存空间