【发布时间】:2015-02-01 13:56:41
【问题描述】:
我想出了一个算法,我想问一些问题。有没有办法在数组中设置一系列值?
例如
int N = 10;
int array[N] = {2,6,5,9,4,3,5,9,4,9};
并使用循环来增加每次传递的起始值。
for (int A = 1; A < N - 2; A++) {
for (int B = 1; B < N - 1; B++) {
int ProfitA = Sum(array[0...A-1]);
int ProfitB = Sum(array[A...A+B-1]);
int ProfitC = Sum(array[A+B...N-1]);
}
}
那么有没有办法使用上面的C伪代码来设置每个数组中的值的范围呢?
【问题讨论】:
-
不,您必须编写自己的求和函数并为其提供数组和索引范围。
-
正如@lared 所说,您必须将伪代码中的每个 Sum 替换为 for 循环
-
您可以编写一个将数组和索引作为参数的函数,例如(假设数组存储整数)-
int Sum(int *array, int start, int end); -
是的,我的意思是求和函数。至于效率,由于
Sum的幼稚使用,上述程序是 O(n^3) - 毕竟它必须遍历数组才能得到总和。您应该考虑缓存总和(例如,ProfitA 仅在外部循环的每次迭代中通过 array[A-1] 更改,但是您在外部循环的每次迭代中执行 (N-2)*(A-1) 操作(N -2 次内循环迭代 + A-1 次迭代以计算每次迭代的总和),而不是仅仅一次! -
您可以通过使用缓存总和并相应地修改它们来将其减少到 O(n^2)。请注意,ProfitA 不依赖于 B 的值,但您仍将其包含在内循环中。与 B 的每次更改类似,ProfitB 和 ProfitC 仅因数组的 ONE 元素的值而异。尝试写下连续迭代中的总和以查看模式。可能有更快的解决方案,但我不知道代码的用途。