【问题标题】:Understanding hash tables了解哈希表
【发布时间】:2011-06-07 13:31:05
【问题描述】:

我了解某些哈希表使用“桶”,即“条目”的链表。

HashTable
  -size    //total possible buckets to use
  -count   // total buckets in use
  -buckets //linked list of entries

Entry
  -key   //key identifier
  -value // the object you are storing for reference
  -next  //the next entry

为了通过索引获取桶,你必须调用:

myBucket = someHashTable[hashIntValue]

然后,您可以迭代条目的链接列表,直到找到您要查找的条目或为空。

哈希函数是否总是返回NUMBER % HashTable.size?那样的话,你就在限度之内吗?哈希函数应该是这样工作的吗?

【问题讨论】:

    标签: c data-structures hashtable


    【解决方案1】:

    从数学上讲,散列函数通常定义为从要存储在散列表中的所有元素到范围 {0, 1, 2, .., numBuckets - 1} 的映射。这意味着理论上,您无需使用 mod 运算符将一些整数哈希码映射到有效存储桶索引的范围内。

    然而,在实践中,几乎普遍的程序员都会使用一个通用的哈希码来生成一个均匀分布的整数值,然后对其进行修改以使其适合存储桶的范围。这允许独立于哈希表中使用的桶数来开发哈希码。

    编辑:您对哈希表的描述称为链式哈希表,并使用了一种称为封闭寻址的技术。除了您所描述的之外,还有许多其他的哈希表实现。如果你很好奇 - 我希望你是! :-) - 你可能想查看the Wikipedia page on the subject

    【讨论】:

      【解决方案2】:

      什么是哈希表

      也叫hash map是一种数据结构,用来实现一个关联数组。是一种可以映射key的结构到价值观。

      它是如何工作的?

      散列表使用散列函数来计算桶或槽数组的索引,从中可以找到正确的值。

      请看下图,它清楚地解释了。

      优点:

      在尺寸良好的哈希表中,每次查找的平均成本与表中存储的元素数量无关

      许多哈希表设计还允许任意插入和删除键值对。

      在许多情况下,哈希表比搜索树或任何其他表查找结构更有效

      缺点:

      当条目数非常少时,哈希表无效。 (但是,在某些情况下,可以通过将哈希值与密钥一起保存来减轻计算哈希函数的高成本。)

      用途:

      它们广泛用于多种计算机软件,特别是关联数组、数据库索引、缓存和集合。

      【讨论】:

        【解决方案3】:

        对于散列函数的行为方式没有预定义的规则。您可以将所有值映射到索引 0 - 一个完全有效的哈希函数(性能很差,但有效)。

        当然,如果您的哈希函数返回的值超出了关联数组中的索引范围,它将无法正常工作。但这并不是说,您需要使用公式(number % TABLE_SIZE)

        【讨论】:

        • 否决这个答案的人可以提供解释吗?我猜他们不会。
        【解决方案4】:

        不,该表通常是一个条目数组。在找到相同的散列之前不要迭代它,使用散列结果(或通常散列模 numBuckets)直接索引到条目数组。这给了你 O(1) 的行为(迭代将是 O(n))。

        当您尝试存储具有相同哈希结果的两个不同对象时(称为“哈希冲突”),您必须找到一些方法来腾出空间。不同的实现在处理冲突的方式上有所不同。您可以创建具有相同散列的所有对象的链表,或使用一些重新散列存储在表的不同条目中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 2017-10-05
          • 2015-11-24
          • 1970-01-01
          相关资源
          最近更新 更多