【问题标题】:Double sum optimization双和优化
【发布时间】:2019-03-15 07:33:00
【问题描述】:

最近我在一次采访中遇到了这个问题,很遗憾我跳过了这个问题,但我很想得到答案。你能帮帮我吗?

int sum = 0;
int num = 100000000;
for (int i = 0; i < num; i++){
    for (int j = 0; j < num; j++ ){
        sum += m_DataX[i] * m_DataX[j];
    }
}

已编辑:另外我想看看如果我们对sum 有以下表达式,是否可以优化:

sum += m_DataX[i] * m_DataY[j];

【问题讨论】:

  • 这段代码计算m_DataX 中元素和的平方。那么优化就很简单了...
  • 对元素求和并平方。
  • 无论你用它做什么,它都可能会溢出。如果您无论如何都无法获得正确的值,那么优化的意义何在。

标签: arrays algorithm optimization


【解决方案1】:

简单地说,就是数字和的平方。 为什么?

设一个数组是|1|2|3|

然后,代码产生

1*1 + 1*2 + 1*3
2*1 + 2*2 + 2*3
3*1 + 3*2 + 3*3

也就是说,

(1*1 + 1*2 + 1*3) + (2*1 + 2*2 + 2*3) + (3*1 + 3*2 + 3*3)

=>1(1+2+3) + 2(1+2+3) + 3(1+2+3)

=>(1+2+3)*(1+2+3)

因此,代码将是

int tempSum = 0;
for (int i = 0; i < num ; i ++){
   tempSum+=m_DataX [i];
}

sum=tempSum*tempSum;

更新:

如果,sum += m_DataX[i]*m_DataY[j]

设两个数组,|1|2|3||4|5|6|

因此,

1*4 + 1*5 + 1*5
2*4 + 2*5 + 2*6
3*4 + 3*5 + 3*6

=> 1*4 + 2*4 + 3*4 + 1*5 + 2*5 + 3*5 + 1*6 + 2*6 + 3*6 => (1+2+3)*(4+5+6)

【讨论】:

  • 非常感谢您的宝贵时间,最后一件事如果:sum += m_DataX [i]*m_DataY [j];
  • @user1608933:很简单,你可以自己做。 sumOfAll(m_DataX) * sumOfAll(m_DataY)
  • @user1608933:如果你得到你的答案,请接受答案。
【解决方案2】:

首先,在 for 循环之外实例化 i 和 j。然后将所有元素相加并计算它的平方,这将是您的结果。

【讨论】:

  • 1) 除了降低代码的可读性之外,成本改进将取决于语言并且可以忽略不计; 2) j 甚至没有必要。
猜你喜欢
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-24
  • 2016-07-14
相关资源
最近更新 更多