實戰資料結構(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));
}
相關文章
- 雜湊表 ADT 開放地址法解決衝突【資料結構與演算法分析 c 語言描述】資料結構演算法
- 演算法與資料結構——雜湊衝突演算法資料結構
- 淺談雜湊法及其解決衝突的方法
- Python:說說字典和雜湊表,雜湊衝突的解決原理Python
- 雜湊衝突詳解
- 雜湊衝突
- 資料結構——雜湊表資料結構
- 資料結構之「雜湊表」資料結構
- 資料結構 - 雜湊表,初探資料結構
- 你還應該知道的雜湊衝突解決策略
- 關於Hash 函式 雜湊索引表 解決位置衝突的問題函式索引
- JAVA資料結構之雜湊表Java資料結構
- 資料結構基礎--雜湊表資料結構
- 資料結構 - 雜湊表,再探資料結構
- Day76.雜湊表、雜湊函式的構造 -資料結構函式資料結構
- JavaScript資料結構——字典和雜湊表的實現JavaScript資料結構
- 資料結構,雜湊表hash設計實驗資料結構
- 【PHP資料結構】雜湊表查詢PHP資料結構
- 資料結構雜湊表(c語言)資料結構C語言
- 資料結構(二十八):雜湊表資料結構
- 資料結構與演算法——雜湊表類的C++實現(探測雜湊表)資料結構演算法C++
- 資料結構與演算法——雜湊表類的C++實現(分離連結雜湊表)資料結構演算法C++
- C語言實現的資料結構之------雜湊表C語言資料結構
- 聊天室原始碼開發中應對雜湊衝突的解決方案原始碼
- 資料結構複習一:雜湊表的總結資料結構
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- 資料結構第十一節(雜湊表)資料結構
- 演算法與資料結構——雜湊表演算法資料結構
- 資料結構 - 雜湊表,三探之程式碼實現資料結構
- 在Java中,HashMap中是用哪些方法來解決雜湊衝突的?JavaHashMap
- 資料結構和演算法-雜湊表 (HashTable)資料結構演算法
- Java關於資料結構的實現:雜湊Java資料結構
- 【資料結構】查詢結構(二叉排序樹、ALV樹、雜湊技術雜湊表)資料結構排序
- 雜湊表(雜湊表)詳解
- 資料結構與演算法整理總結---雜湊表資料結構演算法
- 【面試普通人VS高手系列】HashMap是怎麼解決雜湊衝突的?面試HashMap
- 資料結構與演算法分析-分離連結雜湊表的實現資料結構演算法
- js實現資料結構及演算法之雜湊表(Hashtable)JS資料結構演算法