使用指针在常数时间内从集合中删除

Delete from set in constant time with pointers

假设我有一个表单结构。

struct Order {
    int id;
    double price;
    // more data
}

ID是唯一标识。现在我在一个OrderBook中跟踪这些Orders。我需要提供一个插入(创建一个新的订单对象)和一个擦除方法(删除具有特定 ID 的订单)。这个想法当然是尽可能高效。

struct OrderBook {
    unordered_map<int, Order> orders; // ID -> Orders
    // ...
}

此外,我必须快速访问当前订单簿中价格最高的订单。

我正在考虑在数据结构中包含一对按字典顺序排序的 pair<double, id> 类型(价格和 ID)(也许 set?)。插入将是高效的 (O(log n)),但由于数据结构是按价格排序的,而不是按 ID 排序的,因此从该数据结构中查找和删除元素将在 (O(n)) 中进行。那么我可以在指向 Price/ID 对的 Order 对象中存储一个指针吗?但这仍然不会在集合中删除它吗?有什么想法吗?

have fast access to the Order with the highest price

什么是"fast"?持续的? O(logn)?

这是经典的时间记忆权衡。你可以有另一个数据结构,"max-heap",保存指向你的对象的指针,并具有比较函数,通过指向对象的价格比较两个指针。