数据结构中的哈希表(数据结构哈希算法)

今日新闻2024-03-02 19:00:20自考教育网

哈希表:哈希存储结构。哈希存储的基本思想是建立键码字与其存储位置的对应关系,或者说数据的存储地址是由键码的值决定的。这样不用比较,就可以在一次访问中得到被搜索元素的搜索方法的优点:搜索速度极快(O(1)),搜索效率与元素个数n无关,哈希表存储的是由键和值组成的数据。例如,我们将每个人的性别存储为数据,键作为人名,值作为对应的性别。

数据结构中的哈希表(数据结构哈希算法)

为了与哈希表进行比较,我们首先将这些数据存储在一个数组中。

这里,准备了六个盒子,即长度为6的数组来存储数据。假设我们需要查询Ally的性别。由于我们不知道Ally的数据存放在哪个盒子里,所以只能从头说起查询。这种操作称为线性搜索。

存储在盒子0中的密钥是乔而不是盟友。

盒子1也不是盟友。

同样,在方框2和方框3中,它也不是盟友。

当我们找到4号盒子时,我们发现数据的关键是Ally。当我们取出键的对应值时,我们知道Ally的性别是女(F)。数据越多,线性搜索代价越长时间。可以看出,查询的数据比较费时,这里尝试数据存储数据是不合适的。

为了解决这个问题,我们可以使用哈希表来解决这个问题。首先,准备数据。这一次,我们使用五个数据盒来存储数据。

我们试图让乔。

使用哈希函数计算Joed的键,即字符串“Joe”的哈希值。结果是4928。

将得到的哈希值除以数组5的长度,求余数。这种余数运算称为“模”运算。这里mod运算的结果是3。

因此,我们将Joe的数据保存到数组的Box 3中,重复前面的操作,并将其他数据也保存到数组中。

Sue key的哈希值是7291,MOD 5的结果是1。将Sue的数据保存到方框1中。

Dne key的哈希值是1539,MOD 5的结果是4。将Dne数据存储在方框4中。

Nell key的哈希值是6276,mod 5的结果是1。它应该存储在数组的box 1中,但是Sue的数据已经存储在box 1中。这种存储位置重复称为“冲突”。

在这种情况下,链表可以用来存储现有数据之后的新数据。

Ally key的哈希值是9143,mod 5的结果是3。它本应该存储在数组的box 3中,而Joe的数据已经可用了,所以用链表来存储后面Ally的数据。

Bob的key的哈希值是5278,mod 5的结果是3。本来应该存储在数组盒子3中,但是盒子3中已经有Joe和Ally的数据了,所以使用链表,Bob的数据继续存储在Ally的后面。这样存储所有数据,哈希表就完成了。

接下来我们来解释一下数据查询方法。假设我们想要查询丹的性别。

为了知道Dan存放在哪个盒子里,我们需要先计算Dan的哈希值,然后对其进行mod运算。最终结果是4,所以我们知道它存储在box 4中。

看方框4,可以知道里面的数据的key和Dan一致,所以拿出相应的值。所以我们知道丹的性别是男(男)

所以,我要怎么做查询Ally的性别?为了找到它的位置,首先要计算Ally key的哈希值,然后对其进行mod运算,最后得到3的结果。但是,框3中的数据键是Joe而不是Ally。此时,我们需要对Joe的链表进行线性搜索。

于是我们找到了有key Ally的数据,取出了它对应的值,知道Ally是女的(F)。

在哈希表中,我们可以使用哈希函数来快速访问目标数组。如果存在哈希冲突,则使用链表进行存储。这样无论是什么数据,都可以灵活应对。如果数组的空间太小,在使用哈希表时,容易发生冲突,线性查找的频率也会更高。反之,如果数组的空间太大,就会出现很多空盒子,造成内存的浪费。因此,为数组设置合适的空间非常重要。注意:在存储数据的过程中,如果出现冲突,可以使用链表在已有数据之后插入新数据来解决冲突。这种方法称为“链地址法”。除了链地址法,还有几种解决冲突的方法,其中“开发地址法”被广泛使用。这种方法意味着当冲突发生时,会立即计算互补地址(数组上的位置),并将数据存储在其中。如果仍然有冲突,计算下一个补充后的地址,直到有可用的地址。补码后地址可以通过多重散列函数或线性检测方法来计算。推荐文章:

数据结构:链表《概念》数据结构:链表《单链表》数据结构:链表《双链表》数据结构:哈希表《概念》数据结构:哈希表

相关推荐