哈希表是一种通过哈希函数将键映射到值的数据结构,能实现高效的插入、查找和删除操作。而哈希冲突(也叫哈希碰撞)是哈希表中非常关键的概念,指的是不同的键通过哈希函数计算后,得到了相同的哈希地址,也就是不同的输入被哈希函数映射到了哈希表中的同一个位置。
哈希冲突产生的原因
哈希函数的本质是将一个较大的键空间映射到一个较小的哈希表地址空间。例如,可能有无数个不同的字符串,但哈希表的地址空间是有限的,所以必然会有多个不同的键被哈希函数映射到同一个地址,从而产生冲突。
解决哈希冲突的常见方法
1. 开放寻址法
线性探测法:当发生哈希冲突时,按照顺序依次探测哈希表中的下一个位置,直到找到一个空位置来存储元素。例如,哈希地址为 h ,冲突后依次探测 h + 1, h + 2, \dots (循环探测)。这种方法的缺点是容易产生“聚集”现象,即连续的冲突区域会越来越大,影响后续的插入和查找效率。
二次探测法:冲突时,探测的位置是 h + i^2 ( i = 1,2,3,\dots )或者 h - i^2 等二次方相关的位置。相比线性探测,能在一定程度上减少聚集现象,但探测的位置是有限的。
拉链法:把具有相同哈希地址的记录放在同一个单链表中,称为同义词链表。若有m个哈希地址,则有m个单链表,并用数组来存放各个链表的头指针,凡是哈希地址相同的记录都被以结点方式插入到对应的头结点的单链表中。
先统计第一个数组中各元素出现的次数,存在字典里。然后遍历第二个数组,如果元素在字典里且计数大于0,就加入结果,同时字典中该元素计数减1,这样得到的就是两数组元素出现次数取较小值的交集
用哈希表统计 nums1 中元素及出现次数,遍历 nums2,如果元素在哈希表且次数>0,加入结果,同时哈希表中该元素次数减1,最后去重得到交集
用长度为26的数组统计字符串s各字母出现次数,再遍历字符串t,对应字母次数减1,最后检查数组是否全为0,全为0则是字母异位词。