1. 首先我们要知道哈希是什么? 哈希(Hash)一般叫做散列,意思就是把一堆任意长度的字符串、数字或者二进制输入通过一定的算法(非常多的哈希算法)生成固定长度的一个数字(字符串)。因为算法原因,不同的输入就会得到不同的哈希值。 2. 其次我们要知道哈希表是什么? 哈希表(Hash Table)一般叫做散列表,就是通过把键值计算出Hash值后,通过Hash值映射到表里面的某个位置。那么同样的键值,下次访问或者修改都是同一个映射位置,不同的键值因为计算出Hash值不一样映射的位置也会不同。 3. 然后什么是哈希冲突(哈希碰撞)? 因为哈希值是通过一定算法生成的,那么就有一定的可能出现不同的输入得到的Hash值是一样的,就算我们可以通过调整算法尽量减少这种情况,但是也不可完全避免。发生这种情况后,我们就会出现两个不同的键值被映射到同一个位置了,这就是哈希冲突。 怎么解决? 开放定址 1、线性探测 出现Hash冲突后,依次查询这个键值后面的地址,找到一个空的或者全部查完没找到。 2、二次探测 出现冲突后,对这个键值后面的地址或者前面的地址进行平方后查询。 再哈希 构建多个Hash算法函数,出现冲突就用其他Hash算法进行Hash,直到不冲突为止。 链表法 也叫开链,C++的map就是使用这种方法,就是对每个位置新增一个链表,添加元素到链表中,只要链表元素不多,效率都还行。
点赞 评论

相关推荐

牛客网
牛客企业服务