理解哈希表

时间:2011-01-12 01:18:48

标签: c data-structures hashtable

据我所知,一些哈希表使用“桶”,这是“条目”的链接列表。

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]

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

哈希函数总是返回NUMBER % HashTable.size吗?那样,你保持在极限之内?哈希函数应该如何工作?

4 个答案:

答案 0 :(得分:10)

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

然而,在实践中,几乎普遍的程序员将使用通用哈希码生成均匀分布的整数值,然后将其调低以使其适合桶的范围。这允许独立于哈希表中使用的桶的数量来开发哈希码。

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

答案 1 :(得分:1)

什么是哈希表

它也被称为哈希映射是用于实现关联数组数据结构。它是一个可以映射键的结构价值观。

如何运作?

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

见下图清楚解释。

enter image description here

<强>优点:

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

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

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

<强>缺点:

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

<强>用途:

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

答案 2 :(得分:0)

哈希函数的行为方式没有预定义的规则。您可以将所有值映射到索引0 - 完全有效的散列函数(执行效果不佳,但有效)。

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

答案 3 :(得分:0)

不,表通常是一系列条目。在找到相同的哈希值之前不进行迭代,使用哈希结果(或通常哈希模数numBuckets)直接索引到条目数组中。这给你O(1)行为(迭代将是O(n))。

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