这是一个简单的哈希表的使用。创建哈希表是使用除数法。解决冲突是利用开地址法中的线性探测再散列法。
简单的一个例子: 再次证明算法和数据结构是分不开的。
/*********************************************************************** 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)); }
哈希表的使用--开地址法解决冲突,布布扣,bubuko.com
原文:http://blog.csdn.net/lynnbest/article/details/20958897