一篇文章教你读懂LOOKUP函数的原理
上一期Lookup非学不可的技巧案例 我们提到过LOOKUP函数的一些技巧用法,但是实际上很多人对于这个函数的原理,甚至是几个参数,都是很不理解的,俗话说得好,我们不仅要知其然,还要知其所以然。
相信目前很多使用LOOKUP函数的同学们都只是停留在套用公式这个阶段,还没达到“知其所以然”的程度,就自然没办法继续深入了解和创新使用LOOKUP函数了。那么在这一期,我们就来细致入微地去了解一下LOOKUP函数的各个参数及其工作的原理。
原理虽然复杂,但请相信我会讲解得清晰易懂的,勤于思考,你会恍然大悟。
Lookup的原理,简单一句话说,就是【用二分法查找】
什么是二分法呢?记得曾经的综艺节目“幸运52”中的价钱竞猜游戏,选手每次将所给的价钱区间一分为二,进行比较后再得出新的区间,再次一分为二,如此下去,使得所猜的数字逐步逼近计算机所给的数字。其实这种思想就是二分法的思想。
我们简单回忆一下,高中时说的二分法
图片来源于网络PPT做得这么丑可是要丢工作的(逃),〖划掉〗,高中数学提到二分法时是在学习确定函数零点所在区间的内容时,这种方式通过将区间的两个断电逐步逼近零点来得到零点近似值或者近似区间。
那么在Excel中的LOOKUP函数呢?其实也是用的二分法,我们来看看下面这个例子:
你或许会大吃一惊,LOOKUP函数是不是傻?D对应的明明只有7这一个值啊,为什么会查找到10?其实LOOKUP函数并不傻,只是我们没了解清楚LOOKUP函数的工作原理。前文已经说到过二分法,我们来换位思考一下,用二分法的思维来看待这个问题。
这里以B和D查询的结果为例进行讲解,首先看查找D。
A.
现在以第一人称的视角来描述LOOKUP函数。我是要在A2:B11区域内查找目标D,我只会用二分法,而且我默认上面的数据比下面的数据小(我就是这么倔,不服来打我呀)。
第一步,那么现在在区间[2, 11]之间取一个中间值,10个数字,第五个是二分位,2开始数5个,来数数【2,3,4,5,6】,那就是第六行了,第六行对应的是B,B比D小,所以我要查找的D肯定在第六行A6单元格的B下面。
第二步,于是区间[2, 11]被进一步分为[7, 11],(这里划重点,我一开始踩过的坑,以为是[6,11],经过多次创造例子实践验证发觉并不是。至于为什么后面再讲。)
数字9是二分位,第9行是C,诶,C还是比D小,所以D肯定还在第9行下面。
第三步,于是区间[7, 11]被进一步分为[10, 11],第10行的A,还是比D小,就只剩下第11行了,不管是不是我们需要的D,只剩下它了,于是就返回的是10。
原来如此,10是这么来的。下面来一张图看的更清晰。
那么解答上文第2点提到的问题,为什么我说应该是被分为[7, 11],而不是[6, 11]呢?
(没有兴趣的跳过这一段往下看分割线后对查找B的解析)
很简单,我们直接假设是[6, 11],总行数就是6,那么,如下图所示,
第二个二分位按照公式:
计算出来的二分点应该是等于3,从第6行开始数3行,也就是应该在第8行。第8行直接就是D,那么最终就应该返回第8行的值为7,而非结果展示的10。
所以,这里的第二个区间应该是[7, 11],也就是说,是从二分位后面的一行开始的区间,并不包含二分位本身。
讲解了D的查找之后,我们再来看看B的查找。
上图中二分法一开始就已经找到了B了,本来应该返回的是5才对,为什么最后返回的是6呢?
答案是:当二分法查找到的等于查找的值时,开始向下逐个查询,最后一个相邻且相等的值为查询结果。
(这段话划重点,记住了。)
那么回到案例中来,二分法查找到的第6行为B,等于查找值B,所以继续逐个往下查找,正好第7行也是B,但是第8行不是了,所以往下查找之后相邻且相等的,就是第7行了,于是,最终返回的就是第7行的结果是6了。
拓展下,假设这里第8行那里的D也改为B,结果会是什么?可以实际动手操作试试看。
答案会是第8行的结果7。
那么这里就对上面二分法的内容做个要点总结。
【1】二分位= INT((总行数+1)/ 2)
【2】二分法默认查找的数据是从小到大按顺序排列的。
【3】当二分法查找的值小于被查找值时,由于规则【2】会继续向下查找。
【4】当二分法查找的值大于被查找值时,由于规则【2】会向上查找。
【5】大部分二分法查找的值等于被查找值时,LOOKUP会逐个往下查找,与二分值相邻且相等的值,即为最终的结果。
另外呢,上一期我们讲过了LOOKUP的多条件查找,有人可能会问了,今天讲的这个二分法和那个多条件查找有什么关系?多条件查找又是个什么原理?
我们还是举例讲解:
要在上图左侧表中找出同时满足类别为B且列表为4,对应的值是多少。
标橙色的单元格为公式:
=LOOKUP(1,0/(($A$2:$A$9=E2)*($B$2:$B$9=F2)),$C$2:$C$9)
我们来逐一分解一下步骤:
第一步,括号内$A$2:$A$9=E2和$B$2:$B$9=F2,两个等式,很明显,分别代表两个条件,值得注意的是,一,范围在等号前面,值在等号后面。顺序不能乱;二,返回的结果分别是一串数组而不是单一的值。这里数组里的数据有两种,TRUE和FALSE
第二步,两个条件相乘,专业术语称为【逻辑与】,即两条件同时满足,返回的结果,由于两个条件每个返回的都是一串数组,那么相乘得到的结果,也是一串数组,而非单一的值。
这里的数组数据也是两种,0和1。
第三步,用零值,去除以第二步得到的结果,那么原本第二步是0值的,0作为分母无意义,返回错误值#DIV/0!,而仅有第二步结果为1的,正确算出结果得到零值。
前三步可以用一个图来解释:
那么为什么要有第三步用零值除的步骤呢?别急,看了后面两步你就明白了。
第四步,用一个流程图来解释:
第五步,接下来就是二分法原理了,在只有0和错误值组成的数组中,查找数字1,由于LOOKUP函数使用二分法,默认数据从小到大排序,二分值0比1小,就会一直往下查找,于是就找到了最后一个0值(LOOKUP函数忽略错误值,故二分法不会找到错误值),这条数据就是同时满足两个条件的、我们所需要的数据了。
回到我们第三步提出的疑问,用零值去除以第二步的结果,意义何在?
很简单,意义就在于将不符合条件的值从第二步的结果0,转变为错误值#DIV/0!,这样就可以避免LOOKUP函数查找时,在一堆0和1组成的数组中,用二分法查找1,这样是不准确的,
所以,用0去除,将第二步结果为0的转变为错误值,LOOKUP就可以直接将其PASS掉不考虑。
第六步,就是LOOKUP函数的第三个参数——返回的数据区域$C$2:$C$9,这一点相信大家都知道,不用多讲。
好了,以上就是本期内容,似乎,有那么些复杂,于是我特意把我的案例文件及相应的讲解留存百度云,需要的自取呀:
链接:LOOKUP函数详解案例文件
密码:6666
(特意把网盘链接密码设为6666方便大家,我是不是很为大家着想啊哈哈哈)
这么干货满满的文章,大家好好学习点个赞再走呗~
鞠躬~