哈希表与树笔记(一)

      数组(顺序表):寻址容易

      链表:插入删除容易

      哈希表:寻址容易,插入删除也容易的数据结构

 

 

什么是哈希表?

      哈希表也叫散列表是根据关键码值(key value)而直接进行访问的数据结构,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速度。

      关键码值(key value)也可以当成key的hash值 通过散列函数将key映射到hash值(散列函数可自己设计)

      存放记录的数组也叫散列表

 

 

hash冲突  hash值碰撞的解决方法

     1、链地址法(拉链法 hashMap在jdk1.8之前用的这种方法)

      链地址法其实就是HashMap中用的策略。

      原理是在HashMap中同样哈希值的位置以一串链表存储起来数据,

      把多个原始值不同而哈希结果相同的数据以链表存储起来。

      jdk1.8之后定义了阈值(链表最长长度允许的值),超出了链表就改为了红黑二叉树

      2、开放定址法

      当发生地址冲突时,按照某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止。

      开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
      其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。
      如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),称二次探测        再散列。
      如果di取值可能为伪随机数列。称伪随机探测再散列。

      3、再哈希法

      当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加

 

 

哈希的装填因子

为什么需要装填因子?因为数据越接近数组的最大值,可能产生冲突的情况就越多(HashMap的是0.75)

装填因子:a=n/m  其中n 为关键字个数,m为表长。

加载因子是表示Hsah表中元素的填满的程度.若:加载因子越大,填满的元素越多,好处是,空间利用率高了,但:冲突的机会加大了.反之,加载因子越小,填满的元素越少,好处是:冲突的机会减小了,但:空间浪费多了.

冲突的机会越大,则查找的成本越高.反之,查找的成本越小.因而,查找时间就越小.

因此,必须在 "冲突的机会"与"空间利用率"之间寻找一种平衡与折衷. 这种平衡与折衷本质上是数据结构中有名的"时-空"矛盾的平衡与折衷.

 

Hash表扩容需要消耗大量的空间和性能

应用:电话号码,字典,qq好友,微信好友

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值