通常情况下,我们计算平均数的方法是:
1、先求sum;
2、然后求average;
前一段时间发现一种计算平均数的方法:
直接求平均。
公式:average = (arr_[i] + average*i)/(i+1); //i是数组arr_的下标
意思很明确:将n个数的平均:sum/n 转化成 (第n个值 + 前n-1个数的平均数*(n-1) ) / n
这样做的好处是跳过了求平均,直接求平均。这样代码更简洁。
下面比较这两种方法的性能,直接上代码(这里用了qt库):
#include <QCoreApplication>
#include <iostream>
#include <QTime>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int arr_[10000];
for (int i_ = 0;i_ < 10000;++i_)
arr_[i_] = i_ + 1;
std::cout<<"方法一:"<<std::endl;
QTime t1_ = QTime::currentTime();
t1_.start();
for(int time_ = 0;time_ < 10000;++time_)
{
int sum_(0);
for(int i_ = 0;i_ < 10000;++i_)
sum_ += arr_[i_];
double average_ = sum_ / 10000.0;
}
std::cout<<t1_.elapsed()<<std::endl;
std::cout<<"方法二:"<<std::endl;
t1_.restart();
for(int time_ = 0;time_ < 10000;++time_)
{
double average_(0.0);
for (int i_ = 0;i_ < 10000;++i_)
average_ = (arr_[i_] + average_ * i_) / (i_ + 1);
}
std::cout<<t1_.elapsed()<<std::endl;
return a.exec();
}
结果如图:
这里很明显,第一种方法的效率高。
为什么第一种方法效率高?
仔细观察我们发现:
第一种方法只在最后一次求了平均;
第二种方法在遍历每个值的时候都求了一次平均。
所以,第一中方法效率高,第二种效率低。
使用场景:
1、仅仅求n个数的平均,我们肯定选第一种方法。
2、假设要显示如下这个表:
序号 | 值 | 平均 |
1 | 1 | =1/1 |
2 | 2 | =(2+1)/2 |
3 | 3 | =(3+2+1)/3 |
4 | 4 | =(4+3+2+1)/4 |
5 | 5 | =(5+4+3+2+1)/5 |
6 | 6 | =(6+5+4+3+2+1)/6 |
7 | 7 | =(7+6+5+4+3+2+1)/7 |
8 | 8 | =(8+7+6+5+4+3+2+1)/8 |
... | ... | ... |
那么使用第二种方法更适合。