按键交叉两张地图的最有效方法是什么?
例如:给定
map<int, float> m1;
map<int, float> m2;
m1[1] = 1.0;
m1[2] = 4.0;
m1[3] = 3.0;
m1[7] = 5.0;
m2[7] = 3.0;
m2[4] = 2.0;
m2[2] = 4.0;
m2[9] = 6.0;
我需要一个vector<int>
来交叉结果!
预期结果为:2
和7
答案 0 :(得分:0)
由于密钥已排序,因此在O(n)时间内很容易实现。只需迭代它们中的每一个,并且每当键相等时,将该键添加到向量并增加两个迭代器。否则递增具有最低密钥的迭代器。
答案 1 :(得分:0)
答案与设置交叉点相同。 循环遍历第一组,并查询元素是否在第二组中。 复杂度为O(n lg m),而n和m分别为2组的大小。
如果使用由哈希表而不是红黑树支持的unordered_map,则可以将复杂度设置为O(n)。
答案 2 :(得分:0)
我可以将其视为m1
,而m2
已经在O(n)
std::vector<int> v_intersection;
map<int, float> ::iterator i,j;
i=m1.begin(),j=m2.begin();
for(; i!=m1.end() && j!=m2.end() ;)
if (i->first < j->first)
++i;
else if (i->first > j->first)
++j;
else{
v_intersection.push_back(i->first);
++i,++j;
}
答案 3 :(得分:0)
我修改了我的方案的Intersection of two STL maps帖子。
template<typename keyType, typename leftValue, typename rightValue>
vector<keyType> intersectMaps(const map<keyType, leftValue>& left, const map<keyType, rightValue>& right) {
vector<keyType> result;
typename map<keyType, leftValue>::const_iterator itrL = left.begin();
typename map<keyType, rightValue>::const_iterator itrR = right.begin();
while (itrL != left.end() && itrR != right.end()) {
if (itrL->first < itrR->first) {
++itrL;
} else if (itrR->first < itrL->first) {
++itrR;
} else {
result.push_back(itrL->first);
++itrL;
++itrR;
}
}
return result;
}
EG。使用:
map<int, float> m1;
map<int, float> m2;
m1[1] = 1.0;
m1[2] = 4.0;
m1[3] = 3.0;
m1[7] = 5.0;
m2[7] = 3.0;
m2[4] = 2.0;
m2[2] = 4.0;
m2[9] = 6.0;
vector<int> result = intersectMaps<int, float, float> (m1, m2);