关于哈希表的容量,该怎么处理
关于哈希表的容量
在一个程序里的哈希表实现中,哈希表的大小取决于一组质数:
const int primes[] =
{
13, 19, 29, 41, 59, 79, 107, 149, 197, 263, 347, 457, 599, 787, 1031,
1361, 1777, 2333, 3037, 3967, 5167, 6719, 8737, 11369, 14783,
19219, 24989, 32491, 42257, 54941, 71429, 92861, 120721, 156941,
204047, 265271, 344857, 448321, 582821, 757693, 985003, 1280519,
1664681, 2164111, 2813353, 3657361, 4754591, 6180989, 8035301,
10445899, 13579681, 17653589, 22949669, 29834603, 38784989,
50420551, 65546729, 85210757, 110774011, 144006217, 187208107,
243370577, 316381771, 411296309, 534685237, 695090819, 903618083,
1174703521, 1527114613, 1837299131, 2147483647
};
哈希表每增一次容量,都是取该质数表中最相近的质数.
我的疑问是,为什么要根据这些质数取?这些质数是怎么算出来的?有什么科学依据?
------解决方案--------------------
应该是与HASH算法有关,做映射时,被映谢空间大小是质数。
------解决方案--------------------
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%).
而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上.
所以这里最后采用了质数做模的除数.
因为用质数做了模的除数,自然存储空间的大小也用质数了.因为模完之后,数据是在[0-所选质数)之间.
------解决方案--------------------
对于采用模除法的hash表构造,桶大小取质数,或者桶不被10以下的质数整除,可以保证hash表冲突最小。
------解决方案--------------------
我想可能是考虑数据的增量吧,数据量越大,每次增加的数据可能就越多,所以开始是13,19(每次增加5),后面慢慢变成一次增加10几,20几。
这种特性和vector的自动增加容量的方式也是一样的。
------解决方案--------------------
选这些是应该是效率问题把,避免计算或选择全部质数。间隔多少是个人喜好。
至于数学原理,刚刚翻了几本大学时候的书,上面写“经验得到”,估计是太深奥了~~
修正一下,D的大小应该是质数或者不被“20”以下质数整除的最合适。
------解决方案--------------------
哈息表大小为素数在理论上是有依据的,针对不同的哈希算法有不同的证明。例如,对于平方探测法,有如下定理:如果使用平方探测,且表大小是素数,那么当表至少有一半是空的时候,总能够插入一个新的元素。
证明时候需要用到素数这个性质,详细可以参看《数据结构与算法分析-C语言描述》
在一个程序里的哈希表实现中,哈希表的大小取决于一组质数:
const int primes[] =
{
13, 19, 29, 41, 59, 79, 107, 149, 197, 263, 347, 457, 599, 787, 1031,
1361, 1777, 2333, 3037, 3967, 5167, 6719, 8737, 11369, 14783,
19219, 24989, 32491, 42257, 54941, 71429, 92861, 120721, 156941,
204047, 265271, 344857, 448321, 582821, 757693, 985003, 1280519,
1664681, 2164111, 2813353, 3657361, 4754591, 6180989, 8035301,
10445899, 13579681, 17653589, 22949669, 29834603, 38784989,
50420551, 65546729, 85210757, 110774011, 144006217, 187208107,
243370577, 316381771, 411296309, 534685237, 695090819, 903618083,
1174703521, 1527114613, 1837299131, 2147483647
};
哈希表每增一次容量,都是取该质数表中最相近的质数.
我的疑问是,为什么要根据这些质数取?这些质数是怎么算出来的?有什么科学依据?
------解决方案--------------------
应该是与HASH算法有关,做映射时,被映谢空间大小是质数。
------解决方案--------------------
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%).
而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上.
所以这里最后采用了质数做模的除数.
因为用质数做了模的除数,自然存储空间的大小也用质数了.因为模完之后,数据是在[0-所选质数)之间.
------解决方案--------------------
对于采用模除法的hash表构造,桶大小取质数,或者桶不被10以下的质数整除,可以保证hash表冲突最小。
------解决方案--------------------
我想可能是考虑数据的增量吧,数据量越大,每次增加的数据可能就越多,所以开始是13,19(每次增加5),后面慢慢变成一次增加10几,20几。
这种特性和vector的自动增加容量的方式也是一样的。
------解决方案--------------------
选这些是应该是效率问题把,避免计算或选择全部质数。间隔多少是个人喜好。
至于数学原理,刚刚翻了几本大学时候的书,上面写“经验得到”,估计是太深奥了~~
修正一下,D的大小应该是质数或者不被“20”以下质数整除的最合适。
------解决方案--------------------
哈息表大小为素数在理论上是有依据的,针对不同的哈希算法有不同的证明。例如,对于平方探测法,有如下定理:如果使用平方探测,且表大小是素数,那么当表至少有一半是空的时候,总能够插入一个新的元素。
证明时候需要用到素数这个性质,详细可以参看《数据结构与算法分析-C语言描述》