查找概念
-
查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。
-
关键字(Key)是数据元素中某个数据项的值,又称为键值。可以标识一个数据元素,也可以标识一个记录中的某个数据项。
若关键字可以唯一标识一个记录,则称为此关键字为主关键字(Primary Key)
可以识别多个数据元素(或者记录)的关键字,我们称为次关键字(Secondary Key)
**查找(Searching)**就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或者记录)
静态查找表(Static Search Table):只作 查找操作 的 查找表(可以考虑线性表结构来组织数据)
- 查询某个“特定的“数据元素是否在查找表中
- 检索某个”特定的“数据元素喝各种属性
动态查找表(Dynamic Search Table):在查找过程中同时插入表中不存在的数据元素,或者从查找表中删除已经存在的某个元素(可以考虑二叉排序树的查找技术)
- 查找时插入数据元素
- 查找时删除数据元素
顺序表查找
**顺序查找(Sequential Search)**又叫线性查找,是最基本的查找技术 , 它的查找过程是:从表中第一个(或最后一个)记录开始,逐步进行记录的关键字喝给定值比较,若某个记录的关键字喝给定值相等,则查找成功;如果直到最后一个(或第一个)记录,其关键字和给定值比较都不等时,查找不成功。
查找算法
/* 定义 a 的元素值下标从1开始 */
int SequentialSearch(int *a,int n,int key)
{int i;a[0]=key;i=n;while(a[i] !=key){i--;}return i; /*返回0则说明查找失败了*/
}
有序表查找
折半查找
折半查找(Binary Search)技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序) ,线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所以查找区域无记录,查找失败为止。
// 假设我们现在有这样一个有序裴数组{0,l,16,24,35,47,59,62,73,88,99}
// 除 0 下 标外共 10 个数字 对其进行查找是否存在 62 这个数
/* 折半查找 */
int BinarySearch(int *a,int n ,int key)
{int low,high,mid;low=1; /* 定义最低下标为记录首位 */high=n; /* 定义最高下标为记录末位 */while(low<high){mid=(low+high) /2; /* 折半 */if(key < a[mid]) /* 若查找值比中值小 */hight=mid-1; /* 最高下标调整到中位下标小一位 */else if (key > a[mid]) /* 若查找值比中值大 */low=mid+1; /* 最低下标调整到中位下标小一位 */else return mid; /* 若相等,则说明mid即为查找到的位置 */}return 0;
}
插值查找
折半查找代码的第11行,略微等式变换:
m i d = l o w + h i g h t 2 = l o w + 1 2 ( h i g h − l o w ) mid=\frac{low+hight}{2} = low+\frac{1}{2}(high-low) mid=2low+hight=low+21(high−low)
也就是 mid 等于最低下标low加上最高下标 high 与 low的差的一半。
m i d = l o w + k e y − a [ l o w ] a [ h i g h ] − a [ l o w ] ( h i g h − l o w ) mid = low+\frac{key-a[low]}{a[high]-a[low]}(high - low) mid=low+a[high]−a[low]key−a[low](high−low)
只需要在折半查找算法的代码中更改一下第 11行代码如下 :
mid = low + (high-low)*(key -a[low])/(a[high]-a[low]); /* 插值 */
插值查找(Interpolation Search)是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心在于插值的计算公式 k e y − a [ l o w ] a [ h i g h ] − a [ l o w ] \frac{key-a[low]}{a[high]-a[low]} a[high]−a[low]key−a[low]