顺序查找
一个接着一个找,最简单的遍历,以顺序表或线性链表表示静态查找表,假设数组0号单元留空。算法如下:
int SqlSearch1(int r[], int n, int k)
{
i = n;
while(i > 0 && r[i] != k)
{
i--;
}
return i
}
此算法每次循环都要判断数组下标是否越界,改进方法:加入哨兵,将目标值赋给数组下标为0的元素,并从后向前查找。改进后算法如下:
int SqlSearch2(int r[], int n, int k)
{
r[0] = k;
i = n;
while(r[i] != k)
{
i--;
}
return i
}
顺序查找特点
- 优点:对表中记录没有任何要求,顺序存储和链式存储都可以;对表中记录有序性没有要求
- 缺点:平均查找长度较大,特别时表长较长时,效率很低。
折半查找
使用条件
- 必须采用顺序存储结构
- 线性表中的记录必须有序
基本思想
在有序表中,取中间的记录作为比较对象,若给定的值和中间的值相等,则查找成功;若给定的值小于中间的值,则在中间记录的左边继续找;否则在右边继续找。重复上面的过程。
代码实现
int BinSearch1(int r[], int n, int k)
{
// 假设查找集合从1开始
low = 1;
high = n;
while(low <= high)
{
mid = (low + high) / 2;
if(k < r[mid])
{
high = mid - 1;
}
else if(k > r[mid])
{
low = mid + 1;
}
else
return mid;
}
return 0;
}
int BinSearch2(int r[], int low, int high, int k)
{
// 假设查找集合从1开始
if(low > high)
return 0;
else
{
mid = (low + high) / 2;
if(k < r[mid])
{
return BinSearch2(r,low,mid-1,k);
}
else if(k > r[mid])
{
return BinSearch2(r,mid+1,high,k);
}
else
return mid;
}
}
折半查找判定书
折半查找的过程可以用BST来描述,树中每个结点对应有序表中的一个记录。通常将这棵树叫做折半查找判定书。
例子:1-10共十个数,进行折半查找。
第一层:(1-10)中间数5
第二层:(1-4)中间数2;(6-10)中间数8
第三层:1,3,6,9
第四层:4,7,10
查找成功和失败分析
二叉排序树的查找
详见https://blog.csdn.net/tsfx051435adsl/article/details/100155133
和https://blog.csdn.net/tsfx051435adsl/article/details/100154504
散列表(哈希表)查找
散列的基本思想:在记录的存储地址和它的关键吗之间建立一个函数关系。这样不经过比较,一次读取就能得到所查找的元素。
这里的H就是哈希函数(也叫散列函数)。
所以散列技术关键问题有:
- 散列函数的设计。怎么找到一个简单、均匀、存储利用率高的函数。
- 冲突的处理。如果key1和key2经过散列函数算出来的存储地址相等了,那么就冲突了,冲突该怎么办。