hash table和hash function

今天在《Problem Solving with Algorithms and Data Structures》一书中读到了关于hash table与hash function相关的内容,在这里做个记录,加深印象。

概念介绍

和顺序搜索以及二分搜索相比,通过hash表查找指定内容更快,通常其时间复杂度仅为O(1)。Hash Table是一种数据集合,集合里的每一个数据都按照一定的规则确定其位置,规则称为hash function,位置称为slot。hash table就是通过hash function来确定集合里的每一个元素的位置。因此,当我们需要查找一个数据是否在集合中时,只需要通过hash function计算出该数据期望在集合中的位置,然后在集合中取出该位置上的数据进行对比。
hash function:转化数据到hash table的规则;hash table:通过hash function转化数据后形成的数据集合。

运用

比如我们有一组数据54,26,93,17,77,31。我们想运用某种hash function将这些数据放入到长度为11的hash table中。其中一个方法是运用求余法(reminder method)。简单来说就是用每一个数据对11取余,则这样一种规则可称之为hash function,定义为h(item) = item % 11。下图为运用hash function后生成的hash table。


现在假如我们想查找44这个数据是否在hash表中,我们只需要同样对44运用hash function,得余数为0,然后取出hash table中位置在0处的元素77,77不等于44,则44不在hash table中。

完美的hash function

定义:给定一组数据,通过一种hash function,可以让这组数据中的每一个元素都得到唯一的位置(slot),则称为完美的hash function。我们知道,当数据量越大,而hash table的长度较小时,很难保证每个数据在hash table中都有唯一的位置,我们只能通过不断增加hash table的长度来构造完美的hash function。有时候,多个数据通过hash function计算的结果相等时,就产生了数据冲突,无法将这些数据放在hash table不同的位置中。这个时候就引出的如何解决冲突的方法。

Collision Resolution

定义:当两个数据通过hash function计算后有相同的slot时,我们必须通过一种方法让第二个数据也有一个独立的位置取保存。解决collision的过程叫做Collision Resolution。如果hash function足够完美,则数据冲突便不会发生,但实际情况是冲突通常会发生。
一种方法是在hash table中需要空余的位置,将发生冲突的数据放在该位置。当然将冲突数据放入在hash table中空余位置也可以延伸处一套规则或算法。比如说对于每一个冲突数据,从hash table第一个位置找起,直至找到第一个空余位置,然后将该冲突数据放置在该空余位置。或者是先计算该冲突数据的实际位置,然后引入一个参数,比如+plus,或者索引位置平方等。有各种方法可以偏移该冲突位置。

总结

hash table这种数据结构的引入,让查找数据变得更简单和高效。同时为map这种数据机构奠定基础。

猜你喜欢

转载自www.cnblogs.com/jeffrey-yang/p/9861168.html
今日推荐