如何动态的向数组中插入键值对_在Java中实现的一个简单“HashMap”
![](/assets/blank.gif)
如何创建Hash表
对于把K(键)-V(值)这样的键值对插入Hash表中,需要执行两个步骤:
1.使用散列函数将K转换为小整数(称为其哈希码)。
2.哈希码用于查找索引(hashCode%arrSize),并且首先搜索该索引处的整个链表(单独链)以查找已存在的K。
3.如果找到,则更新其值,如果不是,则将K-V对存储为列表中的新节点。
复杂性和负载因子
- 第一步,所用时间取决于K和散列函数。
例如,如果键是字符串“abcd”,那么它的散列函数可能取决于字符串的长度。 但是对于非常大的n值,与n相比,映射中的条目数,密钥的长度几乎可以忽略不计,因此可以认为散列计算在恒定时间内发生,即O(1)。
- 对于第二步,需要遍历存在于该索引处的K-V对列表。 为此,最坏的情况可能是所有n个条目都在相同的索引处。 因此,时间复杂度将是O(n)。 但是,已经进行了足够的研究以使散列函数产生的键在数组中均匀分布,因此这几乎不会发生。
- 因此,平均而言,如果有n个条目且b是数组的大小,则每个索引上将有n / b个条目。 此值n / b称为负载因子,表示hash表上的负载情况。
- 该负载因子(Load Factor)需要保持较低,因此一个索引处的条目数较少,因此复杂度几乎恒定,即O(1)。
Rehashing
顾名思义,rehashing意味着再次散列。 基本上,当负载因子增加到超过其预定值(负载因子的默认值为0.75)时,复杂性就会增加。因此,为了克服这个问题,数组的大小增加(加倍)并且所有值再次进行散列并存储在新的双倍大小的数组中,以保持低负载因子和低复杂度。
为什么要Rehashing
进行重新散列是因为每当将键值对插入到映射中时,负载因子增加,这意味着时间复杂度也如上所述地增加。 这可能无法提供O(1)所需的时间复杂度。
因此,必须进行重新散列,增加Bucket Array的大小,以减少负载因子和时间复杂度。
如何Rehashing
可以按如下方式进行Rehashing:
- 对于每次向hash表添加新条目,请检查负载因子。
- 如果它大于其预定义值(如果没有给出,则默认值为0.75),然后重新散列。
- 对于Rehashing,创建一个比以前大小加倍的新数组,并使其成为新的Bucket Array。
- 然后遍历旧Bucket Array中的每个元素,并为每个元素调用insert()函数,以便将其插入到新的更大的bucket数组中。
Java程序实例
// Java program to implement Rehashing import java.util.ArrayList; class Map { class MapNode { K key; V value; MapNode next; public MapNode(K key, V value) { this.key = key; this.value = value; next = null; } } // The bucket array where // the nodes containing K-V pairs are stored ArrayList > buckets; // No. of pairs stored - n int size; // Size of the bucketArray - b int numBuckets; // Default loadFactor final double DEFAULT_LOAD_FACTOR = 0.75; public Map() { numBuckets = 5; buckets = new ArrayList<>(numBuckets); for (int i = 0; i < numBuckets; i++) { // Initialising to null buckets.add(null); } System.out.println("HashMap created"); System.out.println("Number of pairs in the Map: " + size); System.out.println("Size of Map: " + numBuckets); System.out.println("Default Load Factor : " + DEFAULT_LOAD_FACTOR + ""); } private int getBucketInd(K key) { // Using the inbuilt function from the object class int hashCode = key.hashCode(); // array index = hashCode%numBuckets return (hashCode % numBuckets); } public void insert(K key, V value) { // Getting the index at which it needs to be inserted int bucketInd = getBucketInd(key); // The first node at that index MapNode head = buckets.get(bucketInd); // First, loop through all the nodes present at that index // to check if the key already exists while (head != null) { // If already present the value is updated if (head.key.equals(key)) { head.value = value; return; } head = head.next; } // new node with the K and V MapNode newElementNode = new MapNode(key, value); // The head node at the index head = buckets.get(bucketInd); // the new node is inserted // by making it the head // and it's next is the previous head newElementNode.next = head; buckets.set(bucketInd, newElementNode); System.out.println("Pair(" + key +
如何动态的向数组中插入键值对_在Java中实现的一个简单“HashMap”相关推荐
- java中的map是什么_转载java中Map的详解
Map简介 什么是map? map是一个接口 是一个将建key 映射到值的对象. map的主要作用是什么? 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据 将 ...
- java中随机数怎么定义类_浅析Java中的随机数类
Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...
- java中的深度克隆浅克隆_了解Java中的可克隆接口
java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...
- 往数组里添加键值对_框架都是花哨的东西!js才是根基,分享一下给原生js数组的操作...
1Array.map()方法 此方法原数组不会改变,会返回一个新数组.必须有返回值: 语法: array 回调函数是必穿的参数,thisValue是可选参数!对象作为该执行回调同时使用,传递给函数用作 ...
- vue 往对象中添加键值对_【Vue】Vue学习之混入
今天学习了Vue中的"混入"知识点,写篇文章用自己的语言来向自己解释它,如有不足还望指点. 混入(mixins): 混入提供了一种非常灵活的方式,来分发Vue组件中的可复用功能 - ...
- 结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次
结构为键值的map 这个问题可能被认为太基础了,但是在论坛中经常被问到. 在本文中,我将讨论一种仅在Map ONCE中搜索键的方法. 让我们首先来看一个例子. 假设我正在使用Map创建一个字符串频率列 ...
- Mysql数据库中插入记录的命令_向数据库中添加记录的sql命令是什么
向数据库中添加记录的sql命令是INSERT INTO. (推荐学习:mysql教程) INSERT INTO 语句的语法 INSERT INTO 语句可以有两种编写形式,分别是: 第一种形式 无需指 ...
- java中的解码和编码_关于java中编码和解码(一)
关于java中编码和解码(一) 关于java中编码和解码(一) 计算机中所能表示的字符仅仅为0-255个,平时我们用到的语言太多,计算机本身根本无法表示.必须将我们的不同的语言转换为计算机所能理解的语 ...
- java中 下列不合法的语句_在Java中,下列( )是不合法的赋值语句。_学小易找答案...
[多选题]75. 垂直角观测的步骤是( ). [多选题]139. 属于真误差的是( ). [多选题]160. 导线观测数据有( ). [单选题]145.水准测量时,长水准管气泡居中明 ( ). [单选 ...
最新文章
- [附加题] 结对项目对接的苦痛
- 特征级融合_更丰富的卷积特征用于目标边缘检测(文末附有论文及源码下载)...
- python 编码声明位置,python中的编码声明
- React Native实例
- 直博5年!叹我年少轻狂!头4年一篇1作SCI也没有...
- javascript 中的 call
- angular4点击事件监听_JavaScript从零开始——DOM事件编程(1)
- 社区团购战国七雄出场了
- laravel 数据填充
- UnityShader28:噪声纹理
- php 类中输出所有属性,PHP基于反射获取一个类中所有属性
- Android10源码下载和编译(解锁/刷机)
- 2021年河海大学计算机与信息学院考研指南
- dell服务器设置bios设置u盘启动不了系统,详解戴尔通过BIOS设置U盘启动的技巧
- Maven中的pom.xml文件超详细解析
- the jre_home environment variable is not defined correctly this environment vari
- Golang 企业级web后端框架
- 一劳永逸的解除ByondCompare4注册问题
- 【回归预测-FNN预测】基于蝙蝠算法优化前馈网络实现数据回归预测附Matlab代码
- @MapKey用法说明
热门文章
- SAP CRM Division下载调试
- multiple context container - entry point for tile click
- Apache httpclient的execute方法调试
- Spring XSD validation cache issue
- SAP One Order redesign里的WebUI advanced search重构
- 在ABAP里取得一个数据库表记录数的两种方法
- Word2019上面的MathType7.4插件忽然消失了【终极解决办法记录】
- matlab 函数return_基于MATLAB的指纹识别系统【论文,GUI】
- php定时红包,PHP随机红包和等额红包的简单实现
- linux mysql 释放x锁_MySQL 加锁处理分析-转载