雜湊表(拉鍊法)

2021-08-16 16:54:38 字數 2783 閱讀 8726

> 開雜湊法又叫鏈位址法(開鏈法)。

開雜湊法:首先對關鍵碼集合用雜湊函式計算雜湊位址,具有相同位址的關鍵碼歸於同一子集合,每乙個子集合稱為乙個桶,各個

桶中的元素通過乙個單鏈表鏈結起來,各鍊錶的頭結點儲存在雜湊表中。

設元素的關鍵碼為37, 25, 14, 36, 49, 68, 57, 11, 雜湊表為ht[12],表的大小為12,雜湊函式為hash(x) = x % 11

hash(37)=4

hash(25)=3

hash(36)=3

hash(49)=5

hash(68)=2

hash(11)=0

使用雜湊函式計算出每個元素所在的桶號,同乙個桶的鍊錶中存放雜湊衝突的元素。

通常,每個桶對應的鍊錶結點都很少,將n個關鍵碼通過某乙個雜湊函式,存放到雜湊表中的m個桶中,那麼每乙個桶中煉表的平均 長度為 。以搜尋平均長度為 的鍊錶代替了搜尋長度為 n 的順序表,搜尋效率快的多。

應用鏈位址法處理溢位,需要增設鏈結指標,似乎增加了儲存開銷。事實上: 由於開位址法必須保持大量的空閒空間以確保搜尋效率,如二次探查法要求裝載因子a <= 0.7,而表項所佔空間又比指標大的多, 所以使用鏈位址法反而比開位址法節省儲存空間。

開雜湊的實現(拉鍊法)

hashnode.h

#pragma once

#include

#include

#include

typedef

int keytype;

typedef

int valuetype;

typedef

struct hashnode

hashnode;

typedef

struct hashtable

hashtable;

hashnode*buyhashnode(keytype key, valuetype value);

size_t gethashtableprime(size_t n);

void hashtableinit(hashtable*ht,int size);//初始化

void hashtableprint(hashtable*ht);

int hashtableinsert(hashtable*ht, keytype key, valuetypevalue);//

hashnode* hashtablefind(hashtable*ht, keytype key);//查詢

size_t hashtableerase(hashtable*ht, keytype key);//刪除

void hashtabledestroy(hashtable*ht);//銷毀

hashnode.c

#include"hashnode.h"

hashnode* buyhashnode(keytype key, valuetype value)

void hashtableinit(hashtable*ht,int size)//初始化

size_t gethashtableprime(size_t n)

; for (int i = 0; i < 28; i++)

}return _primelist[27];

}size_t hashfunc(keytype key, size_t n)

int hashtableinsert(hashtable*ht, keytype key, valuetype value)//插入}}

free(ht->table);

ht->_n = newn;//將新錶中的擴容給舊表

ht->table = newht.table;//新錶賦給原表

}size_t index = hashfunc(key, ht->_n);

if (ht->table[index])

cur = cur->_next;}}

node->_next = ht->table[index];

ht->table[index] = node;

ht->_size++;

return0;}

void hashtableprint(hashtable*ht)}}

}hashnode *hashtablefind(hashtable*ht, keytype key)

else

cur = cur->_next;

}return null;}}

}size_t hashtableerase(hashtable*ht, keytype key)

else

if (cur->_key == key)//多個節點

prev = cur;

cur = cur->_next;

}return -1;

}else

}void hashtabledestroy(hashtable*ht)}}

free(ht->table);

ht->table = null;

ht->_n = 0;

ht->_size = 0;

}

test.c

#include"hashnode.h"

void test()

intmain

()

雜湊表查詢 拉鍊法

雜湊查詢 雜湊查詢 雜湊的第一步是使用雜湊函式將鍵對映成索引 1 除留取餘法 最常用的 特點是容易造成堆積,產生衝突 2 特徵值 3 字元型別的 在查詢中陣列的特點是定址容易,插入和刪除困難,鍊錶則相反 雜湊表將二者的特點綜合。雜湊表建表 通過某種關係轉換,使關鍵字適度的分散到制定大小的順序結構中,...

雜湊錶開雜湊法(拉鍊法)

開雜湊法又叫鏈位址法 開鏈法 設元素的關鍵碼為37,25,14,36,49,68,57,11,雜湊表為ht 12 表的大小為12,雜湊函式為hash x x 11 hash 37 4 hash 25 3 hash 14 3 hash 36 3 hash 49 5 hash 68 2 hash 57 ...

雜湊表(閉雜湊 拉鍊法 雜湊桶)

雜湊表,也稱雜湊表,是一種通過key值來直接訪問在記憶體中的儲存的資料結構。它通過乙個關鍵值的函式 被稱為雜湊函式 將所需的資料對映到表中的位置來訪問資料。關於雜湊表,主要為以下幾個方面 一 雜湊表的幾種方法 1 直接定址法 取關鍵字key的某個線性函式為雜湊位址,如hash key key 或 h...