大多數人在第一次接觸到精确匹配和大緻匹配(模糊匹配)的時候,通常都是學習使用vlookup函數的時候,在老師講解第四個參數的時候會提出這個概念:
但是并沒有詳細的解釋什麼是精确匹配,什麼是大緻匹配。
可能會提到大緻匹配是二分法之類的概念,然後就沒有下文了,于是我們就一直懵懵懂懂的用着精确匹配,偶爾用一下大緻匹配也是生搬硬套。
小編也是用了若幹年之後才明白這其中的奧秘,今天就和大家聊聊什麼是精确匹配,什麼又是大緻匹配。
匹配與大緻匹配
上圖就是一個标準的vlookup用法,使用的是精确匹配,很好理解,工号完全一緻的前提下,得到對應的姓名。
再來複習一下vlookup的用法:
=vlookup(查找值,數據區域,要找的内容在第幾列,精确匹配)
查找值(工号)在數據區域(A列)完全一樣的時候,會得到需要的結果(姓名)。
如果工号有一點不同,就會得到錯誤值:
不小心将NE293輸入為NE292,因為數據區域沒有這個工号,姓名就會顯示為錯誤值。
可能有朋友就想了,NE293和NE292看起來差不多,那麼用大緻匹配是不是能找到呢?
我們可以來試試:
将第四參數改為1,變成大緻匹配。
(注意,有些版本的Excel在vlookup函數的說明中有誤,實際上0或者false對應精确匹配,1或者是true對應大緻匹配。)
公式變成大緻匹配以後,隻有第一個工号的姓名是正确的,原本沒有對應工号的(NED182)也有姓名了,但是并不是NED183對應的姓名,不知道從哪裡找了個名字填進來了,糟糕的是原本有對應工号的姓名全部得到了錯誤的姓名。
至此,我們徹底不理解大緻匹配了……
要想了解大緻匹配究竟是什麼意思,還要從數據匹配的兩種計算原理說起,那就是曆遍法與二分法。
曆遍法原理與精确匹配
曆遍法大緻上是這個意思:
第一個要找的工号NED034,要找的範圍是A列,vlookup就從A1開始找,隻找了兩個單元格就發現目标,于是返回需要的姓名。
找到以後開始找第二個工号NED293,過程如圖:
還是從A1開始來一遍,找了6個單元格發現目标,返回需要的姓名。
繼續找第三個工号NED266,這次就找了12個單元格才發現目标,然後繼續找第四個工号……………………
是不是覺得vlookup挺辛苦的!
這種查找方法就是曆遍法,說通俗點就是挨個過一遍,找到目标就停止,找不到就一直找。
這也是為什麼在用vlookup的時候,不建議選擇整列的原因,如果有一個數據是沒有的,例如剛才的NED292,如果選擇整列,也就是1048576這麼多行,就要挨個找一遍才能确定沒有,得到一個錯誤值,如果數據裡有兩個是不存在的,就得再來一次1048576這麼多行,vlookup就是這樣累死的……
精确查找使用的就是曆遍法原理,這種方法的優勢是沒有什麼限制,缺陷也很明顯,在某些時候運算速度會比較慢。
為了解決運算速度的問題,就有了二分法原理和所謂的大緻匹配。
二分法原理與大緻匹配
二分法可不像曆遍法這麼好理解,網絡上也有各種版本的介紹,不過對于新手來說都顯得過于專業,沒辦法,這個概念真的很抽象。
小編通過以下簡單的測試,讓大家對二分法原理有個比較直觀的了解,有興趣的朋友可以自己跟着操作試試。
注意公式中的第四參數是1,也就是大緻匹配,大緻匹配使用的二分法原理。
什麼是二分法?
不同于曆遍法,二分法不是從開頭找起,而是從中間位置的數據找起。
比如這裡有三個數,2、4、6,要找的内容是2,如果使用精确查找也就是曆遍法,第一次就能找到。但是用二分法的時候,是先從中間的位置也就是4找起,如果不是要找的内容,就要比較,當要找的數據小于中間位置的數據時,向上找,反之則向下找。
此處2小于4,所以向上找,就發現了目标,因此得到了正确結果。
這樣解釋了以後,是不是感覺二分法也不是那麼難的?
是不是難咱們接下來再看:
這次要找的數據變成5,結果是4,怎麼解釋?
如果是曆遍法查找的話,找三次,找不到,結果返回錯誤值。
但是二分法不這樣,依然和中間位置的4比較,5大于4,向下找,下邊的是6,5小于6,隻能得到6上面的數據就是4。
可能有朋友會問,為什麼和6比較以後不繼續比了,這就是二分法的特性,因為一共三個數字,第一次比較就排除一半,隻剩一個數字了(就是6),第二次比較之後沒得比了,隻能得到4。
如果還有些迷糊的話,再看一個例子:
這次要找的數據變成7,還是和前面一樣,先與4比,7大于4,向下繼續和6比,此時有三種結果,如果相等,結果為6;
如果要找的内容小于6,得到6上面的數據(剛才找5就是這個情況);
如果要找的内容大于6,結果還是6,因為下面沒有數據了,隻能得到6,本例就是這個情況。
經過多次測試,我們還可以發現一個現象,要找的值隻要比6大,始終得到的都是6。
(這個結論很重要,以後學習lookup經典套路的時候就會用到了)
那麼是不是說二分法就一定可以得到一個結果,而不會得到錯誤值呢?
肯定不是這樣的,比如這種情況:
要找1,為什麼得到錯誤值?
我們已經明白了二分法的基本模式,可以試試來分析:第一次和4比較,1小于4,向上找,1還小于2,繼續向上,但是向上就沒有單元格了,注意不是沒有數據而是沒有單元格,剛才向下的時候,6下面也是沒有數據,但是還是有單元格的,也即是說,有單元格代表在一個合理的位置,沒有單元格說明連位置都不存在,肯定是錯誤值了。
再深一步想,隻要找的值小于2,肯定都是錯誤值,咱們不妨來試試:
結果正如我們所料。
此時其實一個更加重要的結論呼之欲出了,那就是說,隻要找的值在2和4之間,肯定得到2,在4和6之間,肯定得到4,大于6的肯定得到6,這就是vlookup區間查找的原理啊,朋友們!
什麼,你還不知道vlookup的區間查找是什麼意思,來看這樣一個實例:
根據銷售額找到對應的提成比例,這裡就用的是vlookup大緻匹配,仔細看一下,隻有三個參數,省略了第四個參數(連同逗号一起省略)代表大緻匹配,如果保留逗号隻是省略參數代表精确匹配。
好了,大緻匹配和二分法你覺得是不是明白了一些。
其實這才是二分法的一部分,更重要的内容是,【二分法默認數據為升序排列】!
尾聲!
什麼叫默認數據為升序排列,還是通過例子來理解吧。
剛才我們講解二分法使用的數據源就是升序排列,如果順序是亂的,那麼一切都變了!
找6,沒有得到6卻得到了4,何解?
第一次6和2比較,這一點沒有疑問吧,6大于2,向下找,繼續和4比較,6還大于4,隻能得到4了,下面沒有數據了。
找1得到錯誤值,還是一樣的道理,先和2比較,向上,繼續和6比較,沒有位置了(不是沒有數據哦),隻能得到錯誤值。
可見,二分法不會起考慮數據源實際上的排列順序,始終遵循找到中間位置,比較大小,大了向下找,小了向上找的原則去尋找目标。
其實到這裡,二分法基本上說清楚了,再來最後一個例子:
在這樣的7個數裡找5,結果是幾?
二分法說:先和8比,5小于8,向上找,上邊有三個數據,和中間的2比較,5大于2,再向下找,隻有一個數字4因此結果應該是4。
從查找次數的角度,二分法隻找兩次就完成任務,因為二分法不是以内容為查找對象,而是通過不斷地二分數據源,每次排除一半數據,到最後一次二分時完成任務,本例中一共7個數,2的3次方是8,也就是說,當數據量達到8個的時候,才會找三次,同理,當數據量達到16個的時候,才會找四次,以此類推。
這裡說的次數是理論上的最大次數,如果很湊巧,一次就找到了,那麼當然結束工作,例如:
要找的數據正好就在中間,一次就完成。
二分法的原理講到這裡就接近尾聲了,我們明白了為什麼二分法查找速度快,也明白了為什麼有時候明明有數據卻得不到正确的結果。
對于原理這樣理論性很強的知識點,通過自己動手模拟的效果應該算是不錯的,那麼留給大家一個作業吧,可能有些朋友注意到了,我們舉的例子中,數據源都是單數,要麼3個,要麼7個,這樣的數據源中間位置是很好找的,如果數據源是4個或者是6個,中間位置該如何确定呢?
給你個方法自己去測試吧,比如有6個數據,那麼中間位置隻能有兩種可能,3或者4,具體是哪個,自己去試試就明白了……
最後一個問題,全文都是用數字比較大小的,如果是字母或者文字,或者不是一個字的那種情況怎麼比較大小?
回複:請注意,用數字做解釋是為了讓我們更容易理解,實際上對于Excel來說,對于各種内容的大小是有自己的原則的,再通俗點說,一列數據排序後的結果,就是大小的判定規則,我們隻需要理解原理就行了,并不需要每次都自己去判定大小關系。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!