《算法竞赛入门经典2》3.4.2 思考题

打√的是可以不借用数组,打×的是必须借用数组

有争议的应该就是第五个,求方差,我在网上搜了几个说的都是必须借用数组,如

以方差为例,方差的计算主要分为两步,第一步,通过读取输入数据获得平均值,第二步,通过方差公式求解方差,方差公式要用到已输入数据X和均值μ,即第二步依赖于第一步获取的平均值信息和输入数据信息。平均值可以在完第一步之后即时获得,然而在不利用数组存储的情况下,输入数据在输入下一个数据时就已经丢失了。
————————————————
版权声明:本文为CSDN博主「YeeM1ng」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_31509305/article/details/88778370

可以将方差公式推导一下:

\large \sigma ^{2}=\frac{\sum (a_{i}-\mu )^2}{n} \\ =\frac{n\sum (a_{i}-\mu )^2}{n^2}\\=\frac{n\sum (a_{i}^2-2a_i\mu+\mu ^2)}{n^2}\\=\frac{n\sum a_i^2-n\sum 2a_i\mu+n\sum\mu^2}{n^2}\\=\frac{n\sum a_i^2-2n\mu\sum a_i+n^2\mu^2}{n^2}

\large n\mu=n\frac{\sum a_i}{n}=\sum a_i

带入得

\large \sigma ^{2}=\frac{n\sum a_i^2-2\sum a_i\sum a_i+(\sum a_i)^2}{n^2}\\=\frac{n \sum a_i^2-(\sum a_i)^2}{n^2}

可见最后结果需要 \large n、 \large \sum a_i^2 、 \large \sum a_i 三个量,完全可以不借助数组且只读一遍


C++

#include <cstdio>

int n, s1, s2, a; 
// s1为 \sum a_i
// s2为 \sum a_i^2
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a);
		s1 += a, s2 += a * a;
	}
	float rus = (float)(n * s2 - s1 * s1) / (n * n); 
	printf("%.2f", rus);
	return 0;
}

Python

s1, s2 = 0, 0
n = int(input())
for i in range(n):
    a = int(input())
    s1 += a
    s2 += a ** 2
print((n * s2 - s1 * s1) / (n * n))

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值