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

本文深入讲解了三种查找算法:二分查找、分块查找和哈希查找。详细介绍了每种算法的核心思想、应用场景及其实现代码。二分查找适用于有序数组,通过不断缩小查找范围提高效率;分块查找则是对数据进行分块处理,先查找块再查找具体位置;哈希查找利用哈希映射快速定位数据,需解决冲突问题。

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


一. 二分查找

核心思想:将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);
}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值