wikipedia上的解釋
下圖示意了雜湊表(hash table)這種資料結構。
雜湊表
如上圖所示,首先分配乙個指標陣列,陣列的每個元素是乙個鍊錶的頭指標,每個鍊錶稱為乙個槽(slot)。哪個資料應該放入哪個槽中由雜湊函式決定,在這個例子中我們簡單地選取雜湊函式h(x) = x % 11,這樣任意資料x都可以對映成0~10之間的乙個數,就是槽的編號,將資料放入某個槽的操作就是鍊錶的插入操作。
如果每個槽裡至多只有乙個資料,可以想像這種情況下search
、insert
和delete
操作的時間複雜度都是o(1),但有時會有多個資料被雜湊函式對映到同乙個槽中,這稱為碰撞(collision),設計乙個好的雜湊函式可以把資料比較均勻地分布到各個槽中,盡量避免碰撞。如果能把n個資料比較均勻地分布到m個槽中,每個糟裡約有n/m個資料,則search
、insert
和delete
和操作的時間複雜度都是o(n/m),如果n和m的比是常數,則時間複雜度仍然是o(1)。一般來說,要處理的資料越多,構造雜湊表時分配的槽也應該越多,所以n和m成正比這個假設是成立的。
請讀者自己編寫程式構造這樣乙個雜湊表,並實現search
、insert
和delete
操作。
如果用我們學過的各種資料結構來表示n個資料的集合,下表是search
、insert
和delete
操作在平均情況下的時間複雜度比較。
各種資料結構的search、insert和delete操作在平均情況下的時間複雜度比較
資料結構
search
insert
delete
陣列o(n),有序陣列折半查詢是o(lgn)
o(n)
o(n)
雙向鍊錶
o(n)
o(1)
o(1)
排序二叉樹
o(lgn)
o(lgn)
o(lgn)
雜湊表(n與槽數m成正比)
o(1)
o(1)
o(1)
根據以上演算法,抽象資料結構如下:
/*雜湊表*/
struct obj_container ;
// 每個slot 為乙個鍊錶
struct bucket_entry bucket;
接下來實現 search, link , unlink函式。
資料結構之雜湊表(雜湊表)
今天學的是資料結構的雜湊查詢篇,其他的查詢可參見以前的傳送門 以前的查詢都是基於比較關鍵字的基礎上,所以查詢的效率依賴於查詢過程中所進行的比較次數。理想的情況是不經過任何比較,通過計算就能直接得到記錄所在的儲存位址,雜湊查詢 hashed search 是基於上述思想的一種查詢方式。雜湊法又稱為雜湊...
資料結構之雜湊表
雜湊表和雜湊化有乙個重要的概念是如何把關鍵字轉換成陣列下標,在雜湊表中這個轉換是通過雜湊函式來完成的。比如規定乙個單詞含有4個字元,對於單詞cats,我們採用 冪的連乘 的方式將乙個單詞對映成數字。因為有27個可能的字元,包括空格,所以冪採用27,則cats的數字下標是3 27 3 1 27 2 2...
資料結構之雜湊表
雜湊表 hashtable 也叫雜湊表,是根據關鍵碼值而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,從而加快查詢速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。上面的基本介紹完了,是不是有些蒙 大佬走開 我來 通俗 說一下我的理解,不考慮其他東西,雜湊表...