【问题标题】:Why does a hash table take up more memory than other data-structures?为什么哈希表比其他数据结构占用更多内存?
【发布时间】:2014-04-25 11:51:49
【问题描述】:

我一直在阅读有关hash tables、字典等的内容。我看过的所有文献和视频都暗示哈希表具有空间/时间权衡属性。

我很难理解为什么哈希表比具有相同数量的总元素(值)的数组或列表占用更多空间?它与实际存储散列键有关吗?

就我的理解和基本术语而言,哈希表需要一个键标识符(比如一些字符串),通过一些哈希函数传递它,该函数会输出一个数组或其他数据结构的索引。除了在数组或表中存储对象(值)的明显内存使用之外,为什么哈希表会占用更多空间?我觉得我错过了一些明显的东西......

【问题讨论】:

    标签: memory data-structures dictionary hashtable space-complexity


    【解决方案1】:

    正如您所说,这完全取决于查找时间和空间之间的权衡。底层数据结构具有的空间(桶)数量越多,散列函数可以存储每个项目的位置数量就越多,因此发生冲突的可能性就越大(因此比恒定时间性能更差)降低了。然而,拥有更多的桶显然意味着需要更多的空间。项目数与桶数之比称为负载因子,在这个问题中有更详细的解释:What is the significance of load factor in HashMap?

    minimal perfect hash function 的情况下,您可以实现在 n 个桶中存储 n 个项目的 O(1) 性能(负载因子为 1)。

    【讨论】:

    • 对不起,我觉得我有点厚,但说在最坏的情况下(空间),每个桶存储 1 个项目。这不是像数组一样有效,因此与数组大小相同,而不是更多?
    • 是的,在理想情况下,每个存储桶恰好存储 1 个项目,因此 N 个项目映射到 N 个存储桶。然而,在实践中,几乎从来没有这种情况,因为随着占用的桶数被填满,任何合理的哈希表实现都会“增长”底层数据结构以包含更多桶,以最小化两个项目哈希到相同的可能性空间。如果空间比时间更重要,那么哈希表可能不是您想要的。
    • 但是所有存储桶中的项目总数仍然是 N,那为什么会比 N 个项目的数组占用更多空间呢?
    • 您是否暗示我们添加了额外的可以保持为空的存储桶,并且与这些存储桶相关的开销是哈希表占用的额外内存?
    • @ArmenSafieh-Garabedian 是的,这是额外使用的主要原因,尽管您可能还必须考虑 collision resolution method 使用的额外内存,例如链接列表。
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 2011-07-30
    • 2015-03-05
    • 2016-10-31
    • 2011-08-06
    • 2012-08-14
    • 2020-10-21
    • 2019-12-03
    相关资源
    最近更新 更多