线性探测解决冲突----求哈希地址

问题描述】
由于散列中存在冲突问题,所以有些关键码的存储地址并不是和散列函数计算的一样,后来提出很多解决方法解决冲突,其中线性探测法就是一种。所谓线性探测法就是当发生冲突时,从冲突位置的下一个位置起,依次寻找空的散列地址。这种情况下如果想要查找某个关键字,就要不断探测,最终才可以找到关键码的存储位置,如今需要统计这个过程中的关键码对比次数。
已知关键码集合(关键码均大于零),散列表表长为maxS,散列函数为H(key)= key %divi,用线性探测法处理冲突。
【输入形式】第一行两个整数,第一个表示散列表表长maxS,第二个表示除数divi;第二行关键码的个数;第三行关键码集合,数据元素之间用空格隔开;第四行表示要查找的关键码key。
【输出形式】待查找值的哈希地址。如果待查找值不存在,则输出-1。
【样例输入】
11 11
9
47 7 29 11 16 92 22 8 3
3
【样例输出】6

分析:
1 .创建一个哈希数组
2 .写一个存入哈希的函数 把输入的数据存入哈希数组里
3 .在哈希数组中查询 输出结果

实现

创建存入哈希数组的函数

void Insert (int maxS,int divi,int k,int ht[])
{//maxS 数组长度 divi 除数 k 要存入的数 ht[] 哈希数组
    int j;
    j=k%divi;
    if(ht[j]==0)//为 0 说明 没有存放数据
        ht[j]=k;
    else if(ht[j]!=0) //有数据 
    {
        int i=j;
        while(ht[i]!=0)
        {
            i=(i+1)%maxS;//利用线性探测 每次加一 
        }
        ht[i]=k;
    }
}

查询下标的函数

int Search (int maxS,int divi,int k,int ht[])
{//这里的k和上面的k不同 这个 k 为关键码(key 要查询的数)
    int j;
    j=k%divi;
    int i=j;
    int cnt=0;
    while(ht[i]!=0&&cnt<maxS)//防止因查找不到而死循环
    {
        cnt++;//每次循环 计数器加一
        if(ht[i]==k)
            return i;//找到返回下标
        else
        {
            i=(i+1)%maxS;
        }
    }
    return -1;//如果未找到 返回-1
}

主函数

int main()
{
    int maxS,divi,n,k;
    cin>>maxS>>divi;
    cin>>n;
    int ht[maxS]={0};
    int a[n];
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    cin>>k;
    for(int k=0;k<n;k++)
    {
        Insert(maxS,divi,a[k],ht);//将输入的数据存入哈希数组当中
    }
    cout<<Search(maxS,divi,k,ht)<<endl;

}

在下是一名小白 如果有不恰当的地方 欢迎指正

发布了31 篇原创文章 · 获赞 8 · 访问量 2155

猜你喜欢

转载自blog.csdn.net/weixin_44034024/article/details/105068669