理想的雜湊結構不過是乙個包含關鍵字的具有固定大小的陣列,雜湊表的長度是資料結構的一部分。雜湊中的關鍵字不需要支援比較大小,只要能夠支援判等操作就行了。每個關鍵字按照乙個雜湊函式被對映到0到tablesize-1範圍內的桶單元。當不同的關鍵字被對映到相同的單元時,稱作衝突(conflict)。雜湊的插入,查詢,刪除都是常數時間複雜度。
常見的雜湊方法有除餘法hash(key)=key%m,字串為key時也常對字元求和作為雜湊值。
雜湊表的值為乙個指向鍊錶節點的指標,當對應的桶單元被占用時,將對應的值插入到對應的鍊錶中(比如插入到鍊錶的
頭結點),這種方式節省空間,刪除操作簡單,但是需要動態的申請節點記憶體,影響速度,並且空間分布不連續,系統快取
失效,i/o次數增多。
//結構定義
struct listnode;
typedef struct listnode* position;
struct hashtbl;
typedef struct hashtbl *hashtable;
hashtable initializetable(int tablesize);
void destroytable(hashtable h);
position find(elementtype key,hashtable h);
void insert(elementtype key,hashtable h);
elementtype retrieve(position p);
struct listnode
typedef position list;
struct hashtbl
//initializetable()
hashtable initializetable(int tablesize)
int i=0;
for(i;ithelist[i]=malloc(sizeof(struct listnode));
if(h->thelist[i]==null)
else
}}//find()
position find(elementtype key,hashtable h)
return start;
}//insert()
void insert(elementtype key,hashtable h)
else}}
線性試探指的是,當發生雜湊衝突時,從當前位置出發,逐一的往前試探,直到找到乙個空的位置。
其優點是空間在初始時就分配好,無需動態分配,提高了效率,並且由於資料臨近,具有良好的區域性性,充分利用了系統的io效能,但是會導致更多的衝突。插入時若新詞條尚不存在,則存入直接查詢終止處的空桶,若存在,則往後逐一試探,直至找到空桶。刪除時由於存在查詢鏈,直接清除命中的桶會導致隨後的查詢鏈被切斷,因此可做惰性刪除。
以平方數為距離,確定下乙個試探桶單元。
只有當表長為素數,切裝填因子不超過0.5時,才一定能找出乙個空桶。
從衝突位置開始,依次向後試探。
桶排序適用於元素分布範圍固定,元素分布隨機的情況,例如下面是輸入最小值,最大值,和雜湊長度進行桶排序的**,每個通採用鍊錶組織,桶內部用stl裡面list的sort()函式。
vectorbucketsort(vectorivec,int min_elem,int max_elem,int bucketsize)
int perbucket = (max_elem - min_elem )/ bucketsize + 1;
for (int j = 0; j < ivec.size();++j)
for (int k = 0; k < bucketsize;++k)
deletebuckettbl;
return sortedvec;
}int main()
; copy(input_vec.begin(), input_vec.end(), ostream_iterator(std::cout, " "));
vectorsorted_vec = bucketsort(input_vec, 11,130,11);
cout << endl;
copy(sorted_vec.begin(), sorted_vec.end(), ostream_iterator(std::cout, " "));
system("pause");
return 0;
}
桶排序適用於當輸入範圍有限,並且輸入值隨機分布的情況,是最耗費空間的排序方法,但是能獲得線性的複雜度。 雜湊(二)雜湊桶
雜湊桶又被稱作開鏈法,開雜湊法。相比於閉雜湊法雜湊桶更為靈活直觀,存資料時不會浪費空間,開雜湊法存資料時由於避免雜湊衝突,總會有百分之三十的空間浪費,當儲存空間很大時將會造成大量的浪費。同時開雜湊法造成雜湊衝突時不便於查詢資料。所以我們有了雜湊結構中的雜湊桶。雜湊桶與開雜湊法一樣的是需要開一段陣列用...
雜湊拉鍊法(雜湊桶)
昨天寫了雜湊的開放定址法的部落格,今天我們要說的是拉鍊法,還有乙個名字叫雜湊桶。雜湊桶要做的就是,之前我們用的開放定址法,通過將資料對映到陣列中來實現雜湊。這裡每個陣列的位置只能存放乙個資料,如果衝突的話會繼續往下找找到空的位置然後放進去,但是其實大家都能感覺出來上乙個 很簡單,也很扯,感覺實現起來...
HashTable雜湊表 雜湊表(雜湊桶)
處理雜湊衝突的開鏈法 拉鍊法 雜湊桶 使用素數做雜湊表的長度,可以降低雜湊衝突 素數表size t getnextprime size t num 素數表 雜湊桶的節點的定義 template struct hashnode 在插入前檢查容量,以及負載因子。不夠就進行增容,按素數表進行增,以減小雜湊...