利用密钥进行地图无序交叉的高效算法

时间:2013-09-09 02:21:24

标签: c++

按键交叉两张地图的最有效方法是什么?

例如:给定

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>来交叉结果!

预期结果为:27

4 个答案:

答案 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);