HashMap前言-哈希算法与哈希表

哈希算法

将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值(散列值).一个优秀的哈希算法需要满足:

  • 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法);
  • 对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同;
  • 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小;
  • 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。

哈希表

根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便成为哈希表,这一映像过程称为哈希造表或散列,所得存储位置称哈希地址或散列地址。

这里的哈希函数用的就是某种哈希算法,映射的地址就是哈希值

在不考虑哈希冲突的情况下,哈希表的时间复杂度为O(1)
在数组中根据下标查找某个元素,一次定位就可以达到,哈希表利用了这种特性,哈希表的主干就是数组。

  • 存数时:
    当前元素的关键字 ,通过哈希函数映射到数组中的某个位置(关键字在数组中的偏移量),通过数组下标一次定位就可完成操作。
  • 取数时:
    查找操作同理,先通过哈希函数计算出实际存储地址(偏移地址),然后从数组中对应地址取出即可。

哈希冲突

这里有个很重要的概念就是哈希冲突。
哈希映射是将数据映射到有限的地址范围内,所以在将一个较大的数据集映射到有限的地址空间时,难以避免会将两个不同的数据映射到同一个地址,这就是哈希冲突。

鸽巢原理(也叫抽屉原理):如果有 10 个鸽巢,有 11 只鸽子,那肯定有 1 个鸽巢中的鸽子数量多于 1 个,换句话说就是,肯定有 2 只鸽子在 1 个鸽巢内。

哈希冲突会非常影响哈希表的存取效率。哈希冲突的可能性与哈希表的大小以及哈希算法有关系。有很多处理哈希冲突的方法不拓展。

红黑树

红黑树是一个能实现自平衡的二叉搜索树。所以在这之前需要回顾一下二叉搜索树和平衡二叉树。

二叉搜索树(BST)

  • 特性:

    1.左子树上所有结点的值均小于或等于它的根结点的值。
    2.右子树上所有结点的值均大于或等于它的根结点的值。
    3.左、右子树也分别为二叉排序树。

因为以上特性,二叉树在查找数据的时候,如果在每个子树数据每部均匀的情况下,每经过一次比较,就可以排除差不多一半的数据,所以这种情况下查找效率很优秀。但是不一般的情况是什么,就是数据极度分布不均衡的情况,极大一部分数据分布到了其中一个子树上。为了解决这种问题,又涉及到了平衡二叉树这个概念。

平衡二叉树(AVL)

  • 特性
  1. 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1
  2. 左右两个子树都是一棵平衡二叉树。

这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。
平衡二叉树会在每个破坏树平衡的操作后进行旋转来保证树的平衡性。

红黑树就是建里在上面两种树的基础上,能够自动维持均衡的二叉搜索树。

  • 节点分为红色或者黑色;
  • 根节点必为黑色;
  • 叶子节点都为黑色,且为null;
  • 连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点);
  • 从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点;
  • 新加入到红黑树的节点为红色节点;

后记

以上概念都是为了这系列好好去探索hashmap做的一个基础铺垫,所以并没详细列述了。有了这些概念可以更好地去理解HashMap的设计和用法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值