如何将数组元素乘以大O(n)

时间:2014-10-12 18:49:08

标签: c++ arrays data-structures

我有一个N号的数组。我想将数组元素乘以以下规则;

arr[n]={5,7,2,3,4....}

the first row:A[0]*A[2]*A[3]*A[4]....*A[n]
the second row:A[0]*A[1]*A[3]*A[4]....*A[n]
the third row:A[0]*A[1]*A[2]*A[4]...*A[n]
...........
the n row:A[0]*A[1]*A[2]*A[3]*A[4]....*A[n-1]

我用O(n ^ 2)做了但是我无法解决它O(n)如果没有除法行元素我怎么能这样做呢?

3 个答案:

答案 0 :(得分:5)

假设数组中没有零,可能的方法可能是

product = A[0]*...*A[n]
first = product / A[1]
second = product / A[2]
....

如果不允许分割,您可以使用左右运行的产品并执行以下操作:

int P[N], Q[N];
P[0] = A[0];
for(int i = 1; i < N; ++i)
    P[i] = P[i - 1] * A[i];
Q[N-1] = A[N-1]; 
for(int i = N-2; i >= 0; --i)
    Q[i] = Q[i+1] * A[i];

for(int i = 1; ....)
    R[i] = P[i-1] * Q[i+1];

答案 1 :(得分:2)

假设我们没有溢出并且没有零。

std::array<int, n> arr = {5, 7, 2, 3, 4, ...};
int total = 1;

for (int v : arr)
    total *= v;
for (int & v : arr)
    v = total / v;

答案 2 :(得分:2)

你有两个依靠数学技巧的答案。

我会专注于实际需要的工作。看一下第一次和第二次计算。你计算了大约2n个产品。但是看看你正在成倍增加的数字:这两个计算有很多共同之处。应该很明显如何仅使用约n种产品来计算两者。

一旦你有了这个想法,你应该能够用大约3n次乘法计算你想要的所有结果,而不需要任何除法。我会把你的计算写得有些不同:

For the first row: (A[0]) * (A[2]*A[3]*A[4]....*A[n])
For the second row:(A[0]*A[1]) * (A[3]*A[4]....*A[n])
For the third row: (A[0]*A[1]*A[2]) * (A[4]...*A[n])

如何计算进行n次乘法的所有左括号?你如何计算所有正确的括号进行n次乘法?

相关问题