news 2026/3/6 8:35:32

D.二分查找-进阶——981. 基于时间的键值存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
D.二分查找-进阶——981. 基于时间的键值存储

题目链接:981. 基于时间的键值存储(中等)

算法原理:

解法一:TreeMap

150ms击败58.54%

时间复杂度O(log m)(单次set、get)

1. 存储结构设计
①外层用 HashMap<String, TreeMap<Integer, String>>,HashMap 负责通过 key 快速定位,时间复杂度 O(1)

②内层用 TreeMap,以时间戳为键、值为value,利用 TreeMap 红黑树的特性,自动按时间戳升序存储数据

2. set方法逻辑

①对传入的 key,用 computeIfAbsent 方法:存在则获取对应 TreeMap,不存在则新建 TreeMap 存入 HashMap

②将 <timestamp, value> 存入内层 TreeMap,自动完成排序,时间复杂度 O(log m)(m 为该 key 下的时间戳数量)

3. get方法逻辑

①通过 key 获取对应 TreeMap,无则返回空 TreeMap

②调用 TreeMap 的 floorEntry(timestamp) 方法,直接获取小于等于目标时间戳的最大时间戳对应的键值对

③有结果则返回 value,无结果则返回空字符串,查询时间复杂度 O(log m)

解法二:二分查找

131ms击败89.92%

时间复杂度O(log m)(单次set、get)

1. 存储结构设计
①外层使用HashMap<String, List<Pair>>:key为字符串键,通过key快速定位到对应的Pair列表(时间复杂度O(1))

②内层List<Pair>:每个Pair封装时间戳和对应值,利用set方法传入的时间戳严格递增特性,列表天然按时间戳升序排列,无需额外排序

2. set方法逻辑

①根据key从HashMap中获取Pair列表,若不存在则新建空列表

②新建Pair对象(封装当前时间戳和值),追加到列表尾部(保持升序)

③将更新后的列表放回HashMap中,完成存储

3. get方法逻辑

①根据key获取Pair列表,若列表为空,直接返回空字符串

②采用最右端点二分模型:在升序列表中,通过二分查找找到最大的满足时间戳≤目标时间戳的元素下标

③判断该下标对应的元素时间戳是否≤目标值:若是,返回对应值;若否(所有元素时间戳都大于目标值),返回空字符串

Java代码:

