数据结构与算法笔记 —— 查找算法及代码实现

数据结构与算法笔记 —— 查找算法及代码实现

一. 二分查找

核心思想:将 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);
}
    原文作者:查找算法
    原文地址: https://blog.csdn.net/horizontalview/article/details/51254482
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