![](/img/trans.png)
[英]What's the difference between std::multimap<key, value> and std::map<key, std::set<value> >
[英]Best approach to find a key in more than 1 (multiple) 'std::map's or 'std::set's?
將以帶有最少數據的std::map
示例為例。
我有2張地圖,如下所示:
map<string, Object*> map_ShortKey; // keys are single English words
map<string, Object*> map_LongKey; // keys are concatenated English words
map_ShortKey
在程序的開頭填充了約50個元素,並且始終保持不變。 但是map_LongKey
在整個程序中不斷增加,可能會增加到1000-10000個元素。
當我想在這些地圖中搜索單詞時,最好的方法是什么?
(1)首先在map_ShortKey
搜索,如果找不到,則在m_LongKey
搜索。
(2)將map_ShortKey
添加到m_LongKey
,然后搜索
您是說搜索單詞還是搜索關鍵字?
如果map_LongKey
包含串聯的單詞,則搜索串聯的第一個單詞將失敗。
但是,如果您要搜索的東西實際上是其中一張地圖中的鑰匙,那么(2)的答案取決於很多事情-需要更多信息。
如果您關心速度,則首先在最有可能包含該鑰匙的地圖中搜索。
如果您不關心速度,那么請為清晰起見來組織代碼-是否涉及將地圖合並在一起,還是取決於您的情況。
這取決於在map_Shortkey
成功查找的map_Shortkey
-如果很有可能,則在此搜索[log2(n)]中僅花費6個“步驟”,其中map_LongKey
列表中的搜索平均為10-13個“步驟”。
另一方面,如果不太可能在map_shortKey
找到想要的東西,那么在大集合中的另外50個元素中進行搜索所帶來的額外負擔不會有太大的不同。
由於我們不了解成功的統計數據,因此很難說哪種方法更好。
如果您傾向於最壞情況下的復雜性,並且不了解搜索內容(例如,在一個映射中比在另一個映射中更可能找到密鑰),那么我將采用方法1)。
std::map
中的查找具有對數最壞情況的復雜度,因此在第一種情況下,您將遇到log(n) + log(m)
查找的最壞情況復雜度(假設您的地圖分別具有n
和m
元素) )。 因此, k
查找將花費k * (log(n) + log(m))
。
在地圖中插入也具有對數復雜度,因此在第二種情況下,您將迫使m
插入從一個地圖插入另一個地圖,然后在具有m + n
元素的地圖中查找。 因此,對於k
查找(假設您僅是第一次插入),您將獲得m * log(n) + k * log(n + m)
最壞情況的復雜度。
因此,如果您擔心最壞的情況下的復雜性,則只要滿足以下條件,方法1)就更可取:
k * (log(n) + log(m)) < m * log(n) + k * log(n + m)
您可以根據工作量估算k
根據輸入的大小估算n
和m
,然后進行數學運算以找出最佳選擇(然后通過測量進行仔細檢查)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.