為了理解hash所謂的空間地址,先由數組和鏈表的存儲性能入手,更容易理解。
我們通過初級的數據結構進行數據存儲,也是為了對數據進行基本的增刪改查操作。那么數組和鏈表在進行這些操作的性能對比如下。
數組與鏈表的區別
(1)存儲空間上
鏈表存放的內存空間可以是連續的,也可以是不連續的,數組則是連續的一段內存空間。一般情況下存放相同多的數據時,數組占用較小的內存,而鏈表還需要存放其前驅和后繼的空間。
(2)長度的可變性
鏈表的長度是按實際需要可以伸縮的,而數組的長度是在定義時要給定的,如果存放的數據個數超過了數組的初始大小,則會出現溢出現象。
(3)查找效率:
按序號查找時,數組可以隨機訪問,時間復雜度為O(1),而鏈表不支持隨機訪問,平均需要O(n);
按值查找時,若數組無序,數組和鏈表時間復雜度均為O(n),但是當數組有序時,可以采用折半查找將時間復雜度降為O(logn);
(4)插入刪除時:
數組平均需要移動n/2個元素,而鏈表只需修改指針即可;
(5)空間分配方面:
(靜態)數組從棧中分配空間, 對於程序員(某些編程語言如java對於堆內存的管理也交由程序自動控制,但性能肯定有差異)方便快速,但是自由度小。
鏈表從堆中分配空間, 自由度大但是申請管理比較麻煩。
那么有沒有一種數據結構可以結合該兩者的優點呢?那就是哈希表。
哈希表將需要查找的key值,通過hash函數的計算,換算為數組的位置值。這樣在查找時就可以直接定位數據的位置。它結合了數組的快速查詢的優點又能融合鏈表方便快捷的增加刪除元素的優勢
總結下!
數組------查找快,修改慢!
鏈表------查找慢,修改快!
哈希表:是數組和鏈表的結合體。
注意:
在程序變量中,數組和鏈表都只需要在棧上存儲一個起始位置,占用一個變量位置即可。
hash將需要定位的值通過hash函數換算為數據的位置值,以空間換時間。