描述
选取哈希函数H(k)=(3k) MOD 11。用开放定址法处理冲突,其中di=i((7k) MOD 10+1)(i=1,2,3...)。在0~10的散列地址空间中给出的关键字序列构造哈希表,并统计出查找这些关键字的实际比较次数,输出平均查找长度。
输入
关键字序列(关键字总数小于11)
输出
平均查找长度(保留小数点后三位)
输入样例
22 41 53 46 30 13 1 67
输出样例
2.125
#include <iostream>
#include <cstdio>
#include <cstring>
#include<iomanip>
using namespace std;
typedef struct
{
int value;
int clitime; //冲突次数
}DataType;
typedef struct
{
DataType *pdata; //数据域
int HT_len; //哈希表长度
int valnum; //值的个数
}HashTable;
void DisaplayHashTable(HashTable *pHT)
{
int num=pHT->HT_len;
int i, j;
printf("%d", num);
getchar();
printf("哈希表的key为: ");
for(i=0;i<num;i++) printf("%-5d",i);
printf("\n");
printf("哈希表的value为:");
getchar();
for(j=0;j<num;j++) printf("%-5d",pHT->pdata[j].value);
printf("\n");
printf("哈希表的冲突次数:");
for(j=0;j<num;j++) printf("%-5d",pHT->pdata[j].clitime);
printf("\n");
}
void CreateHashTable(HashTable *pHT, int len, int a[], int valnum)
{
//分配HashTable空间
int i;
if((pHT->pdata = new DataType[len]) == NULL)
return;
//初始化哈希表
for(i = 0; i < len; i ++)
{
pHT->pdata[i].value = -1;//数据值初始化为-1
pHT->pdata[i].clitime = 0;//冲突次数都为0
}
//映射哈希表
for(i = 0; i < valnum; i++)
{
int cnt = 1;
int index = (3*a[i]%11), newindex;//映射
int di = (7*a[i])%10+1;//di 为每次再探测时的地址增量
//非冲突
if(pHT->pdata[index].value == -1)
{
pHT->pdata[index].value = a[i];
pHT->pdata[index].clitime = 1;
}
//冲突
else
{
do
{
newindex = (index+di*cnt)%len;
cnt ++;
}while(pHT->pdata[newindex].value != -1);
pHT->pdata[newindex].value = a[i];
pHT->pdata[newindex].clitime = cnt;
}
}
pHT->HT_len = len;
pHT->valnum = valnum;
}
int SearchHashTable(HashTable *pHT, int ifind)
{
int m = pHT->HT_len;
int d, index;
d = index = ifind%m;//初始的Index
while(pHT->pdata[index].value != -1)
{
if(pHT->pdata[index].value == ifind)
return index;
else
index = (index+1)%m;
if(d == index)//说明index已经绕了一圈,即没有找到
return 0;
}
return 0;
}
void HashAvgLen(HashTable *pHT) //求平均查找长度
{
double sum=0;
for(int i=0;i<pHT->HT_len;i++)
sum += pHT->pdata[i].clitime;
sum /= pHT->valnum;
cout << (int)(sum*1000)/1000.0 << endl;
}
int main()
{
int a[100], i=0;
int temp;
while(cin >> temp)
a[i++] = temp;
//printf("%d\n", i);
HashTable H;
int HT_len=11;
CreateHashTable(&H,HT_len,a,i);
//DisaplayHashTable(&H);
HashAvgLen(&H);
return 0;
}