以下是引用guangyp在2006-12-12 23:54:55的发言:有说得不对的地方先请gdliyy版主见凉。 我也认为FREQUENCY是一个统计函数,但偶认为gdliyy版主对FREQUENCY的第2个参数的处理方式理解有误。 请先看一下面这个公式,结果得到的是什么?=FREQUENCY({265;300;100;260},{250;300;200;150}) ,请先把答案写在一个单元格中,再试验公式结果, 看看你的答案对了吗? 对FREQUENCY的第1、2参数的处理方式,我的理解是这样的:计算到第2参数中的某个数据时,在第2参数中找到比这个数小一级的数,然后对第1参数统计,把结果存入结果数组的相应位置,再把第1参数已统计过的数据打上标记,即下次不再参与新的统计。 例如上面的公式结果是 {0;3;0;1;0} ,它的运算过程是: 后话:然而计算机是怎么在第2参数中找到比当前数据小一级的数,是否对第2参数先排序再找呢?这个我就不清楚了。 您的分析和我说的并不矛盾,只是我的说法省略了部分潜台词--我指的是逻辑上的排序,而并非物理上的排序:) 1、其实,{250;300;200;150},而Excel直接用4个分界点将坐标轴分为了5个区间:-∞;150;200;250;300;+∞, (-∞,150]、(150,200]、(200,250]、(250,300]、(300,+∞] 这也是为何Frequency函数在统计时,N个分界点得出的结果为N+1个值的原因。 2、有了这5个区间,再进行分段统计就容易理解了,这也是为何onkey朋友所提到的查找原理,系统会按以上的区间进行索引,按区间统计个数,最后将结果按(-∞,150]、(150,200]、(200,250]、(250,300]闭区间的值对应第2个参数的分段值{250;300;200;150}写入内存数组,而最后的一个多出的区间(300,+∞]统计的结果当然就无条件地追加在内存数组中。 3、我觉得,Frequency函数之所以运算速度比COUNTIF快,是否是系统增加了索引功能,所以速度得到加倍的提升。这个可能只有Excel的开发人员才知道了,呵呵。。。
|