【发布时间】:2019-09-22 14:54:51
【问题描述】:
考虑这个存储两个stock变量A和B在每个时间点的值的表:
A B
day 1 10 0
day 2 0 10
day 3 7 7
day 4 7 7
我们想回答以下问题:
变量A在给定的天数范围内达到的最大值是多少?
sum 变量 A 和 B 在给定的天数范围内达到的最大值是多少? p>
然而,实际的表可能有数十亿行和许多变量。为了更快地得到答案,我们计划预先计算一个时间粒度较低的汇总表。
问题在于,单独计算 A 和 B 的新时间粒度的最大值并不足以回答第二个问题。例如:
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