关于哈希表的容量

netxuning 2007-06-28 04:53:02
在一个程序里的哈希表实现中,哈希表的大小取决于一组质数:

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
};

哈希表每增一次容量,都是取该质数表中最相近的质数.
我的疑问是,为什么要根据这些质数取?这些质数是怎么算出来的?有什么科学依据?
...全文
1245 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lisatisfy 2010-09-25
  • 打赏
  • 举报
回复
看星星来了。。。。
netxuning 2007-06-29
  • 打赏
  • 举报
回复
太感谢了
不过还有一个疑问:就是关于这些质数的选取,为什么是13,19,29...
中间的17, 23等没有选取,我想知道的是,选择这些特定的质数有什么特定的依据?根据什么数学算法?
smartcatiboy 2007-06-29
  • 打赏
  • 举报
回复
对于采用模除法的hash表构造,桶大小取质数,或者桶不被10以下的质数整除,可以保证hash表冲突最小。
wtk0802 2007-06-29
  • 打赏
  • 举报
回复
哈息表大小为素数在理论上是有依据的,针对不同的哈希算法有不同的证明。例如,对于平方探测法,有如下定理:如果使用平方探测,且表大小是素数,那么当表至少有一半是空的时候,总能够插入一个新的元素。

证明时候需要用到素数这个性质,详细可以参看《数据结构与算法分析-C语言描述》
smartcatiboy 2007-06-29
  • 打赏
  • 举报
回复
选这些是应该是效率问题把,避免计算或选择全部质数。间隔多少是个人喜好。

至于数学原理,刚刚翻了几本大学时候的书,上面写“经验得到”,估计是太深奥了~~

修正一下,D的大小应该是质数或者不被“20”以下质数整除的最合适。
唐巧 2007-06-29
  • 打赏
  • 举报
回复
哈希表的大小取决于一组质数,原因是在hash函数中,你要用这些质数来做模运算(%).
而分析发现,如果不是用质数来做模运算的话,很多生活中的数据分布,会集中在某些点上.
所以这里最后采用了质数做模的除数.

因为用质数做了模的除数,自然存储空间的大小也用质数了.因为模完之后,数据是在[0-所选质数)之间.
唐巧 2007-06-29
  • 打赏
  • 举报
回复
我想可能是考虑数据的增量吧,数据量越大,每次增加的数据可能就越多,所以开始是13,19(每次增加5),后面慢慢变成一次增加10几,20几。

这种特性和vector的自动增加容量的方式也是一样的。
lucianren 2007-06-28
  • 打赏
  • 举报
回复
应该是与HASH算法有关,做映射时,被映谢空间大小是质数。

69,386

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