当前位置: 首页 > news >正文

哈希表的介绍

1.哈希表的介绍

在哈希表中插入、删除或查找一个元素都只需要O(1)的时间,因此经常被用来优化时间效率。

在Java中,哈希表有两个对应的类型,即HashSet和HashMap。

2.HashSet的应用

若每个元素都只有一个值,则用HashSet,如,HashSet在图搜索时经常用来存储已经搜索过的节点。
以下为HashSet的常用函数:

函数功能
add添加一个元素
contains判断是否包含一个元素
remove删除一个元素
size返回元素的数目

3.HashMap的应用

若每个元素都存在一个值到另外一个值的映射,那么就用HashMap。
以下为HashMap的常用函数:

函数功能
containsKey判断HashMap中是否包括某个键
get返回键对应的值,否则null
getOrDefault返回键对应的值,否则返回输入的默认值
put添加一组映射,否则修改键对应的值
putIfAbsent当键不存在时,添加一组映射
remove删除某个键
replace修改某个键对应的值
size返回映射数目

可以基于数组实现哈希表。

4.题目

面试30-插入、删除和随机访问都是O(1)的容器
在这里插入图片描述
解题思路:
需要结合哈希表和数组的特性来设计数据容器。
采用长度可变的数组:

ArrayList list = new ArrayList();

其中删除操作若考虑O(1)的时间复杂度,因为不能保证删除的元素总在末尾,所以,将末尾的元素与要删除的元素换位置(单方面交换–看代码),然后删除末尾的元素,注意,都是从0开始。
提交的代码:

class RandomizedSet {HashMap<Integer,Integer> map;//定义哈希表ArrayList<Integer> nums;//定义长度可变的数组//初始化public RandomizedSet(){map=new HashMap<>();nums=new ArrayList<>();}//插入public boolean insert(int val){if(map.containsKey(val)){return false;}map.put(val,nums.size());nums.add(val);return true;}//删除public boolean remove(int val){if(!map.containsKey(val)){return false;}int loc=map.get(val);map.put(nums.get(nums.size()-1),loc);//数组中最后一个元素放在要删除的位置map.remove(val);//map中删除val对应的键值对nums.set(loc,nums.get(nums.size()-1));//数组中最后一个元素放在要删除的位置nums.remove(nums.size()-1);return true;}//返回一个随机数public int getRandom(){Random random=new Random();int r=random.nextInt(nums.size());//随机生成0-nums.size()-1中的数字return nums.get(r);}
}

ArrayList的用法
在这里插入图片描述

http://www.lryc.cn/news/14073.html

相关文章:

  • spring cloud gateway 实现redis动态路由及自动项目路由上报
  • c++函数对象(仿函数)、谓词、内建函数对象
  • 物联网对供应链管理的影响
  • c++ 那些事 笔记
  • 心跳机制Redis
  • 蓝桥杯算法训练合集十七 1.数字反转2.试题39713.矮人采金子4.筛法5.机器指令
  • 第一章 初识 Spring Security
  • 2023-02-20 关于回朔的思考
  • 推荐系统[八]算法实践总结V1:淘宝逛逛and阿里飞猪个性化推荐:召回算法实践总结【冷启动召回、复购召回、用户行为召回等算法实战】
  • 适合初学者的超详细实用调试技巧(下)
  • C# String与StringBuilder 的区分
  • 【麒麟】基于GPS北斗卫星技术的NTP网络时间服务器
  • “互联网+”下劳动关系认定的现状
  • LPWAN及高效弹性工业物联网核心技术方案
  • OPTIONS FMTSEARCH
  • Python3 pip
  • 【2023-02-20】JS逆向之翼支付
  • 假如面试官问你Babel的原理该怎么回答
  • 深入Spring底层透析Bean创建过程之拨云见日篇
  • 8 狗监控的封装
  • 基于卷积神经网络图像风格迁移系统的设计与实现(flask系统)
  • 【1】linux命令每日分享——mkdir
  • 实例2:树莓派GPIO控制外部LED灯闪烁
  • 详解可变形注意力模块(Deformable Attention Module)
  • Java数据结构中链表分割及链表排序使用快速排序、归并排序、集合排序、迭代、递归,刷题的重点总结
  • 音视频基础之音频编码原理简介
  • 【Python--XML文件读写】XML文件读写详解
  • GNU make 中文手册 第一二章 概述与介绍
  • 真的了解HashMap、HashSet吗?做一道测试题试试!
  • 树莓派下安装OpenEuler