假设我想要一个具有不同价格的苹果容器。 我希望它们按价格排序(最高价格优先),但我也希望通过他们的ID快速检索它们。到目前为止我所拥有的是以下内容
struct AppleClass
{
string id;
int price;
bool operator<(const AppleClass& o) const
{
return price > o.price;
}
};
int main()
{
set<AppleClass> myapples;
myapples.insert({"apple1", 500});
myapples.insert({"apple2", 600});
myapples.insert({"apple3", 400});
for (auto& apple : myapples)
{
cout << apple.id << "," << apple.price << endl;
}
}
我的应用程序将花费20%的时间删除条目,20%插入条目,25%检索它们(检索整个列表),35%更新它们(它们的价格会增加或减少)。
容器最多可包含450个条目。
我的代码只能解决排序问题。查找是无用的,因为我想通过他们的id找到(所以我需要迭代所有这些)。出于同样的原因,删除和插入会很慢。
感觉这是错误的选择。
但是如果我有一张地图,那么它将根据id进行排序。每次我检索列表时,我都必须将其复制到某个容器中,例如,订购它,然后将其发送给用户,这也感觉很慢。
帮助!
答案 0 :(得分:1)
您可以使用两个容器,一个按价格(优先级队列或链接列表)排序,另一个索引您的ID(哈希映射)。为了节省空间,您可以让两个结构只保留指向Apple
实例的指针,但是您需要为此编写自定义排序函数。
这样,您的条目移除为O(1)
,插入为O(log n)
,检索也为O(1)
,更新为O(log n)
。我认为这应该是好的,特别是当你处理这么少的物品时(450)。
编辑:
阐述运营成本:
所有这些操作都是哈希映射的常量时间,因此这与优先级队列有关:
O(1)
的摊还成本。有很多聪明的实现可以告诉你如何做到这一点。O(log n)
执行此操作,如果您希望不断删除时间,那么保持这种方式会有点棘手。O(log n)
更好的复杂性更新,甚至摊销,你可能会必须在普通案例的优先级队列中随机播放。