数据结构与算法——深入理解哈希表

哈希表是一种高效的存取数据结构,通过哈希函数将关键字关联到数组下标。其优点包括快速插入和查找,但缺点在于不易扩展且满载时性能下降。哈希化是关键,通过映射减少存储空间。处理冲突的方法有开放地址法(线性探测、二次探测、再哈希法)和链地址法。链地址法在数据项较多时仍能保持较好的性能,但在实现上较复杂。
摘要由CSDN通过智能技术生成

哈希表

哈希表是一种数据结构,基于数组实现,但存取方式和数组不同。
哈希表可以认为是一种特殊的数组,一个重要的特性是“数据项的关键字与数组下标有关联”。(数据项的关键字经过简单计算便可得到数组下标,从而实现快速存取)


优点与缺点

  • 优点
    • 提供快速的插入操作和查找操作,时间复杂度接近O(1)。
    • 编程实现相对容易。
  • 缺点
    • 基于数组,一是创建后难于扩展,二是基本填满时性能下降严重。
    • 难以进行数据有序遍历。

因此,当可以提前预测数据量的大小不需要有序地遍历数据时,使用哈希表具有巨大的优势。


哈希化

  • 什么是哈希化?

    • 哈希化概念:通过映射方法(即哈希函数)把一个巨大的整数范围转化为一个可接受的数组范围中。对哈希表来说是把较大的关键字值范围压缩成较小的数组下标范围。
    • 哈希化过程(哈希函数步骤)
      • 具有唯一标识作用的原始数据—s1—>合适的整数关键字—s2—>数组下标
      • s1: 有些原始数据虽然具备唯一标识特征,但可能不是数字(如字符串),也有可能存在冗余数字位(如校验位),需要将其处理为合适的整数关键字。属于预处理过程。
      • s2: 一般对整数关键字取余得到数组下标。
  • 为什么要哈希化?

    • 数据存储快速
      • 整数关键字与数组下标存在映射关系,可以通过关键字获取数组下标直接存取数据,而不用像普通数组那样通过遍历来存取数据。
    • 节省空间
      • 将大范围整数压缩成小范围,需要的数组长度变小了。
  • 哈希函数的要求

    • 能将整数关键字范围转化为数组下标值,即关键字要和数组下标要有关联。
    • 简单能快速计算,即各种运算尽量要少。
    • 大范围的数字经过哈希映射后应随机地分布在这个小的数字范围。
      • 保证大部分关键字不能被数组容量整除,否则关键字经哈希函数映射后容易在某处聚集,影响存取效率。
  • 哈希函数的形式

    • 关键字范围足够小且组织比较连续时
      • 可以不用哈希函数映射,关键字直接作为数组的下标。
    • 关键字随机分布时
      • key % arraySize(其中arraySize是数组容量),这种取余操作效果比较好。
    • 关键字非随机分布时:(一般需要对关键字进行预处理,再取余)
      • 不要使用关键字中无效的数据位。关键字一般是位数比较高的整数,有些位对唯一标识这个关键字不起作用,如校验位,应舍弃这些位。
      • 折叠关键字。如哈希表数组容量为1000,对于一个原始关键字123456789,可折叠为123+456+789=1368,再对容量1000取余得到数组下标368。每组包含几个数字应该根据数组容量来选择。
  • 举例说明

    • 有时候虽然整数范围很大,但实际的数据项个数却相对较少。比如说一组整数 0,100,1000&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值