日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

數據結構之哈希表

系統 2370 0


wikipedia上的解釋

http://zh.wikipedia.org/wiki/%E5%93%88%E5%B8%8C%E8%A1%A8


下圖示意了哈希表(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 {
obj_hash_fn *hash_fn;//哈希函數
obj_callback_fn *cmp_fn;
int n_buckets; //分配多少個slot ?
int elements; //哈希表中元素數目
int version;
/*!variable size */
struct bucket buckets[0]; /*! lengthen tailq, each bucket is a linkedlist */
};

// 每個slot 為一個鏈表

struct bucket_entry {
SPD_LIST_ENTRY(bucket_entry)entry;
int version;
struct obj *pobj; /* pointer to internal data */
}bucket;


接下來實現 search, link , unlink函數。


數據結構之哈希表


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 建平县| 嘉善县| 博兴县| 攀枝花市| 长沙市| 龙川县| 共和县| 久治县| 海林市| 密云县| 双桥区| 长沙县| 洪泽县| 聂拉木县| 清远市| 西盟| 晋江市| 汉寿县| 霍林郭勒市| 鄯善县| 宾川县| 公安县| 陆川县| 甘德县| 遂平县| 沁源县| 湖北省| 增城市| 兰西县| 太湖县| 三亚市| 滕州市| 宜都市| 桦南县| 孝感市| 从江县| 梧州市| 伊春市| 鄂伦春自治旗| 玉溪市| 斗六市|