如何创建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”相关推荐

  1. java中的map是什么_转载java中Map的详解

    Map简介 什么是map? map是一个接口  是一个将建key 映射到值的对象. map的主要作用是什么? 可以通过创建一个map的实现类 来存放 数据 值 和值的描述 也可以通过描述去取得数据 将 ...

  2. java中随机数怎么定义类_浅析Java中的随机数类

    Java中的随机数是否可以重复?Java中产生的随机数能否可以用来产生数据库主键?带着这个问题,我们做了一系列测试. 1.测试一: 使用不带参数的Random()构造函数 * @author Carl ...

  3. java中的深度克隆浅克隆_了解Java中的可克隆接口

    java中的深度克隆浅克隆 什么是对象克隆? 对象克隆是生成具有不同名称的对象的精确字段到字段副本的过程. 克隆的对象在内存中有自己的空间,可在其中复制原始对象的内容. 这就是为什么在克隆后更改原始对 ...

  4. 往数组里添加键值对_框架都是花哨的东西!js才是根基,分享一下给原生js数组的操作...

    1Array.map()方法 此方法原数组不会改变,会返回一个新数组.必须有返回值: 语法: array 回调函数是必穿的参数,thisValue是可选参数!对象作为该执行回调同时使用,传递给函数用作 ...

  5. vue 往对象中添加键值对_【Vue】Vue学习之混入

    今天学习了Vue中的"混入"知识点,写篇文章用自己的语言来向自己解释它,如有不足还望指点. 混入(mixins): 混入提供了一种非常灵活的方式,来分发Vue组件中的可复用功能 - ...

  6. 结构为键值的map_在Java中增加Map值的最有效方法-只需搜索键一次

    结构为键值的map 这个问题可能被认为太基础了,但是在论坛中经常被问到. 在本文中,我将讨论一种仅在Map ONCE中搜索键的方法. 让我们首先来看一个例子. 假设我正在使用Map创建一个字符串频率列 ...

  7. Mysql数据库中插入记录的命令_向数据库中添加记录的sql命令是什么

    向数据库中添加记录的sql命令是INSERT INTO. (推荐学习:mysql教程) INSERT INTO 语句的语法 INSERT INTO 语句可以有两种编写形式,分别是: 第一种形式 无需指 ...

  8. java中的解码和编码_关于java中编码和解码(一)

    关于java中编码和解码(一) 关于java中编码和解码(一) 计算机中所能表示的字符仅仅为0-255个,平时我们用到的语言太多,计算机本身根本无法表示.必须将我们的不同的语言转换为计算机所能理解的语 ...

  9. java中 下列不合法的语句_在Java中,下列( )是不合法的赋值语句。_学小易找答案...

    [多选题]75. 垂直角观测的步骤是( ). [多选题]139. 属于真误差的是( ). [多选题]160. 导线观测数据有( ). [单选题]145.水准测量时,长水准管气泡居中明 ( ). [单选 ...

最新文章

  1. [附加题] 结对项目对接的苦痛
  2. 特征级融合_更丰富的卷积特征用于目标边缘检测(文末附有论文及源码下载)...
  3. python 编码声明位置,python中的编码声明
  4. React Native实例
  5. 直博5年!叹我年少轻狂!头4年一篇1作SCI也没有...
  6. javascript 中的 call
  7. angular4点击事件监听_JavaScript从零开始——DOM事件编程(1)
  8. 社区团购战国七雄出场了
  9. laravel 数据填充
  10. UnityShader28:噪声纹理
  11. php 类中输出所有属性,PHP基于反射获取一个类中所有属性
  12. Android10源码下载和编译(解锁/刷机)
  13. 2021年河海大学计算机与信息学院考研指南
  14. dell服务器设置bios设置u盘启动不了系统,详解戴尔通过BIOS设置U盘启动的技巧
  15. Maven中的pom.xml文件超详细解析
  16. the jre_home environment variable is not defined correctly this environment vari
  17. Golang 企业级web后端框架
  18. 一劳永逸的解除ByondCompare4注册问题
  19. 【回归预测-FNN预测】基于蝙蝠算法优化前馈网络实现数据回归预测附Matlab代码
  20. @MapKey用法说明

热门文章

  1. SAP CRM Division下载调试
  2. multiple context container - entry point for tile click
  3. Apache httpclient的execute方法调试
  4. Spring XSD validation cache issue
  5. SAP One Order redesign里的WebUI advanced search重构
  6. 在ABAP里取得一个数据库表记录数的两种方法
  7. Word2019上面的MathType7.4插件忽然消失了【终极解决办法记录】
  8. matlab 函数return_基于MATLAB的指纹识别系统【论文,GUI】
  9. php定时红包,PHP随机红包和等额红包的简单实现
  10. linux mysql 释放x锁_MySQL 加锁处理分析-转载