用于更新值和查询过去某个时间值的状态的数据结构

2024-02-15

假设您对一堆独立的时变值感兴趣,每个值都代表某事物的当前状态。这些值不会按任何固定的时间表更改,并且无法从旧值预测新值。举一个具体的例子,假设您有一堆股票,并且您有兴趣跟踪它们的价值,并且每当对该股票进行交易时,您都会获得有关该股票的更新。 (我的实际问题与股票无关,但希望它们能让我的意思更容易理解。)

除了只知道每只股票的当前价格之外,您还希望能够选择过去的任意点并获得“快照”,告诉您当时每只股票的最新交易价格是多少。例如,您应该能够说“截至上周二下午 4:53,我跟踪的每只股票的最新价值是多少?”并高效地得到准确的答案。

我可以想到三种方法来做到这一点,但我对其中任何一种都不太满意。

1. 写日记。按时间顺序维护所有交易的列表。更新只是添加到列表中,查询是从时间戳等于或早于指定时间戳的第一个条目开始向后线性扫描。这将使更新成为一个恒定时间操作,但您可能必须扫描整个日志才能找到所有交易的值,因此更新为 O(1),快照为 O(u),其中 u 是更新总数。出于显而易见的原因,所需的内存为 O(u)。

2. 编写检查点。像以前一样维护一个日记帐,但更新包含当前价格(截至该更新),而不是每个条目仅包含新股票价格every库存。这计算起来很便宜:由于最后一次更新也包含了所有这些信息,因此您只需将其全部复制,除了价格实际发生变化的一只股票之外。现在可以通过 O(log u) 操作来完成快照(在日志上使用二分搜索来定位指定时间戳之前或之后的最后一个条目)。然而,更新变成了 O(s),其中 s 是系统中的股票数量,此外,所需的总内存从第一个策略中的 O(u) 变为 O(s*u)——如果s 和 u 都很大。

3.独立期刊。为每只股票维护一个单独的日记帐,并将每只股票的更新写入其自己的日记帐中,同样按时间顺序排列。要生成快照,请检查每个日志并使用二分搜索来查找正确的更新。它需要 O(u) 内存,更新是 O(1) 操作,快照可以在 O(s * log u) 时间内完成。这是这三种方法中我最喜欢的方法,但我觉得它可能还可以改进,因为它忽略了不同股票更新时间之间的任何关系。

我失踪了还有更好的方法吗?这是一个已经被研究过并有普遍接受的解决方案的问题吗?


看看相关文献持久数据结构。尤其,这篇早期论文 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.133.4630描述了维护对数运算的持久二叉搜索树的构造,但可以在任何版本(例如时间点)访问。对某些特定版本中未更新的结构部分的访问自然会查找最后一个先前版本。因此,您将在 O(log s) 时间内进行自然操作,并且如果您预先知道所有密钥并且无需重新平衡,则该结构可以占用 O(u) 空间,或者如果您知道 O(u * log s) 空间,每次更新都会修改 O(log s) 指针。

似乎用相当简单的术语描述了您需要实现的内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于更新值和查询过去某个时间值的状态的数据结构 的相关文章

  • 整数除法性质

    下面的整数算术性质成立吗 m n l m n l 起初我以为我知道答案 不成立 但现在不确定 它适用于所有数字还是仅适用于某些条件 即n gt l 该问题涉及计算机算术 即q n m q m n 忽略溢出 Case1 assume m kn
  • O(n^2) 与 O (n(logn)^2)

    时间复杂度是O n 2 or O n logn 2 better 我知道当我们简化它时 它就变成了 O n vs O logn 2 and logn lt n 但是关于logn 2 n is only less than log n 2 f
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co
  • 查找两个大小为 n 的数组中第 n 大数的算法

    我有这个问题 给定两个大小为 n 的排序列表 存储在数组中 找到 O log n 计算并集中第 n 大元素的算法 两个列表 我可以看到这里可能有一个技巧 因为它需要第 n 个最大的元素 并且数组的大小也是 n 但我不知道它是什么 我在想我可
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • 查找数组中 2 个缺失数字的最快方法

    这个问题的存在只是出于纯粹的好奇心 不是作业 找到在数组 1 n 中找到两个缺失数字的最快方法 因此 在相关帖子中 查找数字数组中缺失数字的最快方法 https stackoverflow com questions 2113795 qui
  • 让电脑实现360度=0度,旋转炮塔

    我正在制作一个游戏 其中有一个计算机控制的炮塔 炮塔可360度旋转 它使用 trig 找出枪瞄准所需的角度 obj deg 并将枪的当前角度存储在 gun deg 下面的代码以设定的速度旋转枪 if objdeg gt gundeg gun
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • 竞争性编码 - 以最低成本清除所有级别:未通过所有测试用例

    当我遇到这个问题时 我正在一个竞争性编码网站上解决问题 问题指出 游戏中有 N 个关卡和 M 种可用武器 等级编号从 0 到 N 1 武器编号从 0 到 M 1 您可以按任意顺序清除这些级别 在每个关卡中 需要这些 M 武器的某些子集才能通
  • 二分查找问题? [复制]

    这个问题在这里已经有答案了 可能的重复 实施二分查找有哪些陷阱 https stackoverflow com questions 504335 what are the pitfalls in implementing binary se
  • 正则表达式等价

    有没有办法找出两个任意正则表达式是否等价 对我来说看起来很复杂的问题 但可能有一些 DFA 简化机制之类的 要测试等价性 您可以计算的表达式并进行比较
  • 如何发现“贪婪”算法?

    我正在读一本关于 贪婪 算法 但我很难发现它们解决真正的 顶级程序员 问题 If I know给定的问题可以用 贪婪 算法来解决 因此编写解决方案非常容易 然而 如果我没有被告知这个问题是 贪婪的 我就无法发现它 用 贪婪 算法解决的问题有
  • 将两个大数作为字符串相除,而不使用java中的Bignumbers

    我需要在不使用 Biginteger 的情况下划分两个大整数 因为数字不能存储在原始类型中 因为我需要从给定的字符串中逐个字符地执行此操作 我已经创建了一个名为 BigNumber 的类 用这个类我可以 Add multiply 比较两个内
  • 给定一个零索引数组 & 该数组的平衡索引[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给出一个由 N 个整数组成的零索引数组 A 该数组的平衡索引是任何整数 P 满足 0 P 例如 考虑以下由 N 8 个元素组成的数组
  • 循环中的递归算法复杂度(运行时间)

    我想了解您对如何检测以下递归算法的 T n 运行时间 的意见 Charm 是一种用于发现事务数据库中频繁闭项集的算法 频繁闭项集列表是在一组交易 tids 中多次出现的频繁项 例如面包和牛奶是经常一起购买的物品 它们是通过将索引为 i 的当
  • 对产品列表进行分类的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表或多或少相同的产品的列表 例如 在下面的列表中 它们都是希捷硬盘 希捷硬盘 500Go 适用于笔记本电脑的希捷硬盘 120

随机推荐