[英]which container should i use for this
假設我想擁有一個價格不同的蘋果容器。 我希望它們按價格排序(最高價格優先),但我也希望通過他們的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進行排序。 每次我檢索列表時,我都必須將其復制到某個容器中,例如,訂購它,然后將其發送給用戶,這也感覺很慢。
救命!
您可以使用兩個容器,一個按價格(優先級隊列或鏈接列表)排序,另一個索引您的ID(哈希映射)。 為了節省空間,您可以讓兩個結構只保留指向Apple
實例的指針,但是您需要為此編寫自定義排序函數。
這樣,您的條目刪除是O(1)
,插入是O(log n)
,檢索也是O(1)
,更新是O(log n)
。 我認為這應該是好的,特別是當你處理這么少的物品時(450)。
編輯:
詳細說明運營成本:
所有這些操作都是哈希映射的常量時間,因此這是優先級隊列:
O(1)
的攤銷成本。 有很多聰明的實現會告訴你如何做到這一點。 O(log n)
執行此操作,如果您希望不斷刪除時間,那么保持這種方式會有點棘手。 O(log n)
更好的復雜性來進行更新,甚至是分期付款,你可能不得不在優先級隊列中為普通情況改變現狀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.