【问题标题】:Indexing hash tables索引哈希表
【发布时间】:2010-06-28 17:40:23
【问题描述】:

我刚刚开始学习哈希表,到目前为止,我知道您将要哈希的对象通过哈希函数,然后使用它返回的索引来获取您想要的相应对象。不过有一点我不明白:

您使用什么结构来存储对象,以便您可以使用散列函数返回的代码快速索引它们?我唯一能想到的就是使用一个数组,但是要处理所有的键,你必须分配一个 9999999999999 大的元素或类似的东西。还是像遍历链表或其他东西并将每个元素中的 ID 与该哈希函数中的键进行比较一样简单?如果是这样,那似乎有点低效,不是吗?

【问题讨论】:

  • 在数组方案中,您使用一个哈希函数,该函数返回一个在数组大小范围内的值。因此,您没有 1 万亿个数组元素,您将散列函数限制在合理数量的存储桶中(256?10240?取决于使用情况)。通常每个桶实际上是它自己的链表,所以你可以处理冲突。但这种设计在某种程度上取决于您使用的冲突解决算法。

标签: c++ function hashtable


【解决方案1】:

通常,您使用数组(或类似向量的东西)。您选择一个合理的大小(例如,比您期望的项目数大 20%)和一些解决冲突的方法,当/如果两个键产生相同的哈希值(例如,这些位置中的每一个都是散列到该值的项目)。

【讨论】:

    【解决方案2】:

    是的,您通常使用数组,但随后您会做一些事情:

    1. 通过使用哈希码的余数除以数组大小,将哈希码转换为数组索引。

    2. 您将数组的大小设置为素数,这样可以提高步骤 #1 的效率(一些哈希算法需要这样做才能获得均匀分布)

    3. 您想出了一个处理哈希冲突的设计。 @JerryCoffin 的回答为您提供了更多详细信息。

    【讨论】:

      【解决方案3】:

      一般是数组。如果数组大小为N,则使用哈希函数返回范围0..(N-1) 内的数字。例如,对哈希函数结果应用模 N。 然后在Wikipedia.中使用碰撞解析

      【讨论】:

      • 我不是在问冲突解决,我是在问这些东西存储在什么类型的数据结构中以及如何快速索引它们。
      猜你喜欢
      • 1970-01-01
      • 2017-03-26
      • 2012-11-10
      • 1970-01-01
      • 2010-09-28
      • 2012-01-03
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多