簡體   English   中英

我應該使用哪個容器

[英]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;         
    }
}

http://ideone.com/NcjWDZ

我的應用程序將花費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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM