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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

问答丨如何理解哈希表的工作原理?

發(fā)布時間:2024/8/23 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 问答丨如何理解哈希表的工作原理? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

#我頭新條聞#

哈希來自英文hash的翻譯。其實恰如其分應(yīng)該叫散列。散列的目的就是找到一個函數(shù)能夠?qū)⒁欢褦?shù)字均勻分布在一維數(shù)組里。理想狀態(tài)大家存儲的位置是不同的,否則哈希函數(shù)比較糟糕。但是當(dāng)兩個數(shù)字經(jīng)過一次哈希發(fā)現(xiàn)存在同一個數(shù)組里,還會二次哈希把他存在另外一個不同地方,這就是所謂雙哈希。但是影響哈希存儲的最關(guān)鍵因素是數(shù)組大小,當(dāng)足夠大大家發(fā)生碰撞機(jī)會比較少,這就是為什么內(nèi)存數(shù)據(jù)庫,key值達(dá)到內(nèi)存70%就要擴(kuò)容。剛才看到樓上說的太簡單而且概念有些錯誤忍不住發(fā)表兩句。我們很少會用到數(shù)組加鏈表方式,因為查詢不穩(wěn)定。基本通過空間換時間才能達(dá)到大o常數(shù)效率

#ICMLL實驗室 #

科研工作者、科學(xué)達(dá)人

哈希表是根據(jù)關(guān)鍵值(key)來直接訪問目標(biāo)值(value)的一種數(shù)據(jù)結(jié)構(gòu)。其特點就在于能夠快捷的實現(xiàn)信息的查詢和檢索。

比如我們在手機(jī)中存放的通訊錄就是用哈希表來實現(xiàn)的,即我們輸入一個聯(lián)系人的姓名,就能返回相應(yīng)的電話號碼。用哈希表實現(xiàn)的過程就是,將聯(lián)系人姓名的字符通過一個哈希函數(shù),映射成一個整數(shù)(哈希碼),然后根據(jù)哈希碼來索引出電話號碼。比如哈希碼為5,就表示是在存儲位置為5,因此我們就能直接取出該位置的值,并返回結(jié)果。

那么實現(xiàn)哈希表的關(guān)鍵就在于哈希函數(shù)的構(gòu)建,也就是如何建立一個合適的索引來滿足如下條件:

1)同一個鍵每次輸入到哈希函數(shù)中,其對應(yīng)的哈希碼也必須相同;

2)不同鍵對應(yīng)的哈希碼不能相同。

第一個條件意味著哈希函數(shù)必須是確定性的;第二個條件則要求不能出現(xiàn)哈希沖突。當(dāng)兩個或更多個鍵產(chǎn)生相同的哈希碼時就會發(fā)生沖突(hash collisions)。

比如我們現(xiàn)在考慮建立一個簡單的哈希表來查詢年齡,{Jim:5, Davis:7, Taylor:12, Bob:3},如果我們選擇哈希函數(shù)為輸入鍵值的字符個數(shù)。那么在建立哈希表時,就講Jim存放在位置3處,Jack存放在位置4處。而這樣的話Jim和Bob的存儲位置就會發(fā)生沖突,不符合哈希函數(shù)的要求。但是如果我們將哈希函數(shù)替換為首字母順序存放,在這個數(shù)據(jù)中就沒有哈希沖突了。

然而萬一無法避免哈希沖突的話,我們可以用鏈接和線性探測的方法來避免哈希值發(fā)生碰撞。

鏈接就是將發(fā)生沖突的鍵值直接鏈接在鏈表的尾部;線性探測則是,如果在位置i處發(fā)生沖突,那么就檢查i+1處是否為空,為空的話就將沖突鍵值放入其中,否則繼續(xù)檢查下一個。


#楊沐白 #

互聯(lián)網(wǎng)算法工程師

謝邀。這個問題很有趣,哈希(Hashing)是一種用于從一組相似對象中唯一標(biāo)識特定對象的技術(shù)。


一個簡單的例子


我們生活中如何使用哈希的一些例子包括:

在大學(xué)中,每個學(xué)生都會被分配一個唯一的卷號,可用于檢索有關(guān)它們的信息。

