簡體   English   中英

在超過1(多個)“ std :: map”或“ std :: set”中找到密鑰的最佳方法?

[英]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)查找的最壞情況復雜度(假設您的地圖分別具有nm元素) )。 因此, 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根據輸入的大小估算nm ,然后進行數學運算以找出最佳選擇(然后通過測量進行仔細檢查)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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