今天介绍的是Lookup函数,不明白其中原理的新人们,总是对这个函数望而生畏,在我们心中给Lookup的定义要么是"睁眼瞎",要么是"一根筋"。出现这样的原因是我们不了解 二分法的原理所造成的。我们今天就来谈谈LookUp中的二分法。
二分法在具体应用中有两个步骤:
二分法之步骤1:确定查找方向
判断查找方向,具体来说确定LookUp查找方向有这么两个步骤:
1): 确定数据区域中间值
已知城市条件列,那么我们就可以得出A2:A9数据区域的中间列为:第四行:A5(计算公式:int((区域总行数+1)/2)。
那么A5这个单元格值为杭州2。
小结:所谓中点值就是区域行数除以2,再取整。所对应的单元格。
2):确定查询方向
查询方向有且只有两个:1、向下,2、向上
> 向下查询:已知条件值大于等于区域中分点单元格值
因为已知条件A12的值是杭州7,比中间点的值要大,那么就会向下查询。那么很明显根据 杭州7 我们是查不到正确内容的,也就是会出现我们常见的"睁眼瞎"现象。
小结:我的条件值比区域的中点值要大,我就向下查询。
> 向下查询: 已知条件等于区域中点值,还是向下
如果是VlookUp函数,基本上就是返回西湖区了,然而神奇的LookUp却是返回下沙。所以这个可以很好的说明在这个案例中,哪怕是相等的值(条件值和中分点的值相等)lookup函数还向下查询。
注意点:这个时候向下的原则是相邻的并且是同值的单元格对应的值。
相邻单元格不相等,就不在向下查找,这个时候是查不到下沙的,因为不相邻,函数直接不管了。
如果A4单元格也是杭州2,对于此次查询毫无影响,因为查询方向是向下的。
> 向上查询:条件值比中点单元格值小
有且只有这一种情况会导致查询方向向上。
小结:条件值比中分点小,方向就是向上。
注意点:方向向上的查询有可能会出现"#N/A"的情况。
3):找合适的值
二分法只会找小于或者等于条件值对应的区域值。
能看出此处为什么找到的是萧山吗?
能看出为什么这里是#N/A吗?
一个说明:二分法会在每个子区域中,多次运用。
A3就作为剩下区域中的中分点,然而它对应的值杭州1也比我们的条件值杭州0要大,那么函数就会在剩下的区域中再次运用二分法,进行查找,如果到最后一条还是不符合条件值,那么就只有null。
向下查找也类似。
总结:二分法是lookup函数的执行原理,看待问题的时候,我们分为三步走的方法:
- 找到区域中分点
- 根据条件值和中分点判断查找方向
- 多次利用二分法进行数据区域缩小迫近
- 二分法只找目标区域值小于等于已知条件值的数据
有了这些原理只是在心中,我们就可以清楚知道,为什么有的时候LookUp函数会查找到一些不靠谱的东西。
一个简单的练习题:下图中B12单元格会是什么结果?