所有arr [j]的总和,其中我除了j

时间:2016-09-15 14:03:40

标签: c arrays language-agnostic

什么是最好的方法来找到数组的所有元素的总和,其索引可以被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;
}

1 个答案:

答案 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}}计算,这两个都是你的实现避免的。

结论:不,没有比你提出的实施更有效的实施。