双重总和优化

时间:2018-10-10 11:37:30

标签: arrays algorithm optimization

最近我在一次采访中遇到了这个问题,但不幸的是我跳过了这个问题,但是我很想知道答案。你能帮我吗?

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

2 个答案:

答案 0 :(得分:13)

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

让我们说一个数组是|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)

答案 1 :(得分:0)

首先,在for循环外实例化i和j。然后将所有元素求和,然后计算将得出结果的平方。