#打基础# 哈希表简单应用 (1)

先看段代码:

  Scanner input = new Scanner(System.in);
  Map map = new HashMap();       //定义Map对象
  map.put("apple", "新鲜的苹果");      //向集合中添加对象
  map.put("computer", "配置优良的计算机");
  map.put("book", "堆积成山的图书");
  map.put("time", new Date()); 
  //自定义输入key和value
  System.out.println("请输入key:");
  String key = input.next();
  System.out.println("请输入value:");
  String value = input.next();
  //存入哈希
  map.put(key, value);
  //获取哈希表中的key集合
  Set keySet = map.keySet();
  System.out.println("表中现有key:"+keySet);
  //查询想查的key值
  System.out.print("请输入你要查询的key:");
  key = input.next();
  //判断是否包含指定的键值
  boolean contains = map.containsKey(key);    
  if (contains) {//如果条件为真
   System.out.println("__________键名" + key+"_________"); 
   System.out.println("信息为:" + map.getOrDefault(key, value));
  } else {
   System.out.println("__________在Map集合中不包含键名" + key+"_________");
  }

因为题目:https://blog.csdn.net/floris_lovelace/article/details/80849477
哈希表以空间换速度,所以就开始看哈希表怎么玩,哈希表到底是什么东西。


哈希表是什么:

哈希表是一种与数组、链表等不同的数据结构,与他们需要不断的遍历比较来查找的办法不同。
(当我知道key值以后,我就可以直接计算出这个元素在集合中的位置,根本不需要一次又一次的查找!)

哈希表设计了一个映射关系f(key)= address,根据key来计算存储地址address,这样可以1次查找,f既是存储数据过程中用来指引数据存储到什么位置的函数,也是将来查找这个位置的算法,叫做哈希算法

简单来说就是:记录的存储位置=f(关键字)

哈希函数的作用:

是提供的 key转化数组下标 的关键。
数组下标所对应的 空间存储着value。

哈希函数把Key通过一个固定的算法函数既所谓的哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余。

常用哈希函数:

元素特征转变为数组下标的方法就是散列法。散列法当然不止一种,下面列出我理解的两种:
(其实还有一种斐波那契(Fibonacci)散列法,但是脑袋疼,就先不看了,想要了解的可以看文末参考链接。)

1. 除法散列法
最直观的一种,上图使用的就是这种散列法,公式:
index = value % 16
学过汇编的都知道,求模数其实是通过一个除法运算得到的,所以叫“除法散列法”。

2. 平方散列法
求index是非常频繁的操作,而乘法的运算要比除法来得省时(对现在的CPU来说,估计我们感觉不出来),所以我们考虑把除法换成乘法和一个位移操作。公式:
index = (value * value) >> 28 (右移,除以2^28。记法:左移变大,是乘。右移变小,是除。)
如果数值分配比较均匀的话这种方法能得到不错的结果,但有时候算出来的index都是相同的——非常失败。此外,value如果很大,value * value不会溢出吗?答案是会的,但我们这个乘法不关心溢出,因为我们根本不是为了获取相乘结果,而是为了获取index。

哈希冲突:

通过哈希函数去计算哈希值,难免会有冲突的时候,解决冲突的方法有如下几种:
开放定址法:依靠数组中的空位解决碰撞冲突
线性探测法:直接检测散列表的下一个位置(即索引值加1),如果仍冲突,继续;
二次探测法:即H + 1^2, H + 2^2, H + 3^2…
伪随机探测
再哈希法:使用多个哈希函数,第一个冲突时,使用第二个哈希函数,知道不冲突为止;
链地址法:将所有哈希地址相同的关键字,都链接到同一个链表中;







最后最后下一次要写hash表的常用操作~


参考资料:
1.关于map.containsKey方法:https://www.cnblogs.com/wangjubi/p/5740434.html
2.关于哈希表:http://www.yixieshi.com/95421.html
3.哈希函数:http://www.cnblogs.com/nafio/p/9221529.html


好累啊啊啊啊,但是还是要加油!学会去归纳出自己的东西来!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值