你再也不会怕二分法了!

每个初学者在第一次接触到诸如VLOOKUP函数、LOOKUP函数等的时候,就像丑媳妇总要见公婆一样,不可避免地会接触到“近似匹配”的概念,进而又接触“二分法”的概念,shit,该来的还是来了,本来想这辈子再也不要想二分法,可大多数朋友有时候为了想更加理解此类函数的用法,在钻研的过程中还是碰到了这个貌似很神秘的魔鬼。

另外,根据前天的回访调查结果,68%的朋友说需要了解一下近似匹配的原理,那么今天就来讲解一下。如果你还有兴趣,请往下读,对于VLOOKUP函数来说,就是当其第四个参数为1或者TRUE或者完全省略的情况位金丝匹配,而LOOKUP函数则完全是使用近似匹配。接下来我们一起解开其神秘的面罩:

一、什么是近似匹配?

近似匹配,顾名思义就是非精确的意思嘛,如下图,利用VLOOKUP函数写了一个简单的公式,其中第一个参数“3”是查找值,而这个3确确实实存在于第二个参数查找范围的第一列中,也就是查你有你,指哪打哪,这叫做精确查找。

而如果我写这个公式,如下图,注意第四个参数噢~由于第一个参数“9”是查找值,但这个9不存在于第二个查找范围的第一列中,也就是查无此人,这就叫做模糊查找。他大舅他二舅都是他舅,虽然是近似匹配,怎么来说它终究是一种匹配呀,那么也会返回一个结果。很明显这个公式返回的结果是“我是7”。明明是9,为什么返回的结果是7呢?就是因为此处是近似匹配,匹配结果的规则很多学者都说过了,大家也看了,在此我再说一下:近似匹配是利用二分法返回比查找值小并且最接近查找值对应的结果。所以函数返回了7对应的结果,因为7比9小且最接近9,有的朋友就说了,这so easy啊,以后遇到这样的问题,直接在这一列中找到比查找值小的不就搞定了,其实可不是这样的,你只是运气好,好好观察一下你的第一列数据,它们可是升序排列的噢。好了,“二分法”这个该死的幽灵就这样悄悄地与你我相遇,它来了,接着往下看。

二、二分法原理

在这里贴上一个最经典的总结,别怕,很好理解,接下来我会用例子讲解一下:

1、将待查值与目标向量中的中位值进行对比,中位值是指目标向量中位置居中的数据。数据个数为偶数时,中位=个数/2;数据个数为奇数时,中位=(数据个数+1)/2。

2、待查值大于中位值时,以中位作为边界,继续在其右侧取新的中位值继续对比。

3、待查值小于中位值时,以中位作为边界,继续在其左侧取新的中位值继续对比

4、待查值等于中位值时,依次判断其右侧数值是否继续相等,直到不相等时返回最后一个相等的数值。

5、当中位位置与边界重叠时,终止对比,此时如果待查值大于中位值,则返回中位值;如果待查值小于中位值,则返回中位左侧数值。如果左侧数值不存在,返回#N/A。

6、当目标向量中包含错误值时,忽略错误值,在其右侧继续对比。

首先看看这个公式,明明查找值是57呀,哈哈,谁让这里是“近似匹配”呢,这是“二分法”捣得鬼啦,来解析一下:

(1)、参考原理第一步,这里的作为对比的数据个数为19个,那么中位就是(19+1)/2=10,也就是第10个数,故中位值就是第10位所处的数,我们看看是49,此时作出判断49<57,然后参考原理第二步,待查值57大于中位值时,以中位作为边界,继续在其右侧取新的中位值继续对比。至此留下来的有资格参与下次对比的数据就如下图了:

(2)、第二轮的原理和第一轮原理一样,此时剩余9个数了,那么中位就是(9+1)/2=5,也就是第5个数,故中位值就是第5位所处的数,我们看看是45,此时作出判断45<57,然后参考原理第二步,待查值57大于中位值时,以中位作为边界,继续在其右侧取新的中位值继续对比。至此留下来的有资格参与下次对比的数据就如下图了:

(3)、第三轮的原理和第一、二轮原理一样,此时剩余4个数了,那么中位就是4/2=2,也就是第2个数,故中位值就是第2位所处的数,我们看看是72,此时作出判断72>57,然后参考原理第三步,待查值57小于中位值时,以中位作为边界,继续在其左侧取新的中位值继续对比。至此留下来的有资格参与下次对比的数据就如下图了:

(4)、第四轮的原理和第一、二、三轮原理一样,此时剩余1个数了,那么中位就是(1+1)/2=1,也就是第1个数,故中位值就是第1位所处的数,我们看看是41,此时作出判断41<57,然后参考原理第五条,此时中位位置与对比数据的边界重叠了,故要终止对比,此时如果待查值大于中位值,则返回中位值,所以返回了中位值41,然后这个公式的结果就是“我是41”而不是“我是57”。

三、有必要花这么大功夫记住“二分法”的原理嘛???

其实总体来说我觉得记住这个原理并不困难,但是身边的很多朋友还是说记不住,其实细细分析一下,如果你实在记不住也是没关系的,只要你会用,这里需要你事先把vlookup函数的第二个参数的单元格区域的第一列升序排列一下,这样你就不需要记住原理而直接可以肉眼得出结果了,它会返回比查找值小但最接近于查找值的数据所对应的结果,不信的话你可以自己利用上面的原理亲测一下,这下你明白了为什么人们常说的要升序排列了吧。此时就可以很好地解释上面第一板块中的近似匹配问题了,用“近似匹配”模式来查找9,由于A列的数据是升序排列的,那么你可以直接脱口而出得到结果7,此处请细细思考原因。

(0)

相关推荐