Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计算平均值,然后将数组中最近的元素返回到平均值_C++_Arrays_Average - Fatal编程技术网

C++ 计算平均值,然后将数组中最近的元素返回到平均值

C++ 计算平均值,然后将数组中最近的元素返回到平均值,c++,arrays,average,C++,Arrays,Average,我假设计算double数组中的平均值,然后将数组中最近元素的值返回到计算的平均值。但我使用的算法是O2n。在计算平均值的同时,是否可以确定最接近平均值的元素 我想没有 #include <iostream> #include <cmath> using namespace std; double* aver(double* arr, size_t size, double& average){ for(int i = 0; i < size; i+

我假设计算double数组中的平均值,然后将数组中最近元素的值返回到计算的平均值。但我使用的算法是O2n。在计算平均值的同时,是否可以确定最接近平均值的元素

我想没有

#include <iostream>
#include <cmath>
using namespace std;

double* aver(double* arr, size_t size, double& average){
    for(int i = 0; i < size; i++)
        average+=arr[i];
    average/=size;
    double* ret = arr;
    for(int i = 0; i < size; i++){
        if(abs(arr[i] - average) < abs(*ret -  average)){
            *ret = arr[i];
        }
    }
    return ret;
}

int main(){
    double arr[] = {1,2,3,4,5,7};
    size_t size = sizeof(arr)/sizeof(arr[0]);
    double average = 0;
    double* p = aver(arr, size, average);
    cout<< *p << " " << average << endl;
    return 0;
}

如果对数组进行排序,则可以通过简单的Ologn二进制搜索找到最接近目标的元素。如果未排序,则为线性搜索


作为旁注,O2n可能具有直观意义,但从数学上讲,它与On没有什么不同。

在数组中只有非负值的前提下,您可以使用代码的这种自适应:

#include <iostream>
#include <cmath>
using namespace std;

double* aver(double* arr, size_t size, double& average){
    int iclosest = 0;
    for(int i = 0; i < size; i++) {
        average+=arr[i];
        if (abs(arr[iclosest + 1] - average/(i+1)) < abs(arr[iclosest] - average/(i+1)))
            ++iclosest;
    }
    average/=size;
    return &arr[iclosest];
}

int main(){
    //double arr[] = {1,2,3,4,5,7};
    double arr[] = {4,5,3,2,1,7};
    size_t size = sizeof(arr)/sizeof(arr[0]);
    double average = 0;
    double* p = aver(arr, size, average);
    cout<< *p << " " << average << endl;
    return 0;
}
它也可以调整为与负值一起工作


不过,就O2n=On而言,我同意。

数组是否按顺序排序?如果是这样的话,我们可以优化我们的循环。可能有一个聪明的技巧,可以在一次传递中获得平均值和最接近平均值的元素,但它可能不会产生任何实际的性能差异,因为On和O2n是同一件事。你检查过这个问题的其他答案了吗