為什么hash作為內存使用的經典數據結構?


聽到這樣說法:hash是內存中使用的經典數據結構。內存是典型的隨機訪問設備。

 

為什么hash這種數據結構很適合內存使用呢?如何理解內存是隨機訪問設備呢?

 

因為我想知其所以然,如何理解背后的原因,我花費點時間來學習一番。

 

我之前學過搜索引擎中的倒排索引,其中的單詞詞典就是使用hash方式實現:對關鍵詞做hash值,同樣hash值的關鍵詞都歸到一起。這是我通俗化接觸hash應用開始。

 

我們使用hash尋找數據的時候,數據隨機分散到各個物理位置。不是有序的數據。而內存設備也是隨機訪問設備。內存很適合用hash方式來讀取數據。比如memcached、redis等這些內存緩存,都是使用key-value形式來讀取數據的

 

 

 

內存是一個隨機存儲設備,隨機存儲設備,我覺得是相對順序存儲設備而言的。機械硬盤存儲,讀取速度會影響整體速度,比如就近讀取就會快。主存的數據讀取與先后順序無關。是典型的隨機訪問設備。很適合hash數據結構查找。

 

 

如何理解內存中數據的讀取與先后順序無關? 熟悉了內存存儲原理,才知道,為什么內存是隨機存儲設備。

 

借用網上別人的一張內存存儲圖:

 

 

這張圖很好的幫我理解了內存的數據讀取方式。感謝作者。

把內存里面的存儲空間,看成是一個一個的單元格組成的矩陣,每個單元格就是存儲數據的。

 

數據d1,d2,d3分別分散存儲在內存中的各個單元格子里面。

 

要讀取數據d1。通過一個行地址和一個列地址可以唯一定位到一個存儲單元。

 

隨便數據存儲在哪個單元個子里面,都能通過行地址與列地址快速定位找到數據所在的單元格。

 

假設要讀取數據d1、d2、d3。先讀取d1,還是先讀取d3,對於整體速度是沒有影響的。因為定位每個單元格子所需要的操作是一樣的(行地址與列地址)

 

所以,讀取的速度是與讀取順序無關的。

 

 

而在硬盤中則不同,硬盤的磁頭要進行定位,如何數據在磁頭附近,則直接移過去即可。如果接下來要讀取的數據不在磁頭附近,又需要讓磁盤片重新轉一圈才行(磁頭不轉動,盤片轉動,所以需要讓數據所在區域轉動到到磁頭位置下,以便磁頭讀取數據),這就需要耗費磁盤i/o。在磁盤扇區,相臨近的數據,能減少盤片轉動,所以安排數據的先后讀取順序其實就是減少了盤片轉動。比如把需要一起訪問的數據放到同一個柱面上,就是一種方式。

 

 

這時候,理解了為什么內存很適合用hash方式存取數據。是與隨機存儲設備有關。

 

磁盤靠物理旋轉來定位讀取數據,於是存在尋道時間和旋轉延遲。內存查找數據不存在這種問題。

 

有的對比,就更加了解硬盤為什么很適合用b樹方式作為數據結構。不適合使用hash方式來組織數據。

 

可以這樣理解:內存與磁盤存儲的原理的不同,使得內存很適合hash方式訪問數據,磁盤則很適合使用b樹形式組織數據。

 

理解不正確之處,歡迎指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM