使用分離鏈結法實現雜湊表時需要額外的空間來儲存指標,而且需要給新單元動態分配空間,導致演算法的速度減慢。開放定址法一次分配表的大小,可以使用線性雜湊,平方雜湊,雙重雜湊等等方法,這些方法除了雜湊函式不相同之外,對於雜湊表的大小要求也不一樣。平方雜湊需要使表的大小是儲存元素的兩倍以上,這樣總能找到空槽來存放產生衝突的元素。(演算法導論上有詳細證明。)
下面程式使用的是平方探測雜湊:
/*
* hash.h
* * created on: dec 12, 2016
* author: csf
*/#ifndef hash_h_
#define hash_h_
#define maxtablesize 200
#define mintablesize 1
typedef unsigned int index;
typedef index position;
typedef int elementtype;
struct hashtbl;
typedef struct hashtbl *hashtable;
int isprime(int x);
int nextprime(int y);
int hash(elementtype key,int tablesize);
hashtable initializetable(int tablesize);
void destroytable(hashtable h);
position find(elementtype key,hashtable h);
void insert(elementtype key,hashtable h);
elementtype retrieve(position p,hashtable h);
int delete(elementtype key,hashtable h);
hashtable rehash(hashtable h);
#endif /* hash_h_ */
enum kindofentry ;
struct hashentry
;typedef struct hashentry cell;
struct hashtbl
;
原始檔:
/*
* hash.c
* * created on: dec 12, 2016
* author: csf
*/#include "hash.h"
#include "stdio.h"
#include "stdlib.h"
int isprime(int x) //判斷素數
return h;
}position find(elementtype key,hashtable h) //查詢表內元素,沒有該元素返回空槽
return pos;
}void insert(elementtype key,hashtable h) //插入新元素,元素存在則什麼也不做
}void destroytable(hashtable h) //銷毀雜湊表
elementtype retrieve(position p,hashtable h) //根據元素位置得到元素值
int delete(elementtype key,hashtable h) //刪除元素,實際只是把元素標記為deleted
h->thecells[pos].info=deleted;
return 1;
}hashtable rehash(hashtable h) //再雜湊,當填充因子大於0.5或者發生衝突無法找到空槽時使用
if(delete(100,table))
destroytable(table);
}
雜湊(閉雜湊)開放定址法實現
之前一篇博文中提過如何用開鏈法實現雜湊表 這裡是鏈結 那麼對於雜湊表的實現,還有另外一種方法的實現,這就是雜湊開放定址法來實現。該方法也是用來處理雜湊衝突的。解決思想如下 現有關鍵字17,60,29,38 如何確定位址?可以看見該錶的長度為11,那麼使用關鍵字取餘該錶的長度,得到的餘數就是該關鍵字的...
雜湊表(上) 開放定址法
概述 雜湊表,又稱雜湊表,hash表。雜湊表是一種特殊的資料結構,它同陣列 鍊錶以及二叉排序樹等相比較有很明顯的區別,它能夠快速定位到想要查詢的記錄,而不是與表中存在的記錄的關鍵字進行比較來進行查詢。這個源於雜湊表設計的特殊性,它採用了函式對映的思想將記錄的儲存位置與記錄的關鍵字關聯起來,從而能夠很...
雜湊 開放定址法
引起雜湊衝突的乙個原因可能是 雜湊函式設計不夠合理。雜湊函式設計原則 雜湊函式的定義域必須包括需要儲存的全部關鍵碼,而如果雜湊表允許有m個位址時,其值域必須在0到m 1之間 雜湊函式計算出來的位址能均勻分布在整個空間中 雜湊函式應該比較簡單 閉雜湊typedef int keytype typede...