何时使用哈希表?

时间:2016-03-23 22:09:39

标签: data-structures hash hashtable

使用哈希表的情况有哪些可以提高性能,何时不提高?什么情况下使用哈希表不适用?

2 个答案:

答案 0 :(得分:3)

  

使用哈希表的情况有哪些可以提高性能,何时不提高?

如果您有理由关心,请使用哈希表以及您正在考虑的任何其他内容,将实际数据放在一起,并衡量哪些表现更好。

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

  

使用哈希表的情况不适用?

主要是在:

  • 输入无法进行哈希处理(例如,您已经给出了二进制blob,并且不知道哪些位有重要位置,但您确实有int cmp(const T&, const T&)个功能您可以使用std::map)或

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

  • 您希望避免出现以下情况的最糟糕表现:

    • 处理大量的哈希冲突元素(可能"设计"有人试图崩溃或放慢你的软件速度)

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

  • 您的访问模式非常专业(例如,频繁操作的元素具有"附近的#34;以某种特定的排序顺序),这样对于保留它们的其他存储模型,缓存效率更好附近的内存(例如桶分类元素),即使你并不完全依赖于例如的排序顺序迭代

答案 1 :(得分:2)

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

在订购数据或需要排序数字时使用哈希表是没有意义的。 (字母表是按顺序排列的ABCD .... XYZ,但是如果你切换A和Z就没关系,只要你知道它已经在你的字典中切换了。)