哈希表

70 阅读2分钟

什么是哈希表?

现在有一个对象,对象上有key和value。你想知道这些key和value是怎么存储的吗?

一种存储方式是数组

但是数组的下标都是连续的数字不符合要求.

还有一种是链表

但是链表有个缺点是查找的时候,需要连续遍历进行查找,这样效率不高。
然后前辈们想到了一种新的数据结构,叫哈希表。

什么是哈希表

哈希表就是用下标key,通过一个哈希函数,生成一个值,把这个值作为数组的下标,value作为值进行存储。用数组进行查找,是为了用数组查找快的特点,用哈希函数是为了解决数组的下标是数字的问题。 一般如果存储10000条数据,存储空间要比这个大,一般最少要20000,当然你哈希函数如果用的好,空间越小越好。

然后解释下哈希函数

哈希函数就是用key通过一些列的算法来生成一个值得函数。这一些列的算法是你自己定义的。 然后再用key生成值得时候,不可避免的会有不同的key,生成相同值得问题,导致数组的下标重复,值进行覆盖。这个问题叫做冲突。伟大的前辈怎么可能没有想到这个问题呢。下面说下解决方法

链地址法

现在解释什么是链式地址法,比如现在有两个数字,82,32.你的哈希函数是用数字的最后一位作为key(为了故意制造冲突,实际上没那么简单)。这个时候,82和32的下标都是2,出现了冲突。你用2作为下标,用value作为值时,会出现覆盖。这时,你可以用一个数组作为这个2下标的数组值,而不是把字符串作为数组值。当你用哈希函数知道这个地方的时候,再去数组中进行下遍历找到。这个数组的内容一般不会特别多。所以查找也很快。

开放地址法

还有一种解决冲突的办法是开放地址法,指的是当遇到下标重复的时候。用一个新的算法去这个值得附近查找空余的地方进行填充。这个新的算法有线性查找,线性查找容易出现聚集的问题,这个时候会影响效率,因为链表的查找比较耗时。然后前辈们有了再哈希的解决方法,就是你的查找方法时,再用你的这个key,通过一个新的哈希函数进行计算,找到新的下标进行填充值。