在圖書館中,每本書都被分配了一個唯一的編號,可用于確定有關(guān)圖書的信息,例如圖書館中的確切位置或已發(fā)給圖書的用戶等。

在這兩個例子中,學(xué)生和書籍都被分成了一個唯一的數(shù)字。


假設(shè)您有一個對象,并且您想為其分配一個鍵以便于搜索。 要存儲鍵/值對,您可以使用一個簡單的數(shù)組,如數(shù)據(jù)結(jié)構(gòu),其中鍵(整數(shù))可以直接用作存儲值的索引。 但是,如果密鑰很大并且無法直接用作索引,則應(yīng)使用哈希(Hashing)。

在哈希中,通過使用哈希函數(shù)將大鍵轉(zhuǎn)換為小鍵。 然后將這些值存儲在稱為哈希表的數(shù)據(jù)結(jié)構(gòu)中。 哈希的想法是在數(shù)組中統(tǒng)一分配條目(鍵/值對)。 為每個元素分配一個鍵(轉(zhuǎn)換鍵)。 通過使用該鍵,您可以在O(1)時間內(nèi)訪問該元素。 使用密鑰,算法會計算一個索引,該索引可以找到或插入條目的位置。

哈希一般分兩步執(zhí)行:

  • 通過使用哈希函數(shù)將元素轉(zhuǎn)換為整數(shù)。 此元素可用作存儲原始元素的索引,該元素屬于哈希表。

  • 元素存儲在哈希表中,可以使用哈希鍵快速檢索它。


hash = hashfunc(key)

index = hash%array_size


在此方法中,哈希與數(shù)組大小無關(guān),然后通過使用模運算符(%)將其縮減為索引(介于0和array_size - 1之間的數(shù)字)。


應(yīng)用場景


關(guān)聯(lián)數(shù)組:哈希表通常用于實現(xiàn)許多類型的內(nèi)存表。 它們用于實現(xiàn)關(guān)聯(lián)數(shù)組(索引是任意字符串或其他復(fù)雜對象的數(shù)組)。

數(shù)據(jù)庫索引:哈希表也可以用作基于磁盤的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)庫索引(例如在dbm中)。

高速緩存:哈希表可用于實現(xiàn)高速緩存,即用于加速對數(shù)據(jù)的訪問的輔助數(shù)據(jù)表,其主要存儲在較慢的介質(zhì)中。

對象表示:一些動態(tài)語言(如Perl,Python,JavaScript和Ruby)使用哈希表來實現(xiàn)對象。

提升速度:哈希函數(shù)用于各種算法,以使其計算更快。

∑編輯?|?Gemini

來源| 今日頭條

更多精彩:

? ?哈爾莫斯:怎樣做數(shù)學(xué)研究

? ?扎克伯格2017年哈佛大學(xué)畢業(yè)演講

? ?線性代數(shù)在組合數(shù)學(xué)中的應(yīng)用

? ?你見過真的菲利普曲線嗎?

? ?支持向量機(jī)(SVM)的故事是這樣子的

? ?深度神經(jīng)網(wǎng)絡(luò)中的數(shù)學(xué),對你來說會不會太難?

? ?編程需要知道多少數(shù)學(xué)知識?

? ?陳省身——什么是幾何學(xué)

? ?模式識別研究的回顧與展望

? ?曲面論

? ?自然底數(shù)e的意義是什么?

? ?如何向5歲小孩解釋什么是支持向量機(jī)(SVM)?

? ?華裔天才數(shù)學(xué)家陶哲軒自述

? ?代數(shù),分析,幾何與拓?fù)?#xff0c;現(xiàn)代數(shù)學(xué)的三大方法論


算法數(shù)學(xué)之美微信公眾號歡迎賜稿

稿件涉及數(shù)學(xué)、物理、算法、計算機(jī)、編程等相關(guān)領(lǐng)域,經(jīng)采用我們將奉上稿酬。

投稿郵箱:math_alg@163.com

總結(jié)

以上是生活随笔為你收集整理的问答丨如何理解哈希表的工作原理?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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