Optimization 在一个固定大小的哈希表中,使用单独的链接并使用已知数量的N个条目初始化的最佳存储桶数量是多少?

Optimization 在一个固定大小的哈希表中,使用单独的链接并使用已知数量的N个条目初始化的最佳存储桶数量是多少?,optimization,data-structures,hashtable,Optimization,Data Structures,Hashtable,HT不会重新灰化。 我们使用一个简单的除法作为散列函数。 我们假设散列函数在平均分配条目方面是有效的。 目标是有O(1)个插入、删除和查找。对于预期的使用模式,最佳存储桶数是内存消耗和哈希冲突之间的折衷 例如,如果某个内容非常常用,您可以将哈希表的大小限制为CPU缓存大小的一半,以减少“缓存未访问哈希表”的机会;这比使用更大的哈希表更快(缓存未命中率更高,哈希冲突的可能性更低)。或者;如果不经常使用它(因此,无论哈希表大小如何,您都希望缓存未命中),那么较大的大小更有可能是最佳的 当然,真正的系

HT不会重新灰化。 我们使用一个简单的除法作为散列函数。 我们假设散列函数在平均分配条目方面是有效的。
目标是有O(1)个插入、删除和查找。

对于预期的使用模式,最佳存储桶数是内存消耗和哈希冲突之间的折衷

例如,如果某个内容非常常用,您可以将哈希表的大小限制为CPU缓存大小的一半,以减少“缓存未访问哈希表”的机会;这比使用更大的哈希表更快(缓存未命中率更高,哈希冲突的可能性更低)。或者;如果不经常使用它(因此,无论哈希表大小如何,您都希望缓存未命中),那么较大的大小更有可能是最佳的

当然,真正的系统有多个缓存(L1、L2、L3)加上虚拟内存转换缓存(TLB)加上RAM限制(加上交换空间限制);真正的软件不止一个哈希表在内存层次结构中争夺资源;通常,软件开发人员不知道其他进程可能在运行(争夺物理RAM、污染缓存等),也不知道最终用户的硬件是什么(缓存大小等)。所有这些使得几乎不可能用任何方法(包括广泛的基准测试)来确定“最优”

唯一可行的选择是根据各种假设(关于使用情况、数据量以及哈希函数在实践中的性能、CPU、其他可能使用CPU和内存的东西,…)进行有根据的猜测;并使源代码可配置(例如
#define HASH_TABLE_SIZE..
),以便以后可以轻松地重新评估猜测