C++面試常見題目7_STL之map與unordered_map(紅黑樹VS哈希表)

map與unordered_map

  • 相同:兩者都是鍵-值對的集合,關聯容器的一種。兩者中的元素都是pair,同時擁有實值和鍵值。兩者都不允許有兩個相同的鍵值(實值可以相同)。兩個的外部接口調用基本一致。
  • 不同:內部實現機理不同,即map內部實現了一個紅黑樹;unordered_map內部實現了一個哈希表。(兩者的比較成爲紅黑樹與哈希表的比較)。由於內部實現機理不同(底層實現)造成以下不同。
  1. map的有序性:紅黑樹(非嚴格平衡二叉樹),該結構具有自動排序的功能,因此map內部的所有元素都是有序的
  2. unordered_map的無序性:哈希表不會根據key值大小進行排序,存儲時是根據key的hash值判斷元素是否相同,因此unordered_map內部元素是無序的。
  3. map的運行效率:紅黑樹可以在O(log n)時間內做查找,插入和刪除,這裏的n是樹中元素的數目。
  4. unordered_map的運行效率:哈希表的查找的時間複雜度可達到O(1)
  5. unordered_map內存佔用比map高。
  • 紅黑樹

  • 定義:RB-tree是一個需滿足以下規則的二叉搜索樹
  1. 每個結點不是紅色就是黑色
  2. 根結點爲黑色
  3. 每個葉結點(空結點)是黑色的
  4. 每個紅色結點的兩個子結點都是黑色的
  5. 從任一節點到其每個葉子結點的所有路徑都包含相同數目的黑色節點。
  • 爲什麼紅黑樹是一種好的搜索樹
  1. 一棵內部有n個結點的紅黑樹的高度至多爲2∗logn(性質4)。這保證了紅黑樹任意操作的複雜度都是O(logn)。
  • 基本操作:左旋,右旋,重新着色
  • 目的:紅黑樹在插入,刪除過程中可能會破壞原本的平衡條件導致不滿足紅黑樹的性質,這時候一般情況下要通過左旋、右旋和重新着色這個三個操作來使紅黑樹重新滿足平衡化條件。
  1. 左旋
  2. 右旋
  3. 重新着色
  • 哈希表

  • 定義:散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。
  • 哈希函數

  1. 直接尋址法
  2. 數字分析法、
  3. 平方取中法
  4. 摺疊法
  5. 隨機數法
  6. 除留餘數法
  • 解決碰撞(衝突):

  1. 開放尋址法:Hi=(H(key) + di) MOD m,i=1,2,…,k(k<=m-1),其中H(key)爲散列函數,m爲散列表長,di爲增量序列(1)線性探測 di=1,2,3,…,m-1;(2)二次探測 di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2);(3)僞隨機探測 di=僞隨機數序列,

  2. 再散列法:Hi=RHi(key),i=1,2,…,k RHi均是不同的散列函數,即在同義詞產生地址衝突時計算另一個散列函數地址,直到衝突不再發生,這種方法不易產生“聚集”,但增加了計算時間。
  3. 鏈地址法:如果遇到衝突,會在原地址新建一個空間,然後以鏈表結點的形式插入到該空間。

  • 查詢性能:

  1. 散列函數是否均勻

  2. 處理衝突的方法

  3. 散列表的裝填因子 :α= 填入表中的元素個數 / 散列表的長度

本系列文章目的爲個人準備面試的簡單總結,文中多有不足,敬請批評指正!

參考:

https://blog.csdn.net/u010853261/article/details/54312932

http://www.cnblogs.com/polly333/p/4798944.html

https://www.cnblogs.com/s-b-b/p/6208565.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章