哈希表

一、哈希表解決什麼問題?算法

  假設有一組記錄,每條記錄都是學生名,成績的鍵值對,在通常的線性表中,每條記錄的存放是沒有規律的。若是要找Andy的成績,由於不知道Andy這條記錄的存放位置,必須遍歷集合,逐個比較,找到Andy這條記錄,取出成績。時間複雜度爲O(N),效率很低。哈希表就是解決這個問題的。函數

二、如何解決的?spa

  上面問題的關鍵是,根據學生名不能肯定存放位置,哈希表是這樣作的:設計一個映射函數,把學生名映射到存放的地址。這樣就好了,給我一個學生名,我只要根據映射函數計算一下,就知道了存放位置,直接去那個地方去數據,時間複雜度爲O(1)。一樣當插入記錄的時候,根據映射函數計算一下,這條記錄應該放在哪一個位置,把記錄放在那個地方就行了。設計

三、哈希表中存放的是key-value對。使用映射函數,把key映射一個存放地址(注意:這裏的地址可認爲是Hash地址,不是真實的物理地址)。對於映射函數,須要注意:a、計算要簡單,複雜計算會影響效率。b、散列地址分佈均勻,否則會頻繁地照成衝突。效率

四、映射函數引入一個問題,那就是不一樣的key可能會映射到相同的位置,插入元素的時候,就衝突了。解決衝突的辦法有:遍歷

  a、開放定址法:衝突了。就去尋找下一個空的地址。數據

  b、再次哈希:再次映射找到一個空的地址。集合

  c、鏈地址法:每一個地址能夠存放一系列元素,衝突了,就在當前元素後面加。時間

  d、公共溢出區法:衝突了,放到公共區內。哈希表

  查找元素的時候,先映射地址,若是地址存放的不是目標元素,說明衝突了,根據解決衝突的算法,繼續找。

五、哈希表爲了解決查找的效率,把key映射爲存放地址,所以能夠直接定位。

相關文章
相關標籤/搜索