Performance OCaml中是否有Hashtbl的最佳大小?

Performance OCaml中是否有Hashtbl的最佳大小?,performance,ocaml,Performance,Ocaml,假设我需要存储20个键/值,使用2的幂(例如32)会更有效吗?我读过一篇文章,作者使用了251的大小(对于未知数量的键/值),这只是一个随机数,还是背后有一些原因 我说的是Hashtbl.create n中的n,你问的问题并不完全清楚。由于您按名称询问了Hashtbl,因此我假设您谈论的是标准哈希表模块。此模块始终以2次幂的大小分配表。所以你不用担心 哈希表有两个基本的“额外好”大小。二的幂是好的,因为它们使你很容易找到你的散列桶。散列过程的最后一步是将散列值取为表大小的模。如果表的大小是二的幂

假设我需要存储20个键/值,使用2的幂(例如32)会更有效吗?我读过一篇文章,作者使用了251的大小(对于未知数量的键/值),这只是一个随机数,还是背后有一些原因


我说的是
Hashtbl.create n中的
n
,你问的问题并不完全清楚。由于您按名称询问了
Hashtbl
,因此我假设您谈论的是标准哈希表模块。此模块始终以2次幂的大小分配表。所以你不用担心

哈希表有两个基本的“额外好”大小。二的幂是好的,因为它们使你很容易找到你的散列桶。散列过程的最后一步是将散列值取为表大小的模。如果表的大小是二的幂,这个模运算可以通过掩蔽运算很快完成。我不确定这在当今世界是否重要,除非您的哈希函数本身计算速度非常快


第二个好值是素数。素数是好的,因为它倾向于将值分散到整个表中。如果哈希值恰好是某个数的倍数,则这将导致哈希表中出现密集的簇,除非哈希表大小相对于主要数为素数。一个大的素数对于几乎所有的事物来说都是相对素数,所以它会阻止聚类。所以,251是好的,因为它是一个素数。

不完全清楚你在问什么。由于您按名称询问了
Hashtbl
,因此我假设您谈论的是标准哈希表模块。此模块始终以2次幂的大小分配表。所以你不用担心

哈希表有两个基本的“额外好”大小。二的幂是好的,因为它们使你很容易找到你的散列桶。散列过程的最后一步是将散列值取为表大小的模。如果表的大小是二的幂,这个模运算可以通过掩蔽运算很快完成。我不确定这在当今世界是否重要,除非您的哈希函数本身计算速度非常快


第二个好值是素数。素数是好的,因为它倾向于将值分散到整个表中。如果哈希值恰好是某个数的倍数,则这将导致哈希表中出现密集的簇,除非哈希表大小相对于主要数为素数。一个大的素数对于几乎所有的事物来说都是相对素数,所以它会阻止聚类。251很好,因为它是一个素数。

谢谢,我说的是
Hashtbl中的
n
。create n
。Hashtbl在内部将其四舍五入到2的下一次幂。因此,只需选择任何一个合理的数字,接近大多数情况下预期的最大大小。Jeffrey,你是对的,哈希表大小现在被四舍五入到2的幂,但这是新的。按照我记忆中的方式,旧哈希表的大小完全是由程序员指定的,如果增加,新的大小将被计算为2*old_size+1。谢谢,我不知道这一点。我刚刚检查了4.00.0的源代码(我手头正好有)。谢谢,我说的是
Hashtbl.create n
中的
n
。Hashtbl在内部将其四舍五入到下一个2的幂。因此,只需选择任何一个合理的数字,接近大多数情况下预期的最大大小。Jeffrey,你是对的,哈希表大小现在被四舍五入到2的幂,但这是新的。按照我记忆中的方式,旧哈希表的大小完全是由程序员指定的,如果增加,新的大小将被计算为2*old_size+1。谢谢,我不知道这一点。我刚刚检查了4.00.0源代码(碰巧我手头有)。