zoukankan      html  css  js  c++  java
  • hash_map

    hash_map

      STL中的std::map内部使用的是红黑树,红黑树有序,每次操作的复杂度稳定在logN。在<ext/hash_map>中,还有一个__gnu_cxx::hash_map,内部使用的是hash,在hash函数恰当的情况下,可以提供更快的查询速度O(1),如果hash函数很烂,使用hash_map,将会是一个灾难,操作复杂度最坏将到O(N)。

      

      内部原理就是“Hash函数映射 + list解决Conflict”。更多可参考:http://blog.csdn.net/sdhongjun/article/details/4517325

      我比较好奇的是 这个vector成员,它的默认大小是多少?以及是否能够预设?是否能够在使用过程中变大?下面将分析。

    hash_map初始大小

      hash_map内部的实现是由<ext/hashtable.h>中的__gnu_cxx::hashtable来完成的。如下图:

      

      vector的大小在hashtable的构造函数中就要指定。如下图:

      

      而hash_map在构造函数中,如果没有人为指定的话,传递的则是100。如下图:

      

      当然hash_map也提供了传递size的构造函数。如下图:  

      

    hash_map是否可以改变大小

      hash_map提供了resize()方法,用于调用hashtable中的resize方法。如下图:

      

      hashtable中的resize方法中,如果新的大小比旧的大,则进行替换。如下图:

      

      那新大小是多少呢?是你设多少就是多少?不是。是第一个大你给的__hint大的素数。

      

      

      上图可以看到,hashtable有一个选定的素数表,基本是翻倍增长的素数表,用以设置新的大小,置于为什么,我猜是选bucket的时候要%N,如果N是素数那么散列效果会更好吧。

    最后

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

  • 相关阅读:
    noip2012 同余方程
    bzoj1477 poj1061 青蛙的约会
    Nginx 从入门到放弃(五)
    Nginx 从入门到放弃(四)
    Nginx 从入门到放弃(三)
    Nginx 从入门到放弃(二)
    Nginx 从入门到放弃(一)
    python三大神器之fabric
    Docker 学习(一)
    linux就该这么学 第一天学习笔记
  • 原文地址:https://www.cnblogs.com/tekkaman/p/3386995.html
Copyright © 2011-2022 走看看