哈希表

本文详细介绍了哈希表的结构、添加和查询数据的流程,强调了快速查找的特点。讨论了如何通过哈希码计算存储位置,并分析了减少冲突的策略,包括选择合适的哈希函数和处理冲突的方法,如拉链法。同时,提到了装填因子在优化哈希表性能中的重要作用。
摘要由CSDN通过智能技术生成

一、哈希表结构

特点:快
常用结构:顺序表+链表
主结构:顺序表
每个顺序表的节点在单独引出一个链表
在这里插入图片描述

当链表个数过多,为了提高查询效率,可以使用红黑树~


二、添加数据

  • 计算哈希码
  • 计算在哈希表中的存储位置
  • 存入哈希表
    1. 情况1:一次添加成功
    2. 情况2:多次添加成功(出现了冲突,调用equals()和对应链表的元素进行比较,比较到最后,结果都是false的话,创建新节点,存储数据,并加入链表末尾)
    3. 情况3:不添加(出现了冲突,调用eauqls()和对应链表的元素进行比较,经过一次或者多次比较后,结果是true,表示重复,不添加)
    - 哈希表添加数据快(3步即可,不考虑冲突)
    - 唯一
    - 无序
    

三、查询数据

和添加数据的过程是相同的 时间复杂度O(1) 常数

  • 情况1:一次找到
  • 情况2:多次找到
  • 情况3:找不到
    • 哈希表查询数据快
    • 哈希表删除数据快
    • 哈希表更新数据快(如果更新后影响到哈希码值,就比较繁琐了,比如要删除再添加了)

四、各种类型取哈希码

  • int 取自身
  • double 取整不可以
  • string 将各个字符的编码值不可以
    abc=cba
    方案:a:97 c:98 c:99
    abc 197+298+399
    cba 1
    99+298+397
 //参考底层代码:
for(int i=0;i<value.length;i++)
	hash=31*hash+value[i];
  • Student 先各个属性的哈希码,进行某些相加相乘的运算
    int id
    string name
    int age
    double score

五、如何减少冲突

  • 哈希表的长度和表中的记录数的比例——装填因子:
    如果哈希表的空间远远大于最后实际存储的记录个数,则会造成了很大的空间浪费;但如果选取小了的话,则很容易造成冲突。
    在实际情况中,一般需要根据最终记录存储个数和关键字的分布特点来确定哈希表的大小
    还有一种情况是可能事先不知道最终需要存储的记录个数,则需要动态维护哈希表的容量,此时可能需要重新计算哈希值
    装填因子=表中的记录数/哈希表的长度(一般情况下,装填因子取经验值0.5,性能最优)

  • 哈希函数的选择
    直接定址法 平方取中法 折叠法 除留取余法(y=x%11)

  • 处理冲突的方法
    拉链法 开放地址法 再散列法 建立一个公共溢出区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值