【问题标题】:Incremental price graph approximation增量价格图近似
【发布时间】:2019-04-23 06:34:21
【问题描述】:

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

一个货币对在很长一段时间内可能有数千兆字节的数据,因此将所有数据发送给客户端不是一种选择。 在做了一些研究之后,我最终使用了 Douglas-Peucker Line Approximation Algorithm:https://www.codeproject.com/Articles/18936/A-C-Implementation-of-Douglas-Peucker-Line-Appro 它可以减少发送给客户端的点数,但有一个问题:每次有新数据时,我都必须遍历所有服务器上的数据,由于我想实时更新客户端上的数据,这需要大量的资源。

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

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

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

    • 这就是我的处理方式:

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

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

    【讨论】:

    • 对于流行的货币对,您每秒可以收到数百次更新,因此数据要多得多
    • 实际上,如果您看到一般的股票/硬币图表,图表上的点数将是恒定的。即使您每秒都收到数据,您也会限制第二张图表要显示的值的数量。假设您的整体图表可以显示 100 个数据点,这意味着您的每小时图表可以显示 100 小时单位的数据(即过去 4 天和小时),并且以类似的方式,您的秒图表可以显示 100 秒单位的数据(即,最后 1 分 40 秒)。因此,在上述情况下,您的第二张图表也将具有与小时图表相同的数据量 (45 MB)
    • 我越来越想它,这似乎是一个架构问题而不是算法问题。要准确显示图表,您需要所有数据点。这是肯定的。为了近似您的图表,您可以使用曲线拟合算法以及您提到的 Douglas Pecker 算法
    • 顺便说一句,Douglas Peuker 算法博客页面中的垂直距离公式很笨拙。寻找区域是不必要的。找到两条线之间的交点比找到区域要简单得多。在不需要的地方应用平方根会舍入许多值。
    • @SiberianGuy 我添加了第二种方法。
    【解决方案2】:

    我会使用树。

    子节点包含“精度”和“平均值”值。

    “精度”表示日期范围。例如:1 分钟、10 分钟、1 天、1 个月等。这也意味着树中的一个级别。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-28
      • 2012-06-25
      • 2014-01-21
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多