用于存储订单的字典 - 数据结构
本文关键字:字典 数据结构 存储 用于 | 更新日期: 2023-09-27 18:31:05
我经常有一些订单下线,我需要存储它们并从中构建聚合。订单将有一个 ID,并且将有一个与之关联的工具类型。订单还可以附加一些事件,例如添加、更新或删除。如果是更新事件,则订单中不会附加工具类型,但订单 ID 将相同。例如:如果我有一个订单 ID 为 100 的工具 "xyz" 的订单,稍后我可以得到一个事件将 ID 为 100 的订单更新 20 美元,并且该事件(订单)不会出现工具类型。
收到订单后,我需要为独特的工具构建一个订单簿,例如工具"xyz"应该在订单簿中包含所有收到的订单。
我的问题是我能如何有效地存储它以及我应该为它使用什么样的数据结构?
订单如下所示:
public class Order
{
public Order(Action add, int id, string instrument, int price)
}
订单簿:
public class OrderBook
{
public string Instrument;
public List<Order> AllOrders;
}
选项 1:
当我收到订单时更新Dictionary<int,OrderBook>
,使用密钥作为订单 ID,并为仪器创建订单簿。
问题:这将处理更新事件,我可以检查订单是否已存在,然后更新订单簿。但是,一个工具类型应该只有一个订单簿,这里违反了这个条件,对于工具"xyz",可能会有多个添加订单通过,并且也使操作变得困难。
选项 2:
更新Dictionary<OrderBook, List<int>>
字典,使用值作为订单 ID。
:这将解决上述问题,但是当我收到更新事件时,我必须检查每个值列表(即订单 ID 列表)以查看订单是否已经存在,因为工具类型将为空,我无法通过 OrderBook 键查看。
订单是实时下降的,存储和检索的操作必须更有效率(如果不是 O(1) 那么 O(logn)),有没有更好的方法来构建它?
注意:订单簿是工具所有订单的汇总,对于该工具是唯一的。订单将针对特定价格的工具,并且同一工具将有许多订单。我从其他人(第三方库)那里获得订单和事件,我负责构建订单簿。
我认为这个问题是两个子问题的组合。
- 您正在跟踪跨输入的订单 ID。
- 您正在维护每件商品的唯一订单簿。
在这种情况下,我建议保留两个词典或者,您可以将List<order>
转换为订单簿中的dictionary <int, order>
,以简化订单簿的搜索。
对于选项 1,您提到了
但是,工具类型应该只有一个订单簿,这 此处违反了条件
您不会有多个订单簿,而是在字典条目中维护同一订单簿的引用。
试试这个。
public class Order
{
public Action Action { get; set; }
public int Id { get; set; }
public int Price { get; set; }
public Order(Action add, int id, int price){
//Initialize
}
}
public class Instrument
{
public string InstrumentName { get; set; }
public Dictionary<int, Order> OrderBook { get; set; }
public Instrument(string instrument)
{
InstrumentName = instrument;
//OrderBook = new List<Order>();
}
public void AddOrder(Order order)
{
//Check order exist condition
OrderBook.Add(order.Id, order);
}
}
然后使用List<Instrument>
我想它应该对你有用。如果这有任何问题,请告诉我。