hash_map

hash_map函數

  STL中的std::map內部使用的是紅黑樹,紅黑樹有序,每次操做的複雜度穩定在logN。在<ext/hash_map>中,還有一個__gnu_cxx::hash_map,內部使用的是hash,在hash函數恰當的狀況下,能夠提供更快的查詢速度O(1),若是hash函數很爛,使用hash_map,將會是一個災難,操做複雜度最壞將到O(N)。spa

  

  內部原理就是「Hash函數映射 + list解決Conflict」。更多可參考:http://blog.csdn.net/sdhongjun/article/details/4517325.net

  我比較好奇的是 這個vector成員,它的默認大小是多少?以及是否可以預設?是否可以在使用過程當中變大?下面將分析。3d

hash_map初始大小blog

  hash_map內部的實現是由<ext/hashtable.h>中的__gnu_cxx::hashtable來完成的。以下圖:get

  

  vector的大小在hashtable的構造函數中就要指定。以下圖:hash

  

  而hash_map在構造函數中,若是沒有人爲指定的話,傳遞的則是100。以下圖:table

  

  固然hash_map也提供了傳遞size的構造函數。以下圖:  效率

  

hash_map是否能夠改變大小原理

  hash_map提供了resize()方法,用於調用hashtable中的resize方法。以下圖:

  

  hashtable中的resize方法中,若是新的大小比舊的大,則進行替換。以下圖:

  

  那新大小是多少呢?是你設多少就是多少?不是。是第一個大你給的__hint大的素數。

  

  

  上圖能夠看到,hashtable有一個選定的素數表,基本是翻倍增加的素數表,用以設置新的大小,置於爲何,我猜是選bucket的時候要%N,若是N是素數那麼散列效果會更好吧。

最後

  hash_table是把以雙刄劍,用的好效率很高O(1),用的很差奔着O(N)就去了。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息