一、顺序查找
顺序表或线性链表表示的静态查找表,表内元素之间无序。通过查找的对比的平均比较次数(ASL)来决定算法的查找速度;
直接查找:此算法的思维比较简单,只要一个循环比对,就可以了。实现如
for(i = Arr.length;i<=1;--i)
if(Arr[i] == key) return i;
此算法的平均查找速度,就是1/n*(n*(n-1))/2 = (n-1)/2;即1到n的累加再乘以1/n。
折半查找算法:此算法适合顺序表元素之间具有相对顺序,即从大到小排序或者从小到大排序。
算法思维:将比对的数先跟数组位置为中间的数比对,如果比中间的数大,则往右边的数再进行二分,通过不断缩小比对的范围来查找到最终的值。如下图所示:
算法实现:
设置一个low表示低位置的指针,如初始,low指在数组0的位置;
设置一个high表示高位置的指针,如初始,high指在数组Max的位置,即最后一个元素;
再设置一个mid表示中间元素位置的指针,如初始,mid = (low + high) /2;
通过比对key跟mid指向的值,来查找。
int Search_Bin(SSTable ST,KeyType key){ //SSTable表示顺序表的结构体
low = 0;
high = ST.length;
while(low <= high){
mid = (low + high) /2;
if(ST.R[mid] == key) return mid;
else if(key <ST.R[mid])
high = mid - 1;
else low = mid + 1;
}
return 0;
}
其查找的算法计算可以如下图所示:
分块查找:将表分成几块,然后每块里头数据无序,块间有序。结合下图理解;
算法思维:建立一个索引表,将一个区间的数放到同一块中,进而可以减少查找时比对的次数。
其查找效率入下图所示:
三种算法的比对可如下图所示:
二、散列查找(Hash(哈希)查找)
散列查找,就是选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放,查找时,由同一个函数对给定值k计算地址,将k与地址单元元素关键码进行比对,确定查找是否成功。
构建函数的要求:选择函数尽可能简单,以便提高转换速度;所选函数对关键字计算的地址,应该散列地址集中均匀分布,以减少空间浪费。
查找出现冲突时,应该有对应的冲突解决的规则,又归序地查询其他相关单元。
1. 选择函数的方法有多种,这里介绍的是除留余数法。设置的函数格式如下图所示:
根据顺序表的元素的个数设置足够的内存m,然后将关键字对p进行取模从而放到对应的位置。索取的p<=m且为质数。
2.选取解决冲突的方法,解决冲突的方法同样有多种,如下图所示,这里主要是介绍线性探索法.
线性探索法,主要对取余有冲突的元素对往后空格进行移动 ;结合如下例子进行理解
则其算法的查询平均长度如下:
其中a为填装因子,表示表中的元素量跟表长的比,进而表示表的利用率,如果a越大,表示表中元素填装越满,则发生冲突的可能性就更大。
散列查找的过程如下:
其中二叉排序树的查找跟平衡二叉树可以看以下链接: