【问题标题】:Efficient data structure for storing precomputed maximums用于存储预先计算的最大值的高效数据结构
【发布时间】:2019-09-22 14:54:51
【问题描述】:

考虑这个存储两个stock变量AB在每个时间点的值的表:

         A   B
day 1   10   0 
day 2    0  10
day 3    7   7
day 4    7   7

我们想回答以下问题:

  • 变量A在给定的天数范围内达到的最大值是多少?

  • sum 变量 AB 在给定的天数范围内达到的最大值是多少? p>

然而,实际的表可能有数十亿行和许多变量。为了更快地得到答案,我们计划预先计算一个时间粒度较低的汇总表。

问题在于,单独计算 AB 的新时间粒度的最大值并不足以回答第二个问题。例如:

         Max-A  Max-B
day 1&2     10     10
day 3&4      7      7

我们已经忘记了 A + B 的最大值是在 3 和 4 天达到的这一事实。

我们可以在汇总表中添加一个新的 Max-(A+B) 列。但如果有许多不同的变量,我们将面临组合爆炸。汇总表最终可能会比原来的大!

是否有一种算法/数据结构可以有效地存储这些预先计算的最大值,让我们可以对变量的任意组合提出疑问,同时避免组合爆炸?我的猜测是,它可以假设数据中的一些规律性并尝试利用它们——以牺牲一些普遍性为代价。

【问题讨论】:

  • 为每个股票变量计算稀疏表怎么样?然后对于每个时间范围,计算 A 和 B 的最大值,得到 A + B 的最大值。
  • 您应该寻找 Range Maximum Query 问题——这是对问题的一个很好的广泛处理topcoder.com/community/competitive-programming/tutorials/…
  • 考虑像clickhouse这样的OLAP系统和像table{date, param_id, value}这样的架构是有意义的,其中索引基于对{date, param_id}构建。使用AggregatingMergeTree,您可以预先计算每个日期每个参数的聚合,并即时获得所需的结果。
  • 好吧,您可以使用占用 O(n log n) 空间并在 O(1) 中回答最大查询的稀疏表,或者使用使用 O(4*n) 空间并回答最大查询的分段树在 O(log n) 时间内查询

标签: algorithm data-structures range-query


【解决方案1】:

对于您想要的一切,没有真正好的数据结构...但您知道一年只有 365 天,即您的表不会有 十亿 行。

该表最多只有几千行,因此只需对其进行迭代以计算您喜欢的任何统计信息都不会花费任何大量时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2021-02-03
    • 2018-09-03
    相关资源
    最近更新 更多