【问题标题】:Range within an array in CC中数组内的范围
【发布时间】: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 元素的值而异。尝试写下连续迭代中的总和以查看模式。可能有更快的解决方案,但我不知道代码的用途。

标签: c arrays algorithm


【解决方案1】:

不,C 没有内置这样的功能。此外,一旦将数组传递给函数(所谓的“衰减到指针”),就没有获取数组上边界的功能。

这个问题有两种标准解决方案:

  • 传递指向第一个数组元素和元素计数的指针,或者
  • 传递指向整个数组的指针、指向初始元素的索引以及指向最后一个元素的索引

第一种方法如下所示:

int sum_array(int* array, size_t len) {
    int res = 0;
    for (size_t i = 0 ; i != len ; i++) {
        res += array[i];
    }
    return res;
}
...
int ProfitA = sum_array(array, A);
int ProfitB = sum_array(array+A, B);
int ProfitC = sum_array(array+A+B, N-A-B);

第二种方法如下所示:

int sum_array(int* array, int first, int last) {
    int res = 0;
    for (int i = first ; i <= last ; i++) {
        res += array[i];
    }
    return res;
}
...
int ProfitA = sum_array(array, 0, A-1);
int ProfitB = sum_array(array, A, A+B-1);
int ProfitC = sum_array(array, A+B, N-1);

【讨论】:

  • 所以我还需要一个函数 sum_array。还有更多嵌套的 for 循环。
  • @NikosKLon 我不知道您所说的“更多嵌套循环”是什么意思,但函数 sum_array 可以解决问题。您可以重写算法以避免在计算总和时出现循环,但这将是一种不同的算法。
  • @dasbblinklight 你能给我“另一种算法”的想法吗?
【解决方案2】:

没有办法使用你用来描述你所追求的语法风格。

两种明显的方法是提供数组和索引范围(如前所述)或使用两个指针指定范围

int ProfitB = Sum(array + A, array + A+B-1);   /* sum array[A] ... array[A+B-1] */

无论您使用哪种方法,您的调用代码都需要确保它提供有效范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2012-04-27
    • 1970-01-01
    • 2011-05-23
    • 2011-05-09
    • 2020-07-16
    • 2014-07-26
    相关资源
    最近更新 更多