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

        这是一个简单的哈希表的使用。创建哈希表是使用除数法。解决冲突是利用开地址法中的线性探测再散列法。

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

/***********************************************************************
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));

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

你可能感兴趣的:(数据结构,算法设计)