两种平均算法的比较

通常情况下,我们计算平均数的方法是:

        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
... ... ...

那么使用第二种方法更适合。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值