数据结构——哈希表

本文详细介绍了哈希函数的基本思想,包括其用于将关键字映射到地址集合的特性,以及如何通过数字化处理、数字分析法、平方取中法、折叠法和除留余数法来构造哈希函数。哈希表是基于哈希函数和冲突解决策略的高效查找结构。尽管冲突难以避免,开放地址法如线性探测再散列、二次探测再散列和伪随机探测再散列等策略被用来处理冲突。通过对这些概念和方法的理解,可以提高数据存储和检索的效率。
摘要由CSDN通过智能技术生成
3.1.哈希方法基本思想
  1. 哈希函数是一个映射,即:将关键字的集合映射到某个地址集合上。
  2. 在一般情况下,容易产生“冲突”现象。key1≠key2,而f(key1)=f(key2)。虽然关键字不同,但映射的两个值得地址相等,就发生了冲突。
  3. 很难找到一个不产生冲突的哈希函数。一般情况下,只能选择恰当的哈希函数,使冲突尽可能少地产生。
3.2.哈希表的概念

根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的,地址连续的地址集(区间)上,并以关键字在地址集中的“象”作为相应记录在表中的存储位置,如此构造所得的查找表称之为**“哈希表”**。

3.3.哈希函数
  1. 构造方法
    1. 原则:
      1. 函数本身便于计算。
      2. 计算出来的地址分布均匀。
    2. 若是非数字关键字,则需先对其进行数字化处理
  2. 构造哈希函数常用的方法:
    1. 数字分析法:设关键字集合中每个关键字都是由S位数字组成(U1,U2,…,Us),分析关键字集合中的全体,并从中提取分布若干位它们的组合作为地址。

    2. 平方取中法:

      • 以关键字的平方值的中间几位作为存储地址。

      • 在这里插入图片描述

      • 不同关键字会议较高的频率产生不同的哈希地址。

    3. 折叠法:

      • 将关键字分割成若干部分,然后取它们的叠加和为哈希地址。
      • 奇数段偶数取,偶数段反序取。各段叠加后的值作为哈希地址值。
        在这里插入图片描述
    4. 除留余数法:假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为H(k) = k%p,其中%为模p取余运算。

      1. 对p的要求:p要小于等于表长m的最大素数。
  3. 选择构造方法的原则:使冲突的可能性降到尽可能小。
3.4.哈希冲突

在哈希表中,尽管构造性能良好的哈希函数可以减少冲突,但实际上冲突是不可避免的。

处理冲突是为产生冲突的地址寻找下一个哈希地址。

  1. 开放地址法

    • 为产生冲突的的地址H(key)求得一个地址序列

    • 基本思想:当关键字key的初始哈希地址h0=H(key)出现冲突时,以h0为基础,产生另一个地址h1,如果h1仍然冲突,再以h0为基础,产生另一个哈希地址h2…直到找出一个不冲突的地址hi,将对应元素存入其中。

    • 再散列函数形式:在这里插入图片描述

    • 对增量d1有三种取法:

      • 线性探测再散列:

        • d1=1,2,3…m-1;

        • di=c x i ,最简单的情况 c=1;

        • 特点:当发生冲突时,顺序查看表中的下一个单元,直到找出一个空单元或查遍全表。

        • 例子:关键字集合{19,01,23,14,55,68,11,82,36}

        • 设定哈希函数H(key) = key MOD 11(表厂=11)

        • 012345678910
          550123146811823619
          成功112136251
          失败1098765432
        • ASLsucc=(1+1+2+1+3+6+2+5+1)/9=22/9

        • 分析失败的情况:哈希函数是对11求余,那如果失败,就意味着失败的所有情况对11求余的结果,可能的范围是0,1,2…10,一共有11种不同的可能。

        • ASLunsucc=(10+9+8+7+6+5+4+3+2+1+1)/11=56/11

      • 二次探测再散列:

        • d1=12,-12,22,-22…,

        • 特点:当发生冲突时,在表的左右进行跳跃式探测,比较灵活。

        • 例子:关键字集合{19,01,23,14,55,68,11,82,36}

        • 设定哈希函数H(key) = key MOD 11(表厂=11)

        • key190123145568118236
          k%11811302053
        • 012345678910
          550123143682681911
          成功112121413
          失败59548421213
        • ASLsucc=(1+1+2+1+2+1+4+1+3)/9=16/9

        • ASLunsucc=(5+9+5+4+8+4+2+1+2+1+3)/11=4

      • 伪随机探测再散列:

        • d1=伪随机数序列
        • 具体实现时,应建立一个伪随机数发生器。
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值