4C的练习5-39 整型关键字的散列映射 <线性探测法>

线性探查法
该方法的基本思想是:
将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则最长的探查序列为:
d,d+l,d+2,…,m-1,0,1,…,d-1
即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止.
探查过程终止于三种情况:
(1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);
(2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;

(3)若探查到T[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满).

当时想了好久,以为是像哈希一样的、错误了好多次,原来是因为不知道什么是线性探测法

理解:意思是给一个数%M,这个位置是否已经有数占领,如果有的话,就寻找下一个位置,也就是这个数%M+1,如果这个数大于M,又从头0开始,直到找到一个位子可以放数进去。

顺便复习了一下hash的使用,hash是通过一个个数组储存%后的关键字进行查找,但是数组存的还是完整的那个数

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int next[500];
int head[500];
int st[500];
int try1(int x){
    int u=st[x]%107;
    int v=head[u];
    while(v){
        if(st[v]==st[x])return 0;
        else v=next[v];
    }
    next[u]=head[u];
    head[u]=x;;
}
int main(){
    //freopen("in.txt","r",stdin);
    int i,j,k,l1,l2,f1,f2,f3,t1,t2,t3;
    memset(next,0,sizeof(next));
    memset(head,0,sizeof(head));
    t1=1;
    while(cin >> f1){
            st[t1]=f1;
        if(try1(t1)){
            t1++;
    cout << "插入成功"<<endl;
        }else{
    cout << "插入失败" << endl;
        }
    }

    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值