如何计算阵列的移动平均值?

时间:2017-03-27 14:10:13

标签: c arrays algorithm

问题是,当输入大小为n array Xdegree kk-th时, 编写一个计算array X array X移动平均值的程序。 由原始数据值组成的X的k阶移动平均值是最后k个元素的平均值,直到A [i] = (X [i-k + 1] + X [i-k + 2] + ... + X [i]) / k的第i个点。

k

如果前一个元素(包括其自身)的数量小于k, 计算平均值。

例如,如果数组X如下且3X = 1 3 2 10 6 8A = 1 2 2 5 6 8 A [1] = (1 + 3) / 2, A [2] = (1 + 3 + 2) / 3

第三个移动平均线如下。

int main()
{
  int i, n1, k;
  int *array1;
  scanf("%d", &n1);
  array1 = (int *)malloc(sizeof(int)*n1);
  scanf("%d", &k);
  for (i = 0; i < n1; i++)
  {
    scanf("%d", &array1[i]);
  }

double tmp = 0;
for (int i = 0; i < n1; i++)
{
    tmp += array1[i];

    if (i >= k)     
    {
        tmp -= array1[i - k];
    }
    if (i >= k - 1) 
    {
        double average = tmp / k;
        printf("%2lld ", llrint(average));
    }

    return 0;
}

但是,程序的执行时间必须为O(n),而不是O(nk)。 舍入平均值计算中的小数点,并将其作为整数获取。 对于精确舍入,请不要使用%.f,而是使用int属性对其进行舍入。

Input : 9 4 (n = 9, k = 3)
         2 7 4 5 6 8 2 8 13
 Output : 2 5 4 5 6 6 5 6 8

该程序不起作用,因为问题无法理解。 我想知道如何解决它。

add)感谢您的回答,但问题所需的输出如下。

function findObjects(obj, targetProp, targetValue, finalResults) {

  function getObject(theObject) {
    let result = null;
    if (theObject instanceof Array) {
      for (let i = 0; i < theObject.length; i++) {
        getObject(theObject[i]);
      }
    }
    else {
      for (let prop in theObject) {
        if(theObject.hasOwnProperty(prop)){
          console.log(prop + ': ' + theObject[prop]);
          if (prop === targetProp) {
            console.log('--found id');
            if (theObject[prop] === targetValue) {
              console.log('----found porop', prop, ', ', theObject[prop]);
              finalResults.push(theObject);
            }
          }
          if (theObject[prop] instanceof Object || theObject[prop] instanceof Array){
            getObject(theObject[prop]);
          }
        }
      }
    }
  }

  getObject(obj);

}

1 个答案:

答案 0 :(得分:0)

修改代码后

int main()
 {
    int i, n1, k;
    int *array1, *array2;
    scanf("%d", &n1);
    array1 = (int *)malloc(sizeof(int)*n1);
    scanf("%d", &k);
    for (i = 0; i < n1; i++)
    {
        scanf("%d", &array1[i]);
    }

    double tmp = 0;
    for (int i = 0; i < n1; i++)
    {
        tmp += array1[i];
        // now tmp contains exactly k + 1 elements sum
        // so subtract elements outside of k sized window(leftmost element)
        if(i >= k) {
            tmp -= array1[i - k];
        }
        if(i >= k - 1) {
            double average = tmp / k;
            printf("%lf\n", average);
        }
    }
    return 0;
}