哈希表--HashTable(散列表)

哈希表定义

是根据关键字(key)而直接访问内存存储位置的一种数据结构
访问数据的方法是通过一个函数,映射到key值对应的位置,进行数据访问
这个映射函数成为散列函数/哈希函数,存放记录的数组称为散列表/哈希表


构造哈希表的几种方法

一般常用的就是这两种,其它的就不介绍了

  1. 直接定址法–取关键字的某个线性函数为散列地址,Hash(Key)= Key 或 Hash(Key)= A*Key + B,A、B为常数。
  2. 除留余数法–取关键值被某个不大于散列表长m的数p除后的所得的余数为散列地址。Hash(Key)= Key % P。

1)第一种方法很简单,但是有很大的缺陷,
这里写图片描述
当我们的数据特别的散列,数与数之间差距特别大时,就会造成许多的空间浪费,比如1,10000,400000只有三个数据,可是我们开空间却需要开很多;
2)第二种就比第一种好,但又会有新的问题——“哈希冲突”
就是当我们取模后,两个或多个数取模得到的数相同,那么它们要对应的位置就冲突了,当然我们也有相应的办法处理


解决哈希冲突的方法

1. 线性探测&二次探测

2.哈希桶——开链法


应用:位图&布隆过滤器

如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢。

那如何解决呢?

我们都知道一个字节=8个比特位,我们可以用比特位的0/1来标识这个元素在没在集合里。这样可以节省很多空间,检索时,我们只要看看对应位置是不是都是 1 就(大约)知道它在不在集合中了,而形成的这个位列表(Bit array),也就是位图


猜你喜欢

转载自blog.csdn.net/lindaxym/article/details/80044656