zoukankan      html  css  js  c++  java
  • Hash表的表大小

     hash表的出现主要是为了对内存中数据的快速、随机的访问。它主要有三个关键点:Hash表的大小、Hash函数、冲突的解决。

               这里首先谈谈第一点:Hash表的大小。

               Hash表的大小一般是定长的,如果太大,则浪费空间,如果太小,冲突发生的概率变大,体现不出效率。所以,选择合适的Hash表的大小是Hash表性能的关键。

               对于Hash表大小的选择通常会考虑两点:

                第一,确保Hash表的大小是一个素数。常识告诉我们,当除以一个素数时,会产生最分散的余数,可能最糟糕的除法是除以2的倍数,因为这只会屏蔽被除数中的位。由于我们通常使用表的大小对hash函数的结果进行模运算,如果表的大小是一个素数,就可以获得最佳的结果。

               第二,创建大小合理的hash表。这就涉及到hash表的一个概念:装填因子。设装填因子为a,则:

    a=表中记录数/hash表表长

    通常,我们关注的是使hash表的平均查找长度最小,而平均查找长度是装填因子的函数,而不是表长n的函数。a的取值越小,产生冲突的机会就越小,但如果a取值过小,则会造成较大的空间浪费,通常,只要a的取值合适,hash表的平均查找长度就是一个常数,即hash表的平均查找长度为O(1)。

               当然,根据不同的数据量,会有不同的哈希表的大小。对于数据量时多时少的应用,最好的设计是使用动态可变尺寸的哈希表,那么如果你发现哈希表尺寸太小了,比如其中的元素是哈希表尺寸的2倍时,我们就需要扩大哈希表尺寸,一般是扩大一倍。
             下面是哈希表尺寸大小的可能取值:
         17,            37,          79,        163,          331,  
        673,           1361,        2729,       5471,         10949,        
       21911,          43853,      87719,      175447,      350899,
      701819,         1403641,    2807303,     5614657,     11229331,   
     22458671,       44917381,    89834777,    179669557,   359339171,  
    718678369,      1437356741,  2147483647

    (转)

  • 相关阅读:
    mvc EF SQL语句
    Android自适应屏幕大小和布局
    6263=1 这个等式是错的,只移动一个数字(不能动符号)变成正确的等式
    public static const int A=1;这段代码有错误么?错了.常量不能标记为static
    jquery的ajax全局事件和AJAX 请求正在进行时显示“正在加载”
    visual studio中javascript脚本智能感应
    使用Windows API获取和改变当前显示设置
    IP Helper API 使用方法
    Rundll32.exe使用方法大全
    WIN32 API编程枚举系统显示器
  • 原文地址:https://www.cnblogs.com/qiaoyanlin/p/6746466.html
Copyright © 2011-2022 走看看