class TimeMap { //存<字符串键,<时间戳,数值>>Tree会天然按时间戳升序排序 Map<String, TreeMap<Integer, String>> map = new HashMap<>(); public void set(String key, String value, int timestamp) { map.computeIfAbsent(key, k -> new TreeMap<>()).put(timestamp, value); } public String get(String key, int timestamp) { //获取key对应的TreeMap,如果不存在就默认一个空的TreeMap,避免空指针 //floorEntry(timestamp):TreeMap的核心方法,返回<=timestamp的最大键对应的键值对Entry Map.Entry<Integer, String> entry = map.getOrDefault(key, new TreeMap<>()).floorEntry(timestamp); return entry == null ? "" : entry.getValue(); } } /** * Your TimeMap object will be instantiated and called as such: * TimeMap obj = new TimeMap(); * obj.set(key,value,timestamp); * String param_2 = obj.get(key,timestamp); */
class Pair{ int timestamp; String value; //构造函数,构建一个Pair public Pair(int timestamp,String value){ this.timestamp=timestamp; this.value=value; } } class TimeMap { Map<String,List<Pair>> hash; public TimeMap() { this.hash=new HashMap<String,List<Pair>>(); } //一个hash,键值是key,通过key找到Pair集合(类似TreeMap),根据Pair集合的时间戳找到目标值 //因为timestamp递增的特性,所以天然升序排序(无需排序再二分) public void set(String key, String value, int timestamp) { Pair pair=new Pair(timestamp,value); List<Pair> pairs=hash.getOrDefault(key,new ArrayList<Pair>()); pairs.add(pair);//追加到key的后面 hash.put(key,pairs);//重新放进哈希表 } public String get(String key, int timestamp) { List<Pair> pairs=hash.getOrDefault(key,new ArrayList<Pair>()); if(pairs.isEmpty()) return ""; //找已存的最大的timestamp,求最右端点模型 int left=0,right=pairs.size()-1; while(left<right){ int mid=left+(right-left+1)/2; //这里的get是List内置的,不是Pair的 //pairs.get(mid)含义:获取pairs列表中,下标为mid的那个Pair对象 if(pairs.get(mid).timestamp>timestamp) right=mid-1; else left=mid; } if(pairs.get(left).timestamp<=timestamp) return pairs.get(left).value; //前一个if没走,说明所有元素都大于timestamp,就是说都是在该时间戳之后set新添的元素,目前这个时间戳还没set过 return ""; } } /** * Your TimeMap object will be instantiated and called as such: * TimeMap obj = new TimeMap(); * obj.set(key,value,timestamp); * String param_2 = obj.get(key,timestamp); */
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/5 16:39:36

11、信号处理中的自适应核学习

信号处理中的自适应核学习 1. 自适应滤波概述 自适应滤波是信号处理中的核心主题。自适应滤波器是一种配备自适应算法的滤波器结构,该算法通常由误差信号驱动,用于调整传递函数。由于自适应滤波器能够调整其传递函数以匹配生成输入数据的系统的变化参数,因此在非平稳环境中…

作者头像 李华
网站建设 2026/3/3 14:09:24

音乐解锁技术深度解析:打破音频加密壁垒的专业指南

音乐解锁技术深度解析&#xff1a;打破音频加密壁垒的专业指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: https://…

作者头像 李华
网站建设 2026/3/5 15:58:56

FLUX.1-dev文生图模型实战:如何通过Git下载并部署多模态AI生成镜像

FLUX.1-dev文生图模型实战&#xff1a;如何通过Git下载并部署多模态AI生成镜像 在数字内容创作日益自动化的今天&#xff0c;一个能“读懂提示词、画出想象力”的AI模型&#xff0c;正从科研实验室快速走向产品前线。无论是广告公司需要为新品生成视觉原型&#xff0c;还是独立…

作者头像 李华
网站建设 2026/3/3 17:38:40

终极指南:夸克网盘自动化签到系统技术架构深度解析

终极指南&#xff1a;夸克网盘自动化签到系统技术架构深度解析 【免费下载链接】quark-auto-save 夸克网盘签到、自动转存、命名整理、发推送提醒和刷新媒体库一条龙 项目地址: https://gitcode.com/gh_mirrors/qu/quark-auto-save 夸克网盘自动化签到系统通过精心设计的…

作者头像 李华
网站建设 2026/3/4 18:30:02

SumatraPDF:重新定义轻量级PDF阅读器的使用体验

你是否曾经被臃肿的PDF阅读器拖慢工作节奏&#xff1f;是否厌倦了复杂的界面和冗长的启动时间&#xff1f;SumatraPDF或许正是你一直在寻找的解决方案。这款仅10MB大小的轻量级PDF阅读器&#xff0c;用极简设计理念颠覆了传统文档阅读体验。 【免费下载链接】sumatrapdf Sumatr…

作者头像 李华
网站建设 2026/3/3 14:09:32

Wan2.2-T2V-A14B与DiskInfo下载官网工具无直接关联但值得关注

Wan2.2-T2V-A14B&#xff1a;从文本到视频的智能跃迁 在影视制作周期动辄以月计、广告创意依赖庞大团队协作的今天&#xff0c;一条高质量短视频的诞生仍需经历脚本撰写、分镜设计、实拍剪辑等繁琐流程。然而&#xff0c;当AI开始理解“风吹起她的头发&#xff0c;身后樱花纷纷…

作者头像 李华