线性探测法的查找函数 整型关键字的散列映射

发布时间 2023-12-15 13:02:42作者: 艾鑫4646

一、 实验目的

掌握哈希表

二、  实验内容

实验题目

线性探测法的查找函数

整型关键字的散列映射

 

 

三、   设计文档

 1.

 

 

 

2.

 

 

 

四、   源程序

  1.

 Position Find( HashTable H, ElementType Key )

{

    int flag=0;

    Position p,q;

    p=Hash(Key,H->TableSize);

    q=Hash(Key,H->TableSize);

    while(H->Cells[p].Data!=Key&&H->Cells[p].Info!=Empty)

    {

        flag++;

        if(flag==MAXTABLESIZE)

        {

            return ERROR;

        }

        p=(q+flag)%H->TableSize;

    }

    return p;

}

 

2.

#include<bits/stdc++.h>

using namespace std;

int main(){

    int n,p,k;

    cin>>n>>p;

    int a[p+10]={0};

    int flag=0;

    while(n--){

        cin>>k;

        int idx=k%p;

        while(a[idx]!=0){

            if(a[idx]==k) break;

            idx++;

            if(idx==p){

                idx=0;

            }

        }

      a[idx]=k;

        if(flag!=0) cout<<" ";

        flag=1;

        cout<<idx;

    }

    return 0;

}

 

 

 

五、  个人体会(此部分与拼题a上主观题提交应一致)

 1.实验中遇到的问题


循环条件是什么?

如果第一次计算哈希值有重复的,怎么找到?

 

2.问题的解决


循环条件检查H->Cells[p].Data!=KeyH->Cells[p].Info!=Empty

线性探测法,用flag追增,如果过了长度(q+flag)%H->TableSize

 

3.实验设计思路


初始化: 初始化两个位置 pq,它们都通过相同的哈希函数计算得出。

循环查找: 进入一个循环,检查哈希表在位置 p 的元素是否与给定的键 Key 匹配。如果不匹配,并且该位置不是空的(即该位置有数据),则继续查找。

冲突处理: 如果在给定的位置没有找到键,并且该位置不是空的,那么算法会尝试在哈希表中寻找下一个可能的位置。这是通过计算 (q + flag) % H->TableSize 来实现的,其中 flag 是一个计数器,用于记录已经查找过的位置数量。如果 flag 达到了 MAXTABLESIZE,那么查找失败,返回错误代码。

返回结果: 如果找到了键,函数返回相应的位置 p。如果没有找到,函数返回一个错误代码。

 

4.实验后的感想


通过本次实验,我深入了解了哈希表查找算法的工作原理和实现细节。我意识到了处理哈希冲突的重要性,以及选择合适的冲突处理方法对算法性能的影响。同时,我也发现了算法中可能存在的问题和改进空间,例如处理哈希冲突时的效率和正确性等方面。

 

1、 实验中遇到的具体问题

 

散列函数的设计?


2、 问题如何解决的

除留余数法是一种简单但有效的散列函数。

 

3. 实验设计思路


输入:

首先,程序接收两个整数输入:n p。其中 n 表示要输入的整数的数量,p 是循环数组的长度。

初始化数组:

程序初始化一个长度为 p+10 的数组 a,并将所有元素初始化为0。这个数组用于存储循环数组的元素。

循环读取整数:

程序进入一个循环,每次循环接收一个整数 k

处理冲突:

对于每个输入的 k,程序首先计算其在循环数组中的索引 idx。这是通过取 k p 的余数来完成的。

接下来,程序检查 a[idx] 是否为0。如果为0,表示该位置是空的,可以直接将 k 存入该位置。

如果 a[idx] 不为0,表示该位置已经被占用。此时,程序会检查 a[idx] 是否等于 k。如果等于 k,表示找到了位置,可以退出循环并存入 k

如果 a[idx] 不等于 k,程序将索引增加1,并检查新的索引位置。如果索引超过了 p,则将其重置为0,继续查找。

输出结果:

一旦找到了位置(或者确定没有找到),程序将位置存入数组 a 中,并输出该位置。注意,在输出位置之前,程序检查 flag 是否为0。如果为0,表示需要输出空格。这样做的目的是确保输出是正确的,因为每个整数可能有多个位置。

4.实验后的感想


通过这个实验,我深入了解了如何设计和实现一个简单的循环数组查找算法,并了解了冲突处理的重要性。在循环数组中,由于元素是循环排列的,所以可能会出现多个元素哈希到同一个位置的情况,即冲突。如果没有正确的冲突处理机制,那么查找算法的效率会大大降低。在这个实验中,我们通过比较当前位置的元素与输入元素是否相等来判断是否找到了位置。如果找到了位置,则跳出循环并存入输入元素;否则,继续查找下一个位置。这种处理方式可以有效地减少冲突的影响,提高查找效率。