日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面试题总结15 自己构建一个哈希表

發(fā)布時間:2025/3/21 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试题总结15 自己构建一个哈希表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


不使用hash庫函數(shù)可以使用其他如鏈表類的函數(shù)來構(gòu)建一個哈希表,《stl源碼剖析》中講到hashtable是如何構(gòu)建的,大致思路如下:

采用開鏈的方法使表格的負載系數(shù)小于1。

哈希散射來將大數(shù)映射為小數(shù),索引為k = X%TableSize,tableSize需要一個質(zhì)數(shù),stl中自帶了28個質(zhì)數(shù),可以調(diào)用。

stl中采用桶子和鏈表的方式,整個桶子就是一張簡單的哈希表,整個桶子可以用一個數(shù)組表示,數(shù)組中的元素其實是一個鏈表的節(jié)點,保存鍵值和指針,指向key值為桶子內(nèi)鍵值的鏈表。

注意下面幾點:

(1)哈希表要求的查找時間是O(N),在合理假設(shè)下,平均時間為O(1)。

(2)如果直接將鍵值作為桶子位置存放,當數(shù)據(jù)量較少時會造成空間的大量浪費,應(yīng)該對一個hashfunction進行縮小,同時key值如果不一定按序存放,這樣會浪費一定的查找時間,這里要尋求一個時間與空間的平衡,就是動態(tài)數(shù)組大小來平衡。

(3)整個桶子用vector來表示,因為可以動態(tài)擴展,初始化時先賦予一個vector的大小,可以為最小的一個質(zhì)數(shù),當插入時,每次擴展為大于vector長度的最小質(zhì)數(shù)。

(4)當vector動態(tài)擴展時,此時哈希函數(shù)的值就改變了,需要對原來的桶子進行重新配置,新桶子的創(chuàng)建中不需要拷貝鏈表,只要將每個桶子中的指針指向原來的鏈表即可。

(5)當插入(key,value)時,首先要使用哈希函數(shù)檢測key位于哪個桶子,如果沒有查找到桶子,則在桶子表后面插入一個新的桶子,里面保存key值和一個含有一個元素的鏈表結(jié)點,如果檢測到key值已經(jīng)存在某個桶子中,則直接在后面的鏈表中插入一個新結(jié)點。

(6)當輸入key值得到value值時,只需在size中找到key值的位置,然后遍歷鏈表,如果key單一時不需要鏈表結(jié)構(gòu)直接在桶子中保存value即可。

(7)得到鍵值總數(shù),也就是桶子的個數(shù),直接返回vector的大小,其實有點問題,這桶子的大小其實有部分是沒有存放數(shù)據(jù)的。

總結(jié)

以上是生活随笔為你收集整理的面试题总结15 自己构建一个哈希表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。