数组元素如何与大O(n)相乘
How can be array elements multiplied with big O(n)
我有一个数组,它有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次乘法,你如何计算所有右边的括号?
相关文章:
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 std::map 中插入数组元素
- 使用指针访问数组元素时出现意外结果
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 缺少数组元素问题
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 删除在结构 c++ 中声明的数组元素
- Getter 和 Setter 用于类 C++ 中的数组元素
- 尝试递归获取数组元素的总和
- 数组元素如何与大O(n)相乘