實戰資料結構(10)_雜湊表的使用--開地址法解決衝突

YunShell發表於2014-03-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));

}


相關文章