hash表

什么是HashMap?在了解HashMap、Hash表之前先了解一下其他数据结构。

数据结构的物理存储结构大概分为 顺序存储结构(数组)和链式存储结构(链表和树等)。

数组是特殊的,它的时间复杂度分不同情况,当你不知道想取的数的下标地址的时候,就需要for循环遍历,复杂度是O(n);当你知道下标地址时,复杂度是O(1);当数组有顺序时,可以用折半查询,这样时间复杂度是O(logn)。

而循序存储结构是要按顺序存储,当在新建删除文件时会造成大量空间浪费,而链式存储会进行链接,并不需要按照顺序存储。
链表的时间复杂度是O(n);
二叉树的话最完美的是取一半,最好的方式是完全二叉树的时间复杂度O(logen),而差的就是在一边,时间复杂度是O(n)。

Hash表

hash表的主干就是一个数组,比如我们要新增或查找某个元素,我们通过把当前元素的关键字 通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。
我们知道数组是由下标的,hash表中有个算法——hash算法;
例:String a=“123”

hash(关键字(123这个值))——》得到一个int类型的数据比如(16)——除以某一个值》结果的范围在hash表的地址当中(4)——》存储到数组中
查询的时候用get(关键字) 可以得到下标,从而在数组得到它的值,所以它的时间复杂度为O(1)

hash冲突

然而万事无完美,如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。前面我们提到过,哈希函数的设计至关重要,好的哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值