在不迭代的情况下在两个映射中找到共同值
Posted
技术标签:
【中文标题】在不迭代的情况下在两个映射中找到共同值【英文标题】:Find common value in two maps without iterating 【发布时间】:2019-07-20 20:15:17 【问题描述】:我有这两张地图,每张都存储 10000 多个条目:
std::map<std::string,ObjectA> mapA;
std::map<std::string,ObjectB> mapB;
我只想从两个映射中都存在键的映射中检索那些值。
例如,如果在 mapA 和 mapB 中都找到键“10001”,那么我想要两个映射中的相应对象。类似于在 SQL 表上进行连接。最简单的方法是遍历较小的映射,然后在每次迭代中执行 std::find(iter->first) 以找到符合条件的键。那也太贵了。
相反,我正在考虑维护这样的集合:
std::set<std::string> common;
1) 每次插入其中一张地图时,我都会检查它是否存在于另一张地图中。如果是,我将密钥添加到上述公共集合中。
2) 每次我从其中一个地图中删除一个条目时,我都会从公共集中删除该键(如果存在)。
公共集始终维护两个映射中的键。当我想要加入时,我已经有了合格的密钥。有更快/更好的方法吗?
【问题讨论】:
10K 条目并不是很多 - 我会选择最简单的解决方案,它几乎肯定会足够快。 我很可能会使用en.cppreference.com/w/cpp/algorithm/set_intersection 或类似的答案:***.com/questions/3772664/intersection-of-two-stdmaps 这实际上取决于您需要执行此操作的频率以及地图更改的频率。尝试缓存数据对于某些用途可能是值得的,但对于其他用途而言,它过于复杂且成本更高。 @NeilButterworth 通常,您是对的。但是这个函数被调用太频繁了,所以我需要最大化性能。 【参考方案1】:算法非常简单。首先,您将两个映射视为序列(使用迭代器)。
如果任一剩余序列为空,则完成。 如果序列前面的键相同,则您已找到匹配项。 如果键不同,则丢弃两者中较低的(根据地图的排序顺序)。您将在两个地图上进行迭代,这意味着 O(n+m) 的复杂度,这明显优于具有 O(n log m) 或 O(m log n) 复杂度的简单方法。
【讨论】:
以上是关于在不迭代的情况下在两个映射中找到共同值的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以在不使用 getImageData() 的情况下在 JavaScript 中找到像素的颜色?
如何在不更改构建系统的情况下在 C 项目中使用 rust 代码?
在不使用 boost::promise 的情况下在 boost 线程中返回值