C++-散列表

261 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天点击查看活动详情

什么是散列表

是一种数据结构 他主要是将键值 通过一个哈希函数 映射到表中的一个位置实现快速查找 哈希函数: 例如 键值%17 = 表中的下标位置 键值2004 通过哈希函数后 2007%17 就会得到表中下标的位置 这就是哈希表映射的方法 但是很明显这个值是会重复的 就产生了哈希冲突

如何解决哈希冲突

链表式解决 HashMap的哈希冲突解决方法

请添加图片描述 就用链表的方法 当发生冲突的时候就放到next的位置 请添加图片描述 请添加图片描述

有点

处理冲突简单 平均查找长度较短 用于没办法确定表长度 因为各节点的链式都是动态申请的 删除结点的操作易于实现。只要简单地删去链表上相应的结点即可

缺点

会浪费空间 指针占用较大空间时,会造成空间浪费,若空间用于增大散列表规模进而提高开放地址法的效率。

开放地址

线性探测

就是如果重复了发生了冲突 就往后一格放 请添加图片描述请添加图片描述 结果就是这样 那么最开始15%13 是2 2是空的就放在2那 然后2%13 发现2被占用了 就放在3的位置
再38%13 是12 就放12那 28%13是2 发现2被占用了 往后移发现3也被占用了 再往后移放在4 4%13是4 发现4被占用了就放5 重点! 12%13 发现12被占用了 就循环放到最前面 0的位置

平方探测

发生冲突了 第一次就是+1 第二次-1 第三次+2^2^ 第四次-2^2^ 第五次3^2^以此类推

双哈希

就是又设置了一个哈希函数 有两个哈希函数 当发生冲突的时候就使用第二个哈希函数 请添加图片描述 请添加图片描述 对2进行哈希的时候就会发现2位置有了 就进行第二个哈希7-(2%7) = 5就在第一个哈希结果的基础上+5 也就是2+5=7如果7还是有了 就再+5

哈希表要满了怎么办

当哈希表存储量超过70%就会再次创建一个新的哈希表 新表的尺寸是原表的两倍以上 一般都选个质数 最后再把之前的数据通过哈希计算放到新表中 请添加图片描述