什么是最好的方法来找到数组的所有元素的总和,其索引可以被i整除,复杂度最低。
我写了下面的代码。但那是蛮力。我可以比那更好吗
#include<stdio.h>
int main() {
int n, q;
int mod = 1000000000 + 7;
scanf("%d", &n);
int arr[n+1];
int i;
for (i = 1; i <= n ; ++i) {
scanf("%d", &arr[i]);
}
int p;
scanf("%d", &p);
int sum = 0;
int j;
for(j = p; j <= n; j = j+p) {
sum = (sum + arr[j]) % mod;
}
printf("%d\n",sum);
return 0;
}
答案 0 :(得分:0)
您注意到您的示例实现是“暴力”,并询问您是否可以“做得更好”。蛮力通常意味着一种方法,该方法易于实现,但执行的工作量大得多,或者使用的内存比理论上所需的大得多。它建议投入大量资源来取代有效运作。通常,“实质上更多”归结为这种方法具有比最佳方法更高的渐近复杂度。
您的示例实现不是那样的。添加n / p
任意数字需要n / p
次操作,因此O(n)
是任务算法可以具有的最小渐近复杂度。这是您的实现的渐近复杂性,因此在这个意义上无法改进。
此外,您的实施似乎只能执行您希望的整体操作。考虑这个天真的,替代的, 更糟糕的 求和循环的实现:
for(j = 1; j <= n; j++) {
if (j % p == 0) {
sum = (sum + arr[j]) % mod;
}
}
这可以被视为将需求更直接地转换为C代码。虽然它仍然只是O(n),但它可能被合理地描述为强力实现,因为j
的增量(p-1)倍数和n
的{{1}}计算,这两个都是你的实现避免的。
结论:不,没有比你提出的实施更有效的实施。