数据结构与算法笔记 —— 查找算法及代码实现
一. 二分查找
核心思想:将 n 个元素分成个数大致相同的两半,取 a[n/2] 与欲查找的 x 作比较,如果 x=a[n/2] 则找到 x ,算法终止。如果 x<a[n/2] ,则我们只要在数组 a 的左半部继续搜索 x (这里假设数组元素呈升序排列)。如果 x>a[n/2] ,则我们只要在数组a的右 半部继续搜索x.其算法时间复杂度 O(lgn)
//c/c++
int binary_find(int *num,int length,int m){
int sta=0,end = length-1;
int mid;
while(sta <= end){
mid =(sta+end)/2;
if (m > num[mid])sta = mid+1;
else{
if (m < num[mid])end = mid-1;
else return mid;
}
}
return -1;
}
二. 分块查找
核心思想:将要查找的序列分为几块,然后设置好块内关键字及块的终始点,然后先查找块,然后进行块内查找。块之间是排序好的,块内无需排序。
// c/c++
struct block{
int key;
int start;
int end;
}blk[3];
int block_find(int *num,int k){
for(int i=0;i<3;i++){
if(k<=blk[i].key){
int j=blk[i].start;
while(j<=blk[i].end){
if(k!=num[j])j++;
else return j;\
}
}
}
return(-1);
}
三. 哈希查找
核心思想:对于一个序列,先对其进行哈希映射,即使用取余法将序列存入哈希表,然后再进行查找同样进行相同的取余计算,从而获得位置信息,哈希表要主要冲突检测,这里使用的线性再探方式,即如果此位置存储了数据,则探所下一个位置。算法时间复杂度为 O(1)
// c/c++
int key(int num){
return(num%MAX);
}
void create_hash_key(int *hash_table,int num){
int t,pos;
t = key(num);
pos =t;
while(hash_table[t]!=-1 ){
t = (t+1)%MAX;
if(pos == t){
printf("the hashtable has been full!\n");
return;
}
}
hash_table[t] = num;
}
int hash_find(int *hash_table,int num){
int t,pos;
t = key(num);
pos = t;
while(hash_table[t] != -1 && hash_table[t] != num){
t = (t+1)%MAX;
if(pos == t){
printf("not found\n");
return(-1);
}
}
if(hash_table[t] == -1){
printf("not found\n");
return(-1);
}
else return(t);
}