C++ 计算平均值,然后将数组中最近的元素返回到平均值
我假设计算double数组中的平均值,然后将数组中最近元素的值返回到计算的平均值。但我使用的算法是O2n。在计算平均值的同时,是否可以确定最接近平均值的元素 我想没有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+
#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是同一件事。你检查过这个问题的其他答案了吗