【问题标题】:Compute minimum dot product c++计算最小点积 C++
【发布时间】:2016-05-08 14:44:06
【问题描述】:

我正在尝试计算两个数组/向量的最小点积。详情如下:

问题:给定两个序列 a1, a2, . . . , 和 b1, b2, . . . , bn, 求第二个序列的排列 π 使得 a1, a2, 的点积。 . . , an 和 bπ1, bπ2, . . . , brπn 最小。

我的逻辑工作正常,但是当我尝试如下输入时,由于整数溢出而失败。我将使用哪些数据类型来适应我的条件 1 ≤ n ≤ 10^3; −10^5 ≤ ai, bi ≤ 10^5 对于所有 1 ≤ i ≤ n

1

99999

99999

上述场景的输出应该是 9999800001 ,但我得到的是 1409865409

#include <algorithm>
#include <iostream>
#include <vector>
#include <numeric>

using std::vector;

int64_t min_dot_product(int n, vector<int> a, vector<int> b) {
    int64_t result = 0;
    if (n != 0)
    {
        std::sort(a.begin(), a.end());
        std::sort(b.begin(), b.end());
        std::reverse(a.begin(), a.end());

        /*for (long long int i = 0; i < n; i++) {
            result += a[i] * b[n - 1 - i];
        }*/

        result = std::inner_product(a.begin(), a.end(), b.begin(), 0);
    }
    return result;
}

int main() {
    int n;
    std::cin >> n;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    }
    for (int i = 0; i < n; i++) {
        std::cin >> b[i];
    }
    std::cout << min_dot_product(n, a, b) << std::endl;
}

【问题讨论】:

  • 你不应该改变a的顺序,只能改变b。
  • 另外,std::next_permutation 您可能也感兴趣。
  • 不,即使我也改变了 a 的顺序,它也可以工作,我已经测试过了。
  • 其实你是对的。如果 a 不变,则 a 顺序的任何更改都与结果 b 的更改相同。
  • 我想了解我问的问题是否有问题?因为它被某人投了反对票。欢迎任何意见。

标签: c++ algorithm dot-product


【解决方案1】:

进行以下更改:

  1. vector&lt;int&gt; 替换为vector&lt;int64_t&gt; 以将数字存储为64 位整数。

  2. 使用result = std::inner_product(a.begin(), a.end(), b.begin(), 0LL);
    0LL 建议结果是int64_t

问题是您将它存储在int32_t 中,因此乘法溢出。

【讨论】:

  • @StoryTeller, int32_t 在我们的案例中不起作用。因为在std::inner_product 的库实现中,它将值相乘而不将其转换为结果的数据类型。所以,int32_t 会相乘,结果溢出。
  • 你大错特错了。 inner_product 的返回类型与传递给它的初始值相同。并且对运算符的要求是它们的返回值可以转换为返回类型。长话短说,除非从 int32_tint64_t 的隐式转换失败,否则您不必不必要地扩展向量。
  • @StoryTeller,我放弃并打开了标准草案。 通过使用初始值 init 初始化累加器 acc 然后使用 acc = acc + (*i1) * (*i2) 修改它来计算其结果
  • @chris,这就是我记得的。它也验证了 Rishit 的观点。我误以为它不会溢出。我希望整数提升可以拯救我们,但是唉。
  • @StoryTeller,有趣的是,如果我们的数据类型小于int,例如short(假设它们在该实现中的大小不同),则会进行促销。在这种情况下,shorts 将被提升为 ints,然后再相乘,这仅仅是因为语言使用整数运算符的方式。
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2019-11-05
  • 2013-10-02
  • 2015-09-07
  • 2013-05-06
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多