数组元素如何与大O(n)相乘

How can be array elements multiplied with big O(n)

本文关键字:相乘 数组元素      更新时间:2023-10-16

我有一个数组,它有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)如果没有除法行元素,我怎么能做到这一点?

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

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

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

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;

您有两个依赖于数学技巧的答案。

我会专注于实际需要做什么工作。看看第一个和第二个计算。你计算两者做大约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次乘法,你如何计算所有右边的括号?