为什么我的程序在增加哈希表的大小时会变慢

时间:2014-08-12 19:02:06

标签: c hashtable

我使用杂音哈希在哈希表中存储150,000个单词 我正在使用线性探测来解决程序中的冲突。我认为如果哈希表的大小很大,那么就会有大量的空闲空间,而且我不需要长时间探测。但奇怪的事情发生了。当哈希表的大小为250,000时,我获得了最快的运行时间。之后运行时间增加。为什么会这样?

2 个答案:

答案 0 :(得分:2)

虽然Robert涵盖了一般性问题(Locality),但问题可能是 Spatial Locality

当你有一个较小的哈希表时,它适合缓存。当您有一个非常大的哈希表时,每次查找都会出现页面错误的高风险。如果您出现页面错误,那么您的操作系统需要暂停执行,直到内存管理单元可以将块从较慢的访问内存复制到更靠近CPU的缓存。

在极端情况下,较慢的访问内存甚至可能是操作系统提供的磁盘上资源。

答案 1 :(得分:1)

"散列表通常表现出较差的引用位置 - 也就是说,要访问的数据在内存中看似随机分布。由于哈希表会导致跳转的访问模式,因此可能会触发导致长时间延迟的微处理器缓存未命中。如果表格相对较小且密钥紧凑,则使用线性搜索搜索的数组等紧凑数据结构可能更快。最佳性能点因系统而异。" - https://en.wikipedia.org/wiki/Hash_table