問題の説明]
ハッシュの衝突問題により、一部のキーコードの格納アドレスがハッシュ関数で計算したものと異なる場合があり、その後線形検出法をはじめとする多くの解決策が提案されました。いわゆるリニア検出方式とは、競合が発生した場合、競合位置の次の位置から順に空のハッシュアドレスを検索する方法です。この場合、キーワードを検索する場合は、引き続き調査を行う必要があり、最後にキーコードの格納場所を見つけることができます。次に、このプロセスでのキーコード比較の数をカウントする必要があります。
キーコードのセット(キーコードはすべてゼロより大きい)が与えられた場合、ハッシュテーブルの長さはmaxS、ハッシュ関数はH(キー)= key%diviであり、線形検出方法を使用して競合に対処します。
[入力フォーム] 1行目の2つの整数。最初の1つはハッシュテーブルの長さmaxSを示し、2番目の整数は除数の除数を示します。2行目のキーコードの数、3行目のキーコードセット、およびデータ要素間のスペース分離されます。4行目は、検索されるキーコードを示します。
【出力形式】検索する値のハッシュアドレス。求める値が存在しない場合は-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;
}
以下は少し白いですが、不適切な箇所がある場合は修正してください。