《无望的回归》 至今这个“忽略”异型数据的说法让“二分法”的推论难以完美。从上面两楼的摸索中,都没有得到正确的解答。 1、在数据库结构理论方面称为“二叉树”查找,其理论基础是“数据必须是有序的,对于存在重复的元素,它们必然是相邻的”。 对一个不是无序的数据进行二叉查找是没有意义的,对不同类型值进行大小比较也是无意义的,至少在算法上是如此。(比如说文字“我”大于数字10000,仅仅是作为Excel基础操作的“排序”用,在比较大小根本就没有意义,这个在思维逻辑上是众所周知的) 3、虽然,8楼、47楼的流程图及验证都已清楚地展示了Lookup在单纯类型数据中“乱序”查找所采用的“二分法”的推论,但,这仅仅是推论,是一个大多数人跟着认为比较可靠的想法,微软没有任何官方向我们透露这一点,也没有人获知Lookup的源代码来证实这一点。 4、即便,我们已经论证了第2参数不包含异型数据,Lookup准确的执行了二分法,得到了“二分法”的一个准确的答案,称之为查找结果,这个结果不是查找值(第1参数)对应的位置,称之为意愿结果。这是许多函数初学者常常问的为何Lookup找错的问题,也是他们会更容易接受VLookup的原因。 《微软的微笑》 翻开微软给我们的——Lookup函数帮助。 要点 Lookup_vector 的数值必须按升序排序……否则,……不能返回正确的结果。 说明 如果函数 LOOKUP 找不到 lookup_value,则查找 lookup_vector 中小于或等于 lookup_value 的最大数值。 如果 lookup_value 小于 lookup_vector 中的最小值,函数 LOOKUP 返回错误值 #N/A。 想必,这段话大家都已经在探索的过程中读过了N遍。我再带大家读一遍。
1、结合“对不同类型数据进行比较也是无意义的”,从这一点上来说LOOKUP真的是“忽略”与第1参数相异类型的值,不忽略的话也没什么意义,所以,第1参数为文本,则只要第2参数内的文本升序排列即可返回正确的意愿结果,数值乱序无碍;第1参数为数值,则只要第2参数内的数值升序排列即可返回正确的意愿结果,文本乱序无碍。——“帮助文件给你排序标准只是把它们写在一起而已,你们自己猜的”微软微笑不语。 2、说明(1)返回小于等于第1参数的最大数值结合要点的排序标准:数值升序,那么如果第1参数比第2参数都大(注意,这里的“比”已经不比较无意义的异型值了),则第2参数能够的上最大的也就是在最后位置了,这已经可以解释LOOKUP(9E+307,A:A)返回A列最后一个数值以及LOOKUP(1,0/(条件),查找区域)返回最后一条满足条件的记录。因为按默认升序原则,最大的肯定在最后面(尽管最后一个数值往往不是A列最大值,但Lookup就认这个死理儿),是否二分法,是怎样的二分法,微软微笑不语。 沸沸扬扬,熙熙攘攘。 Onkey念动了Lookup神秘的咒语,纷涌而至的的人们,在不经意间把我挤到这瓶尘封已久的茅台,瓶子碎了,酒香飘了,人醉了……(Music) 醒来,耳畔响起刀郎沧桑的《德令哈一夜》,似乎印证了我此时的感受“始终无法清晰的记起昨夜谁入梦(ps:被弄迷糊了),毕竟心里也不敢轻易去碰刚愈合的痛(ps:好不容易才论证了二分法,却要论证另一面),你再忍一忍,你再等一等(ps:……)” 难道就此放弃?还是……秉承Lookup这个认死理儿的脾气,终将继续探索到底
[此贴子已经被作者于2007-5-14 19:15:06编辑过] |