雜湊表資料結構之一 分離鏈結法

2021-07-25 05:15:50 字數 1573 閱讀 6438

查詢樹adt允許對一組元素進行各種操作,而今次總結的雜湊表(hash table)adt,不過它只支援二叉查詢樹所允許的一部分操作,雜湊表的實現常常叫做雜湊(hashing),以常數平均時間執行插入、刪除和查詢的技術。

理想的雜湊表資料結構只不過是乙個包含有關鍵字的具有固定大小的陣列,把錶的大小叫做tablesize,並將其理解為雜湊資料結構的一部分而不僅僅是浮動於全域性的某個變數,每個關鍵字被對映到從0到tablesize-1這個範圍中的某個數,並且被放到適當的單元中,這個對映就叫做雜湊函式(hash function),理想的情況下它應該運算簡單並且應該保證任何兩個不同的關鍵字對映到不同的單元。當然理想的情況是不可能,單元的數目是有限的,而關鍵字實際上是用不完的,因此我們要尋找乙個雜湊函式,該函式要在單元之間均勻的分配關鍵字。這就是雜湊的基本想法,剩下的問題是要選擇乙個函式,決定當兩個關鍵字雜湊到同乙個值得時候(稱為衝突(collision))應該做什麼以及如何確定雜湊表的大小。

一種選擇方法是把字串中字元的ascii碼值加起來:

unsigned

int hash(const

char *key, int tablesize)

還有一種方法,這個雜湊函式涉及到關鍵字中的所有字元,並且一般可以分布的更好,借助於多項式的計算來實現的:

unsigned

int hash(const

char *key, int tablesize)

上面描述的雜湊函式就表的分布而言未必是最好的,但是確實具有及其簡單的優點。剩下的主要程式設計細節是解決衝突的消除問題,如果當乙個元素被插入時另乙個元素已經存在(雜湊值相同),那麼就產生乙個衝突,這個衝突的解決有兩種簡單的方法:分離鏈結法和開放定址法。

其做法是將雜湊到同乙個值的所有元素保留到乙個表中。

struct listnode

;struct hashtable

;

hashtable *initializetable(int tablesize)

h = new hashtable;

if (h == null)

std::cout

<< 「out of space」 << std::endl;

h->tablesize = nextprime(tablesize);

h->thelists = new (listnode*) * h->tablesize;

if (h->thelists == null)

std::cout

<< 「out of space」 << std::endl;

for (i = 0; i < h->tablesize; i++)

return h;

}

listnode *find(elementtype

key, hashtable *h)

void insert(elementtype key, hashtable *h)

}}

資料結構與演算法之雜湊 分離鏈結法 《七》

hash,一般翻譯做 雜湊 也有直接音譯為 雜湊 的,就是把任意長度的輸入 又叫做預對映,pre image 通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮對映,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,所以不可能從雜湊值來唯一的確定輸入...

資料結構 分離鏈結法和平方探測法相關例題

現有資料序列和雜湊函式h x x mode 10。1 請畫出用分離鏈結法表示的雜湊表 5分 2 請畫出用平方探測法f i i i表示的雜湊表 5分 3 請計算前兩題中雜湊表的裝載因子和查詢成功的平均查詢長度asl 5分 1 分離鏈結法01 437123 1323 6173 4434456 78941...

雜湊表資料結構 一看就懂的資料結構基礎 雜湊表

雜湊表 雜湊表 hash table 是儲存鍵值 key value 對資料的一種資料結構。例如,我們可以將人的名字作為鍵,性別作為值來儲存。通過把鍵對映到表中的乙個位置來訪問資料,以提高查詢速度。而這個對映關係就是雜湊函式。雜湊函式 因為雜湊表的資料對映關係以雜湊函式為體現,為了避免小夥伴對雜湊函...