您的位置:首页 > 理论基础 > 数据结构算法

实战数据结构(10)_哈希表的使用--开地址法解决冲突

2014-03-10 23:00 381 查看
        这是一个简单的哈希表的使用。创建哈希表是使用除数法。解决冲突是利用开地址法中的线性探测再散列法。

简单的一个例子: 再次证明算法和数据结构是分不开的。

/***********************************************************************
Hash_table的使用
哈希表的创建	key-value
哈希表值显示
开地址法解决冲突问题---线性探测再散列法
*********************************************************************/
#include <stdio.h>
//数据结构
typedef struct
{
int Value;	 // value
int clitime; //冲突次数
}DataType;

typedef struct
{
DataType *pdata; //数据域
int HT_len;		// 哈希表长度
int valnum;		//值的个数
}HashTable;

//哈希表的创建
void CreateHashTable(HashTable *pHT,int HT_len,int a[],int valnum,int p)
{
//分配hashtable空间
pHT->pdata=new DataType[HT_len];
if(NULL== pHT->pdata)
return ;
//初始化哈希表
for(int i=0;i<HT_len;i++)
{
pHT->pdata[i].Value=-1;  //将数据域全部初始为 -1
pHT->pdata[i].clitime=0; //冲突次数 都为 0
}
// 映射哈希表
for(int j=0;j<valnum;j++)
{
int sum=0;	//线性探测 基数 1
int index=a[j]%p; //哈希函数 用值获取 index
if(pHT->pdata[index].Value == -1){
pHT->pdata[index].Value=a[j];
pHT->pdata[index].clitime=1;
}
else
{ do{
index=(index+1)%p;
//pHT->pdata[index].clitime++; //这样会改变原来index下冲突值
sum += 1;
}while(pHT->pdata[index].Value != -1);
pHT->pdata[index].Value=a[j];
pHT->pdata[index].clitime=sum+1;
}
}
pHT->HT_len=HT_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 DisaplayHashTable(HashTable *pHT)
{
int num=pHT->HT_len;
printf("哈希表的key为:   ");
for(int i=0;i<num;i++)
printf("%-5d",i);
printf("\n");
printf("哈希表的value为:");
for(int j=0;j<num;j++)
printf("%-5d",pHT->pdata[j].Value);
printf("\n");
printf("哈希表的冲突次数:");
for(int j=0;j<num;j++)
printf("%-5d",pHT->pdata[j].clitime);
printf("\n");
}
double HashAvgLen(HashTable *pHT) //求平均查找长度
{
double sum=0;
for(int i=0;i<pHT->HT_len;i++)
sum += pHT->pdata[i].clitime;
sum /= pHT->valnum;
return  sum;
}

void main()
{
int a[]={23,35,12,56,123,39,342,90};
HashTable H;
int HT_len=11;
CreateHashTable(&H,HT_len,a,sizeof(a)/sizeof(int),HT_len);
DisaplayHashTable(&H);
int  ifind=123;
int pos = SearchHashTable(&H,ifind);
printf("%d在hashtable中索引为%d\n",ifind,pos);
printf("平均查找长度%.1f\n",HashAvgLen(&H));

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: