使用单独链接并使用已知数量 N 的条目初始化的固定大小哈希 Table 中的最佳存储桶数量是多少?
What would be the optimal amount of buckets in a fixed sized Hash Table using separate chaining and initialized with a known number N of entries?
HT 没有重新哈希。
我们使用简单的除法作为哈希函数。
我们假设哈希函数在平均分配条目方面是有效的。
目标是O(1)的插入、删除和查找。
对于预期的使用模式,最佳桶数是内存消耗和哈希冲突之间的折衷。
例如,如果某些东西被非常频繁地使用,您可以将散列 table 的大小限制为 CPU 缓存大小的一半,以减少“缓存未访问”的机会散列table”;这比使用更大的散列 table 更快(缓存未命中更严重,散列冲突的可能性更低)。或者;如果它不经常使用(因此无论散列 table 大小如何,您都希望缓存未命中),那么较大的大小更有可能是最佳的。
当然,真实系统有多个缓存(L1、L2、L3)加上虚拟内存转换缓存(TLB)加上 RAM 限制(加上交换 space 限制);真正的软件不止一个散列 table 在内存层次结构中竞争资源;而且软件开发人员通常不知道其他进程可能是什么 运行(竞争物理 RAM、污染缓存等)或任何最终用户的硬件是什么(缓存的大小等)。所有这些使得几乎不可能用任何方法(包括广泛的基准测试)确定“最佳”。
唯一可行的选择是根据各种假设(关于使用、数据量和散列函数在实践中的好坏,CPU,其他可能的假设)进行有根据的猜测正在使用 CPUs 和内存,...);并使源代码可配置(例如 #define HASH_TABLE_SIZE ..
),以便您稍后可以轻松 re-assess 猜测。
HT 没有重新哈希。 我们使用简单的除法作为哈希函数。 我们假设哈希函数在平均分配条目方面是有效的。 目标是O(1)的插入、删除和查找。
对于预期的使用模式,最佳桶数是内存消耗和哈希冲突之间的折衷。
例如,如果某些东西被非常频繁地使用,您可以将散列 table 的大小限制为 CPU 缓存大小的一半,以减少“缓存未访问”的机会散列table”;这比使用更大的散列 table 更快(缓存未命中更严重,散列冲突的可能性更低)。或者;如果它不经常使用(因此无论散列 table 大小如何,您都希望缓存未命中),那么较大的大小更有可能是最佳的。
当然,真实系统有多个缓存(L1、L2、L3)加上虚拟内存转换缓存(TLB)加上 RAM 限制(加上交换 space 限制);真正的软件不止一个散列 table 在内存层次结构中竞争资源;而且软件开发人员通常不知道其他进程可能是什么 运行(竞争物理 RAM、污染缓存等)或任何最终用户的硬件是什么(缓存的大小等)。所有这些使得几乎不可能用任何方法(包括广泛的基准测试)确定“最佳”。
唯一可行的选择是根据各种假设(关于使用、数据量和散列函数在实践中的好坏,CPU,其他可能的假设)进行有根据的猜测正在使用 CPUs 和内存,...);并使源代码可配置(例如 #define HASH_TABLE_SIZE ..
),以便您稍后可以轻松 re-assess 猜测。