Data structures 何时使用哈希表?

Data structures 何时使用哈希表?,data-structures,hash,hashtable,Data Structures,Hash,Hashtable,什么情况下使用哈希表可以提高性能,什么情况下不能?使用哈希表不适用的情况有哪些?我们使用哈希表来获得O(1)的访问时间。想象一本字典。当你在寻找一个词时,如“happy”,你直接跳到“H”。这里,哈希函数由起始字母表决定。然后你就去找 当您的数据被排序或需要像排序数字一样排序时,使用哈希表是没有意义的。(字母表是按顺序排列的ABCD…XYZ,但如果您知道A和Z是在字典中切换的,则切换也没关系。) 什么情况下使用哈希表可以提高性能,什么情况下不能 如果您有理由在意,请使用哈希表和您正在考虑的任何其

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

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

当您的数据被排序或需要像排序数字一样排序时,使用哈希表是没有意义的。(字母表是按顺序排列的ABCD…XYZ,但如果您知道A和Z是在字典中切换的,则切换也没关系。)

什么情况下使用哈希表可以提高性能,什么情况下不能

如果您有理由在意,请使用哈希表和您正在考虑的任何其他工具来实现,将实际数据传递出去,并衡量哪一个性能更好

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

使用哈希表不适用的情况有哪些

主要是:

  • 不能对输入进行散列(例如,您得到的是二进制blob,不知道其中的哪些位是有效位,但您确实有一个
    int-cmp(const t&,const t&)
    函数可用于
    std::map
    ),或者

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

  • 您希望避免以下情况的最坏性能影响:

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

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

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


这个话题太宽泛了,这里无法涵盖。首先,如果你在那之后有具体的问题,那么发布一个新问题。非常感谢,吉姆。非常感谢你的回答,托尼:)非常感谢你的回答,费尔茨帕