以最少的数据取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
,然后搜索
答案 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)
次查找的最坏情况复杂性(假设您的地图分别有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
进行估算,然后进行数学运算以找出最佳效果(然后加倍)通过测量来检查这一点。