【问题标题】: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 ),或
可用/可能的哈希函数非常容易发生冲突,或者
-
您希望避免最坏情况下的性能损失:
您的访问模式非常专业化(例如,经常对具有特定排序顺序的“附近”键的元素进行操作),因此缓存效率对于将它们保持在内存附近的其他存储模型(例如桶排序元素),即使您不完全依赖于排序顺序,例如迭代