如何实现一个哈希表

哈希表是Java HashSet和HashMap的基础,提供高效查找。由数组和size变量构成,通过哈希函数将元素映射为数组下标存储。哈希冲突有两种解决方法:闭散列(冲突位置依次查找)和开散列(如HashMap中使用红黑树)。负载因子是衡量冲突概率的指标,根据其值决定是否扩容。
摘要由CSDN通过智能技术生成

哈希表在Java集合中属于HashSet和HashMap的底层实现,它的查找效率非常的高,优于前面所学的链表顺序表,二叉搜索树等等,并且更是作为现代分布式系统的基础,由此可见它在众多数据结构中的重要性,下面具体实现一个哈希表。

哈希表主要由两个部分组成
1.一个数组
2.记录实际元素个数的变量size
具体实现过程就是把我们需要存储的元素映射成数组下标进行存储,当需要对哈希表进行操作的时候就根据映射出来的这个哈希值来访问具体的元素。
比如说给定我们若干个数字0——99之间,然后我们需要判断哪个数字是否存在于给定序列中,我们就可以把这个序列映射成数组下标,然后存储到数组中即可,具体如何映射的哈希函数有很多种,像这种简单的可以直接模上数组长度。当我们需要查找的时候可以直接将要查找的元素同样模上数组长度,然后访问具体数组下标即可。这也就是哈希表查找效率高的原因。

哈希冲突:
当元素很多的时候,难免会出现不同的key映射出来的哈希值相同,也就是通过计算得出来的数组下标一样了。这就叫哈希冲突。解决方法有两种
1.闭散列:
核心操作就是在冲突位置依次往后找一个位置来存放这个冲突元素。当我们需要对这个元素进行操作的时候同样是先算出它的哈希值,然后从哈希值位置依次往后进行判断是否是这个元素,当找到这个元素的时候再进行一系列的操作。此时的时间复杂度就不再是O(1)了,而是取决于哈希冲突的严重性。冲突越严重效率也就越低,所以我们选取数组长度的时候也需要仔细考虑,尽量让算出来的哈希值保证唯一性。
2.开散列:
核心操作就是将顺序表或者链表或者二叉搜索树或者再一个哈希表来作为当前哈希表中数组的元素,当遇到哈希冲突元素的时候,就直接放入这个位置上的表或者树中即可,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值