zoukankan      html  css  js  c++  java
  • 输入'过程'求方差算法的简单优化(免去数组的使用)

    《算法竞赛入门经典》(第2版) 第三章思考题


     

    题目1(必要的存储量)

    数组可以用来保存很多数据,但在一些情况下,并不需要把数据保存下来。下面哪些题目可以不借助数组,哪些必须借助数组?请编程实现。假设输入只能读一遍。 
    1. 输入一些数,统计个数。 
    2. 输入一些数,求最大值、最小值和平均数。 
    3. 输入一些数,哪两个数最接近。 
    4. 输入一些数,求第二大的值。 
    5. 输入一些数,求它们的方差。 
    6. 输入一些数,统计不超过平均数的个数。

    这里1~4、6题可以参见这篇博文传 送 门

    这里就5题的算法思想进行分析,并做简单的优化处理。。。。

    引用传 送 门的代码(数组):

    void variance()     //第五题
    {
        int nums[100];
        int ct = 0, n, i;
        double ave = 0.0, sum = 0.0, psum = 0.0;
        while(1 == scanf("%d", &n))
        {
            nums[ct++] = n;
            sum += n;
        }
        ave = sum / ct;
        for(i = 0; i < ct; ++i)
            psum += (nums[i] - ave) * (nums[i] - ave);
        printf("variance: %.3f
    ", psum / ct);
    }

    分析:

      由于要求的是输入一组数据的平方差,第一印象感觉就会想到用数组,但是我们把平方差公式写出进行分解来就会发现,并非非要用数组不可。

    方差公式:

        

    分解步骤:

           S2 = .........这里编辑数学公式太麻烦了。。。。。

    分解图:

    代码实现(非数组):

    double inVariance()
    {
        double x;
        double s1 = 0;
        double s2 = 0;
        double s3 = 0;
        double avg = 0;
        int n = 0;
        while(cin >> x)
        {
            n++;
            s2 += x;
            s1 += x*x;
        }
        avg = s2/n;
        s2 = 2*avg*s2;
        s3 = n*avg*avg;
        return (s1 - s2 + s3)/n;
    }
  • 相关阅读:
    String和StringBuffer相关
    ReactNative 2018了解一下
    发送验证码倒计时效果
    图片实际尺寸大小
    ES6(一)
    组件开发之选项卡-2
    (function(){代码})()自执行函数
    Vue组件学习之三
    Vue下拉菜单实例demo
    窗口大小左右拖动demo
  • 原文地址:https://www.cnblogs.com/sunrisepeak/p/9758100.html
Copyright © 2011-2022 走看看