【问题标题】:When to use hash tables?什么时候使用哈希表?
【发布时间】:2016-07-11 10:08:19
【问题描述】:

在哪些情况下使用哈希表可以提高性能,而在哪些情况下不能?以及不适用哈希表的情况有哪些?

【问题讨论】:

标签: data-structures hash hashtable


【解决方案1】:

我们使用哈希表来获得 O(1) 的访问时间。想象一本字典。当您在寻找一个词时,例如“快乐”,您会直接跳到“H”。这里的散列函数由起始字母决定。然后你寻找

当您的数据被排序或需要像排序数字一样排序时,使用哈希表是没有意义的。 (字母顺序为 ABCD....XYZ,但如果您切换 A 和 Z,只要您知道它已在您的字典中切换。)

【讨论】:

  • 非常感谢您的回答,毡板
【解决方案2】:

在哪些情况下使用哈希表可以提高性能,哪些情况不能?

如果您有理由关心,请使用哈希表和您正在考虑的任何其他方法来实施,将您的实际数据通过,并衡量哪个表现更好。

也就是说,如果哈希表具有您需要的操作(即您不希望按排序顺序对其进行迭代,或者将其快速与另一个哈希表进行比较),并且具有数百万或更多(数十亿、数万亿...... .) 元素,那么它可能是您的最佳选择,但很大程度上取决于哈希表的实现(尤其是封闭式哈希与开放式哈希的选择)、对象大小、哈希函数质量和计算成本/运行时间)、比较成本,不同缓存级别的计算机内存性能的怪异......简而言之:在重要的时候,即使是有根据的猜测也无法成为比测量更好的选择。

以及在哪些情况下使用哈希表不适用?

主要是在:

  • 无法对输入进行散列处理(例如,您获得了二进制 blob,但不知道其中哪些位是重要的,但您确实有一个 int cmp(const T&, const T&) 函数可以用于 std::map ),或

  • 可用/可能的哈希函数非常容易发生冲突,或者

  • 您希望避免最坏情况下的性能损失:

    • 处理大量哈希冲突元素(可能是由试图使您的软件崩溃或减慢速度的人“设计”的)

    • 调整哈希表的大小:除非预先调整到足够大(使用过多内存时这可能会造成浪费和缓慢),否则大多数实现会不时地超出用于哈希表的数组,然后分配一个更大的数组并复制内容:这可以使导致这种重新散列的特定插入比正常的 O(1) 行为慢得多,即使平均值仍然是 O(1);如果您在所有情况下都需要更一致的行为,则可以使用平衡二叉树之类的东西

  • 您的访问模式非常专业化(例如,经常对具有特定排序顺序的“附近”键的元素进行操作),因此缓存效率对于将它们保持在内存附近的其他存储模型(例如桶排序元素),即使您不完全依赖于排序顺序,例如迭代

【讨论】:

  • 非常感谢您的回答,托尼 :)
猜你喜欢
  • 1970-01-01
  • 2015-03-05
  • 2012-02-08
  • 2011-01-21
  • 2014-11-04
  • 2022-12-03
  • 2011-11-18
  • 1970-01-01
相关资源
最近更新 更多