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

学习记录:js算法(四十一): 基于时间的键值存储

文章目录

    • 基于时间的键值存储
      • 网上思路
    • 总结

基于时间的键值存储

设计一个基于时间的键值数据结构,该结构可以在不同时间戳存储对应同一个键的多个值,并针对特定时间戳检索键对应的值。
实现 TimeMap 类:

  • TimeMap() 初始化数据结构对象
  • void set(String key, String value, int timestamp) 存储给定时间戳 timestamp 时的键 key 和值 value
  • String get(String key, int timestamp) 返回一个值,该值在之前调用了 set,其中 timestamp_prev <= timestamp 。如果有多个这样的值,它将返回与最大 timestamp_prev 关联的值。如果没有值,则返回空字符串 (“”)
示例 1:
输入:
["TimeMap", "set", "get", "get", "set", "get", "get"]
[[], ["foo", "bar", 1], ["foo", 1], ["foo", 3], ["foo", "bar2", 4], ["foo", 4], ["foo", 5]]
输出:
[null, null, "bar", "bar", null, "bar2", "bar2"]解释:
TimeMap timeMap = new TimeMap();
timeMap.set("foo", "bar", 1);  // 存储键 "foo" 和值 "bar" ,时间戳 timestamp = 1   
timeMap.get("foo", 1);         // 返回 "bar"
timeMap.get("foo", 3);         // 返回 "bar", 因为在时间戳 3 和时间戳 2 处没有对应 "foo" 的值,所以唯一的值位于时间戳 1 处(即 "bar") 。
timeMap.set("foo", "bar2", 4); // 存储键 "foo" 和值 "bar2" ,时间戳 timestamp = 4  
timeMap.get("foo", 4);         // 返回 "bar2"
timeMap.get("foo", 5);         // 返回 "bar2"

我的思路
直接题目都没看懂。。。
网上思路
也没看懂

网上思路

class TimeMap {constructor() {this.map = {};}set(key, value, timestamp) {if (!this.map[key]) {this.map[key] = [];}this.map[key].push({ timestamp, value });}get(key, timestamp) {if (!this.map[key]) {return "";}const values = this.map[key];let left = 0;let right = values.length - 1;// 使用二分查找找到最大时间戳小于等于给定时间戳的值while (left <= right) {const mid = Math.floor((left + right) / 2);if (values[mid].timestamp <= timestamp) {left = mid + 1; // 继续查找右边} else {right = mid - 1; // 查找左边}}// right 现在是最大时间戳小于等于给定时间戳的索引if (right >= 0) {return values[right].value;} else {return ""; // 没有找到合适的时间戳}}
}

讲解

  1. 类的构造函数
    this.map: 初始化一个空对象 map,用于存储键值对。每个键将映射到一个数组,该数组包含多个时间戳和对应的值。
  2. set 方法
    检查键是否存在: 如果 this.map 中没有该 key,就初始化一个空数组。
    存储值: 将一个对象 { timestamp, value } 添加到该键对应的数组中。这样,每个键可以存储多个值,且每个值都有一个时间戳。
  3. get 方法
    • 检查键是否存在: 如果 this.map 中没有该 key,直接返回空字符串 “”。
    • 二分查找:
      • 使用 left 和 right 指针来定义当前查找的范围。
      • 通过计算 mid 来获取中间的索引,比较 values[mid].timestamp 和给定的 timestamp。
      • 如果 values[mid].timestamp 小于或等于 timestamp,则移动 left 指针向右,继续查找更大的时间戳。
      • 否则,移动 right 指针向左,查找更小的时间戳。
  • 返回值:
    当查找结束时,right 指针会指向最大时间戳小于等于给定时间戳的索引,如果 right 大于或等于0,则返回对应的值;否则返回空字符串。

总结

一脸懵。。。开始怀疑自己还能否干这一行了

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Qt --- 常用控件的介绍 --- 其他控件
  • Vscode Run Code Py中文乱码问题
  • 市面第一款 C++ 版本的U盘装机软件(即将上线)
  • TCP: Textual-based Class-aware Prompt tuning for Visual-Language Model
  • 【java面经】Redis速记
  • 云原生链路观测平台 openobserve + fluent-bit,日志收集
  • C++之Person类中调用Date类
  • Pygame中Sprite实现逃亡游戏2
  • 一,初始 MyBatis-Plus
  • (11)iptables-仅开放指定ip访问指定端口
  • 深度学习自编码器 - 去噪自编码器篇
  • python画图|3D bar进阶探索
  • mozilla/pdf.js view.html加载指定页码
  • 【大模型实战篇】关于Bert的一些实操回顾以及clip-as-service的介绍
  • Π-系上的最小 d-系等于 Π-系上的最小集代数
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • 11111111
  • Android系统模拟器绘制实现概述
  • Android优雅地处理按钮重复点击
  • interface和setter,getter
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Linux后台研发超实用命令总结
  • miaov-React 最佳入门
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • SpriteKit 技巧之添加背景图片
  • Zepto.js源码学习之二
  • 多线程事务回滚
  • 翻译:Hystrix - How To Use
  • 分类模型——Logistics Regression
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 计算机常识 - 收藏集 - 掘金
  • 前端
  • 前言-如何学习区块链
  • 实习面试笔记
  • 使用common-codec进行md5加密
  • 小试R空间处理新库sf
  • 用简单代码看卷积组块发展
  • 再次简单明了总结flex布局,一看就懂...
  • Python 之网络式编程
  • ​Java基础复习笔记 第16章:网络编程
  • ​补​充​经​纬​恒​润​一​面​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • !!java web学习笔记(一到五)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (19)夹钳(用于送货)
  • (30)数组元素和与数字和的绝对差
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (pycharm)安装python库函数Matplotlib步骤
  • (二)原生js案例之数码时钟计时
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程