【问题标题】:Which STL container for Orderbook representation?哪个 STL 容器用于 Orderbook 表示?
【发布时间】:2017-01-23 14:19:06
【问题描述】:

我正在构建一个应用程序,用于接收来自不同货币交易所的价格数据更新。现在我需要选择最高效的容器。容器将使用 Entry 类型的元素:

struct Entry
{
    std::string exchange_name;
    double price;
    double amount;
}

参赛作品必须按价格升序排列:

Ex.Name    Price    Amount
  "A"       1.2       23
  "B"       1.3       3
  "A"       1.4       1.2
  "C"       1.5       4
  "A"       1.6       2

容器上会有很多插入和移除。我猜每秒最多 200 次是可能的。容器内的值可能不是const,因此可以针对特定条目更改金额。

到目前为止,我得出的结论是std::list 可能是一个不错的选择,因为它是allows constant time insert and erase operations anywhere within the sequence

std::list 是这个应用程序的最佳选择还是应该使用另一个容器?

【问题讨论】:

  • 最好的方法是找到潜在的最佳候选者(std::list 可能很好)并测量实际性能,看看它是否符合您的需求。
  • 您将如何确保在列表中排序?在您的情况下,插入最多为 O(log(n)) ,因为您需要找到在列表中插入的位置。
  • std::list 具有恒定的时间插入和擦除,但您仍然需要遍历列表以找到要插入/擦除的位置(这很慢)。您是否需要始终订购容器,还是可以不订购,然后仅在需要打印/保存/等容器时订购?
  • 您在示例中重复了条目。这是否意味着您可以同时拥有重复条目和更新现有条目?如果是这样,您如何区分这两者?

标签: c++ stl containers


【解决方案1】:

好吧,列表插入将是一个常数时间,但你的列表应该是有序的,因此,你需要先找到一个合适的插入位置。这将需要O(N) 时间! 因此,更喜欢像std::multimap 这样的基于有序树的容器更有效。插入或搜索将花费O(log(N)) 时间。价格应该是关键

【讨论】:

  • 如果列表是以有序方式构建的,则插入点可以在 log(n) 中找到。
  • 不!因为,不像在数组中,你不能在少于 O(N) 的时间内到达它的中点
  • 但是显示列表需要首先从地图中检索所有元素,显示它们然后将它们插入回来(或者像在清空地图之前复制地图),这实际上是 O(N ·log(N))。如果列表需要一直显示,这可能不是一个好的选择。
  • @AndreySScherbakov 谢谢,我没有仔细考虑,你是对的。
  • 如果一个列表对半切开,时间复杂度将是 O(N) 而不是 O(N*log(N)),因为每一步搜索都会在一个指数级的子列表上完成减小尺寸;比如说,你有一个包含 1024 个元素的列表;第一次中位数搜索将进行 512 次迭代,接下来是 256 次,然后是 128 次,以此类推。 512+256+...+ 1 = 2^k+2^(k-1)+...2^0 = 2^(k+1)-1 = 1024-1 的总和 - 差不多作为原始列表大小(此处为 k=9)
猜你喜欢
  • 2010-12-06
  • 2012-05-20
  • 2011-09-18
  • 2012-11-23
  • 2018-12-03
  • 2010-11-18
  • 2019-10-01
  • 2011-03-14
  • 1970-01-01
相关资源
最近更新 更多