天天看点

关于算法竞赛入门经典3.4.2思考题题目1必要的存储量的思考

存储量的存在意义是什么

就是用来存储某一种信息或者问题求解时的某一种状态,以方便程序在需要回溯信息的时候加以利用。

题目1:必要的存储量

以下哪些可以不借助数组,那些必须借助数组?也就是一个关于求解数据和输入数据之间的独立性问题。

-1 统计个数、
-2求max,min,average、
-3 求哪两个数最接近、
-4 求第二大的值、
-5 求方差、
-6 统计不超过平均数的个数

我将这类题分为两类:

1.依赖于当前状态

2.依赖于(所有)输入数据

1.依赖当前状态

对于第1.2.4问,只需要在输入数据的时候读取一次数据信息,信息的传递是连续性的,不需要回溯已输入数据就可以实现相应功能。

比如统计功能,输入数据的同时进行统计,当输入下一个数据时,已经不需要再考虑前面的数据信息的影响了,因此不需要数组来额外存储数据信息。

2.依赖于(所有)已输入数据

以方差为例,方差的计算主要分为两步,第一步,通过读取输入数据获得平均值,第二步,通过方差公式求解方差,方差公式要用到已输入数据X和均值μ,即第二步依赖于第一步获取的平均值信息和输入数据信息。平均值可以在完第一步之后即时获得,然而在不利用数组存储的情况下,输入数据在输入下一个数据时就已经丢失了。

关于算法竞赛入门经典3.4.2思考题题目1必要的存储量的思考

关于其他几问

关于第3问,由于需要回溯之前输入的数据,以判断两个数的接近程度,因而需要数组的辅助,我之前看到一篇博客3.4.2 题目1 必要的存储量说不需要数组,其中代码只考虑到已经输入的前三个数据的状态,而忽视了一个问题,存在这样一种情况,如果第四个数据和第三个数据最接近,但是由于第三个数据和前面两个数据的接近值相比并不是最接近的而导致第三个数据的信息被舍弃了,这样反而无法得到正确答案:实际上最接近的是第三个第四个数据。用 4 8 13 14这个输入数据测试一下就知道了。

关于算法竞赛入门经典3.4.2思考题题目1必要的存储量的思考

像是求第二大的值,这类问题,最大值和第二大值的关系如何理解是关键,像之前那些需要数组存储的问题,一个关键点在于,它们的数据处理,我称之为所求数据的独立性,像是方差,它和输入数据的关系并不独立,多一个输入数据,方差又需要重新计算平均值,重新利用方差公式计算求解。而第二大值问题,很明显,第二大值是相对比较独立的,当数据输入后就不再依赖于之前已输入的数据了,对于新输入的数据,要么让它更大(等于新输入数据或者新输入数据比最大值大,也就是,空降一个二大王或者大王被降职当二大王了…),要么不变(喽啰不需要名字…),就这两种状态变化。最大值和二大值明显依赖于当前状态就可以获得,对于一个新输入的值,不需要拿他和已经输入的数据进行比较,只需要拿他和当前的最大值以及二大值比较即可,无须存储已输入的数据信息。

#include <stdio.h>
#include <limits.h>
int main()
{
    int n,max=INT_MIN,smax=INT_MIN;
    while(scanf("%d",&n)==1&&n){
        if(max<n){
            smax=max;
            max=n;
        }
        if(n>smax&&n<max)
            smax=n;
    }
    printf("Max:%d SecondM:%d\n",max,smax);
    return 0;
}
           

继续阅读