我想计算双精度数组中的平均值然后将数组中最接近元素的值返回到计算平均值。但我使用的算法是O(2n)。是否可以确定与平均值最接近的元素,同时仍然计算平均值?
我认为不是。
#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;
}
答案 0 :(得分:0)
在数组中完全非负值的前提下,您可以使用代码的这种适应性:
#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;
}
它也可以适用于负值。
但是,就{em> O(2n)= O(n)而言,我同意Blindy。
答案 1 :(得分:-1)
如果对数组进行排序,则可以通过简单的O(logn)二进制搜索找到最接近目标的元素。如果它没有排序,那么它就是线性搜索。
作为旁注,O(2n)可能具有直观意义,但从数学上讲,它与O(n)没有区别。