开放定址法处理冲突

描述
选取哈希函数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;
}


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值