在超过1(多个)'std :: map'或'std :: set'中找到密钥的最佳方法是什么?

时间:2013-02-01 13:24:40

标签: c++ performance search map set

以最少的数据取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,然后搜索

3 个答案:

答案 0 :(得分:2)

您的意思是搜索一个单词,还是搜索一个键?

如果map_LongKey包含连接的单词,那么搜索连接的第一个单词将不会成功。

如果您正在搜索其中一个地图中实际上是关键字的内容,那么(2)的答案取决于很多事情 - 需要更多信息。

如果您关心速度,请先搜索最有可能包含密钥的地图。

如果速度不是您的关注点,那么为了清晰起见,请构建代码 - 这是否涉及将地图合并在一起,否则将取决于您的情况。

答案 1 :(得分:1)

这取决于map_Shortkey中成功查找的可能性 - 如果很可能,那么您只需在此搜索[log2(n)]中花费6个“步骤”,其中{{1}列表平均10-13“步”。

另一方面,如果你不太可能在map_LongKey中找到你想要的东西,那么在大集合中另外50个元素之间进行搜索的额外负担并不会对差异。

由于我们不知道成功的统计数据,因此很难说哪种方法更好。

答案 2 :(得分:1)

如果你喜欢最坏情况的复杂性和而不知道任何关于你的搜索(例如,密钥更可能在一个地图中找到而不是在另一个地图中找到),那么我会选择方法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进行估算,然后进行数学运算以找出最佳效果(然后加倍)通过测量来检查这一点。