查询一个时间段内有效的对象列表

Search list for objects valid in a time range

本文关键字:有效 对象 列表 时间段 一个 查询      更新时间:2023-09-26

我有以下数据结构,它描述了一个对象和它有效的时间段。假设下面的数字是unix时间戳。

{
  "id": 1234,
  "valid_from": 2000
  "valid_to": 4000
},
{
 "id": 1235,
 "valid_from": 1000,
 "valid_to": 2200,
}
...

我想快速能够在JavaScript中存储这些项目,然后查询在某个时间有效的项目。

例如,如果我要查询在2100有效的对象,我将得到[1234,1235]。如果我要查询在3999有效的对象,我会得到[1234],而在4999什么也没有。

我将在结构中有大约50-100k项的大小,我希望快速查找速度,但插入和删除可能会更慢。

Items将有重复的valid_from和valid_to值,所以它需要支持重复。项会重叠。

我将需要不断地将数据插入到结构中(可能是初始加载时的批量插入,然后在数据更改时进行一次性更新)。我还将定期修改记录,以便删除和插入。

我不确定以高效的方式解决这个问题的最佳方法是什么?

算法不是我的强项,但如果我知道正确的方法,我可以研究算法本身。

我的想法:

我最初考虑修改二叉搜索树来支持重复键和最近查找,但这只允许我查询> valid_from或

假设您有两个列表:起始/开始和过期/结束。均按时间排序。

给定一个特定的时间,您可以通过二分搜索找到每个列表中符合条件的第一项的位置。您还可以对每个列表进行二进制搜索来执行插入操作。

例如,如果有1000个项目,开始位置为342,则项目1-342是可能的,如果结束位置为901,则终止列表中的项目901-1000是可能的。现在需要交叉两个子列表。

取item id从1-342开始,从901-1000结束,并把它们放在一个单独的数组中(提前分配)。对数组进行排序。遍历数组。当同一个ID在一行中出现两次时,它就是一个命中,一个有效的匹配。