| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 简述哈希表 -> 正文阅读 |
|
[数据结构与算法]简述哈希表 |
? 一、什么哈希表???????? 哈希表也叫散列表(HashTable)是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。底层是数组+链表/红黑树,它借助哈希函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性,是存储 Key-Value 映射的集合。 二、扩容问题1.由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,因此总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突,即不同的关键字得到的值可能会相同。????????哈希表是java.util.HashMap$Node类型的数组,Node是链表结构,所以一个索引值下可能会有多个元素。所以底层是哈希表的实现类基本上都没有索引值。 ????????如下图:同一个索引值下可能挂了很多个元素,但是为了提高效率,最大不超过八个,方便元素的查找。当添加的元素的索引值下刚好八个时,元素A就会往下一个索引值下面的链表挂,数组默认长度是16,当数组空间不够时,就会扩容, ????????? 数组的长度默认为16; 为什么要进行扩容:为了减少哈希碰撞。 负载因子(LoadFactor)=哈希表的有效元素个数/哈希表长度 负载因子的值越大,就说明冲突越严重,但是数组的的利用率较高(数组中存储的元素很多),反之负载因子越小,就说明冲突越小,数组的利用率越低(数组中存储的元素比较少)。负载因子就是在空间和时间中取平衡值。 哈希表容易出现的问题: ① 如果空间利用率高,那么经过的哈希算法计算存储位置的时候,会发现很多存储位置已经有数据了(哈希冲突); 扩容条件:1.同一索引值下元素个数>8,并且数组长度<64; ? ? ? ? ? ? ? ? ? 2.数组的索引值占有率>0.75; 扩容规则:新数组容量==旧数组容量的二倍 转红黑树原则:同一索引值下元素个数>8,并且数组长度>=64. 为什么负载因子是0.75:
默认的负载因子0.75是对空间和时间效率的一个平衡选择,一般情况下不要修改,除非在时间和空间比较特殊的情况下,如果内存空间很多而又对时间效率要求很高,可以降低负载因子Load factor的值;相反,如果内存空间紧张而对时间效率要求不高,可以增加负载因子loadFactor的值,这个值可以大于1。 扩容原理:
哈希表判断两个元素是否重复的规则:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 21:50:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |