【问题标题】:fastest way to get the maximal difference between 2 vectors获得2个向量之间最大差异的最快方法
【发布时间】:2016-05-26 12:21:53
【问题描述】:

我想获得一些想法,以找到一种快速方法来获得 2 个向量之间的最大差异就像它们是累积的一样。

例如,(尚未累积)

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

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

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

【问题讨论】:

  • 这看起来很简单......(您可以即时计算累积,无需将其存储在另一个向量中)。你遇到了什么问题?
  • 对不起,忘了说我需要累积向量用于其他函数中的其他计算。我只是想考虑将它们保存在向量之外的其他结构中。也许,其他方式,例如六角\数字(不知何故)。想想我有数百万对这样的对
  • 您的代码已经相当快了,但请确保您在累积的向量上调用 .reserve() 以避免在将内容推回其中时重新分配(我假设您正在将其填充到里面实际代码中的循环)。如果你确实有很多你刚才说的元素,这将是对你的代码的一个很好的优化。
  • 我不知道你的问题到底是什么。是如何将部分总和计算到vectors 中?还是什么?
  • @ErezShmiel 我不太明白你的问题。在问题中您说“好像它们是累积的”,这表明您正在寻找一种替代方法来避免累积和复制到其他向量,然后在您的评论中说 您需要其他事物的两个累积向量。如果您确实需要这些向量用于其他计算,那么真的没有办法避免这些向量的计算,对吧?如果您确实需要该数据,则不能跳过该步骤。我对你到底需要什么感到困惑。

标签: c++ vector stl


【解决方案1】:

最快的方法...

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

【讨论】:

    【解决方案2】:

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

    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;
    }
    

    【讨论】:

      【解决方案3】:

      这是我解决您问题的版本

      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;
      }
      

      希望这就是你想要的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-18
        • 1970-01-01
        • 2018-10-09
        • 2018-10-23
        • 2019-06-12
        • 2017-09-29
        • 1970-01-01
        • 2013-03-27
        相关资源
        最近更新 更多