获得2个向量之间最大差异的最快方法

时间:2016-05-26 12:21:54

标签: c++ vector stl

我想找到一种方法,找到一种快速的方法来获得两个矢量之间的最大差异,好像它们已经累积

例如,(尚未累积)

vector<int> vec1 = {10, 30, 20, 40 };
vector<int> vec2 = {5, 10, 5, 8 };

获得结果的天真方法是首先将它们积累到新的向量中,所以:

vector<int> accumulated_vec1 = {10, 10+30, 10+30+20, 10+30+20+40};
vector<int> accumulated_vec2 = {5, 5+10, 5+10+5, 5+10+5+8};

即:

accumulated_vec1 = {10,40,60,100};
accumulated_vec2 = {5,15,20,28};

然后,结果是abs(accumulated_vec1[i]-accumulated_vec2[i])之间的最大值,而0 <= i <= 3。

所以result = 72(当i == 3时)

更快的方法可以通过1个数字(甚至0.10302040)表示向量...但我发现它没有帮助:\认为我有2对向量vec1和vec2的数百对,我正在尝试避免计算每一对的累积向量..对不起,如果不清楚,但如果我找到解决方案,我会回答这个烦人的问题。

3 个答案:

答案 0 :(得分:2)

最快的方式......

int maxDiff(const vector<int> &v1, const vector<int> &v2) {
    int maxDiff(0), diff(0);

    for (auto it1 = v1.begin(), it2 = v2.begin(); it1 != v1.end() && it2 != v2.end(); ++it1, ++it2) {
        diff += *it1-*it2;
        maxDiff = max(abs(diff), maxDiff);
    }

    return maxDiff;
}

没有其他的矢量构造,只是移动指针甚至比每次获取每个索引的元素更快。

Live Demo

答案 1 :(得分:0)

看看下面的代码。这是否符合您的要求?

vector<int> accumulated_vec;
accumulated_vec.resize(vec1.size());
accumulated_vec[0] = vec1[0] - vec2[0];

for(int i = 1; i < accumulated_vec.size(); i++)
{
    accumulated_vec[i] = accumulated_vec[i-1] + (vec1[i] - vec2[i]);
    cout << accumulated_vec[i] << endl;
}

答案 2 :(得分:0)

这是我的问题版本

int getAccumulatedForIndex(int index, vector<int> &vec) {
    if (index == 0) {
        return vec.at(index);
    }
    return vec.at(index) + getAccumulatedForIndex(index - 1, vec);
}

而不是

int getAccumulatedMax(vector<int> vec1, vector<int> vec2) {
    if (vec1.size() != vec2.size()) { // don't much each other
        return -1;
    }

    int max = -1;
    for (int i = 0; i < vec1.size(); ++i) {
        int currentMax = abs(getAccumulatedForIndex(i, vec1) - getAccumulatedForIndex(i, vec2));
        if (currentMax > max) {
            max = currentMax;
        }
    }

    return max;
}

希望这就是你想要的东西

相关问题