哈希表的介绍

文章介绍了哈希表的基本概念和在Java中的实现,如HashSet和HashMap。HashSet适用于存储唯一元素,而HashMap用于键值对映射。文章还提出了一种结合哈希表和ArrayList实现插入、删除和随机访问都为O(1)时间复杂度的数据容器,并提供了相关操作的代码示例。
摘要由CSDN通过智能技术生成

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的用法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值