增量价格图近似值

时间:2018-11-20 18:34:07

标签: algorithm graph

我需要显示类似于CoinMarketCap上的加密货币价格图:https://coinmarketcap.com/currencies/bitcoin/

在很长一段时间内,一个货币对可能会有数十亿字节的数据,因此将所有数据发送到客户端不是一种选择。 经过一些研究,我最终使用了道格拉斯·皮克线近似算法:https://www.codeproject.com/Articles/18936/A-C-Implementation-of-Douglas-Peucker-Line-Appro它可以减少发送给客户的点的数量,但是有一个问题:每次有新数据都要经过服务器上的所有数据,而我想实时更新客户端上的数据,这需要很多资源。

因此,我正在考虑一种渐进算法,例如,如果需要显示上个月的数据,可以将数据分为5分钟间隔,仅预处理最后一个间隔,并在完成后将其删除第一个。我正在讨论自定义Douglas-Peucker算法(但是我不确定是否适合这种情况)或寻找一种为此目的而设计的算法(任何提示将不胜感激)

2 个答案:

答案 0 :(得分:6)

在新数据到达时不断重新计算整个归约点将连续更改您的图形。该图将缺乏一致性。一个用户看到的图形将不同于另一个用户看到的图形,并且当用户刷新页面时该图形将发生变化(这不应该发生!),即使在服务器/应用程序关闭的情况下,您的数据也需要与以前保持一致。

  • 这是我的处理方式:

您的减少点应该保持原样。假设您正在获取每秒的数据,并且已经为5分钟的间隔图计算了减少的点,请将这些数据点保存在限制队列中。现在,收集接下来5分钟的所有秒数数据,并对这600个数据点执行归约操作,并将最后的归约点添加到您的限制队列中。

只要有一个API调用,我都会使队列同步,并且主线程将返回队列中的数据点。并且一旦整个5分钟间隔的数据都可用,工作线程就会在5分钟数据上计算减少点。

答案 1 :(得分:3)

我会用树。

子节点包含“ precision”和“ average”值。

“精度”是指日期范围。例如:1分钟,10分钟,1天,1个月等。这也意味着树中的某个水平。

“平均值”是最能代表一个范围价格的值。您可以使用简单的平均值,线性回归或任何您认为“最佳”的方法。

因此,如果您需要600个点(例如,您获得了窗口大小),则可以通过prec=total_date_range/600来找到精度,并将一些舍入到现有范围。

现在有了“ prec”,只需要检索该“ prec”级别的节点即可。

作为千兆字节的数据,我将它们切成std :: vector对象。树会为这些向量的最低节点存储ID。其余节点也可以通过向量索引来实现。

使用新数据更新仅需要更新一个分支(甚至创建一个新分支),该分支从根开始,但没有那么多子节点。