|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 cee1011 于 2012-7-5 08:49 编辑
有这个帖子的出现要感谢 版友岁月无恒。在昨天我还在为lookup这个函数纠结不已,为什么明明第二个参数有 lookup_value ,还是会返回#N/A呢??
即使之前看了几个二分法的帖子还是没有搞懂,关于onkey的二分法图,一头雾水,什么是posi!!(还特地去百度了下,文科出身的我完全掉进去了lookup二分法的迷雾中了,俺就决定放弃了)
在昨天,又在一次看到lookup为什么会查找出错误值呢?于是发了个消息给版友岁月无恒 ,麻烦他能不能给我点帮助。
感谢他的耐心,nice,使我理解了lookup。
我把我理解二分法的思路写下来,给像我一样看不到那么专业的二分法的菜鸟童鞋们,希望能对他们有点帮助。
其中如果有错误的地方麻烦请指正。
关于LOOKUP可以查看帮助。
下面列举了几点他的特性。
LOOKup特性:
1、LOOKUP用法,要求第二个参数必须按升序排列(所以他以为是第二个参数是已经排序好的结果!!!)
2、如果在第二个参数即(lookup_vector)中找到等于第一个参数lookup_value,则正常返回;
3、如果在第二个参数中找不到查找等于值lookup_value,则返回比它小的最大数值;
4、如果查找值lookup_value小于数组的最小值,则返回#N/A;
5、查找值的类型应与数组中数据的类型相匹配,对于不匹配的数据,LOOKUP会忽略
我将lookup中的lookup_value当作是一个(可以说是一群!!)宁可光棍也不接。受姐弟恋可以勉强接受比自己小的自以为是相亲男,他的目标是希望能找个和他同岁的相亲对象确定下一次的约会时间。但是他觉得从目标区域中的第一个开始相亲太麻烦了,决定相亲之前已将要求告诉婚介所,相亲的对象要按年纪从小到大的排列好。婚介所觉得麻烦,这个男的给你介绍美女还那么多要求,所以你的你的要求吧,俺们是不会按要求办事的,而相亲男会以为婚介所给排序好了,所以他就决定了!!!既然有那么多的已经按年纪从小到大都排序好的相亲对象,他就从中间的开始相亲吧(二分法)。=lookup(相亲男岁数,{相亲女岁数},{下次约会时间})。
以下是婚介公司给了四个美女为一组的相亲,连相亲看对眼后下一次的约会时间表也罗列出来了。=lookup(lookup_value,{4,2,6,5},{6,5,3,8})
4 2 6 5
6 5 3 8
1、第一号的lookup_value相亲男今年1岁!!他要和婚介所安排好的A B C D四个美女相亲(注意是每个相亲男都自以为是的觉得A<B<C<D),于是他安排好了策略为:=lookup(1,{4,2,6,5},{6,5,3,8}) 从int((1+4)/2) 从B开始见面吧,这个极品相亲男一见面就问人家,请问今年几岁,B曰今年2岁!!2岁!!相亲男想既然是升序升序升序(都说是升序了,你信不信反正我信了)!!!那A应该符合条件是1岁了吧,就火速的去找A,问贵庚,A答曰:4岁。相亲男那个晴天霹雳啊啊啊啊,就是不接受相亲对象比他大,没有找到1岁的美女,也没有比美女小的相亲对象了。那就没有下次的约会时间了,当然返回#N/A了!!(不是还有C和D还没相到么???自以为是的相亲男死脑筋的认为人家婚介所给按年纪给升序了,后面的就不用相亲了!!!)
2、第二号的lookup_value相亲男2岁!婚介所也给安排了四个,极品都是成群结队出现的,思路也是一样的!!!所以2号相亲男也从B开始见面,2等于2有木有!!!两人情投意合有木有!!!火速地确定了下次约会的时间5号!!!
3、第3号的相亲男3岁,找啊找啊找朋友,又从B开始问起,2当然小于3,死扣着升序不放的相亲男决定去相C号美女,C美女6岁!!当然相亲男当然觉得美女D的岁数肯定是比C大了,所以不必接着相了。虽然没有best,但是可以找better,于是相亲男回去找2岁的B美女,并确定了下次约会的时间也是5号!!!
4、4岁4号相亲男闪亮登场!!!4大于2,找6岁的C。4小于6,又屁颠屁颠的跑回去找2。确定下次约会时间5号!!!婚介所纳闷不是有4岁的么,怎么找了个2岁的呢??相亲男想当然2岁前面的应该是1岁的吧,既然没有best。在better和good中当然选择better。而且还要去找A,好麻烦噢。升序嘛!!!
5、当然可想而知5岁的相亲男在2岁的B及6岁的C之间也果断的选择了B,约会时间定于5号!!!一根筋的相亲男哪里会想到best的5岁的D会在C的后面,升序嘛!!!5没道理在6后面!!!!
6、万众瞩目的6岁相亲男来了。在2岁和6岁之间必然选择相等的6岁C美女啦,约会时间3号。
7、7岁的相亲男呢?2和6之间必然选择6,相亲男看到6岁看到了希望,升序升序,那最后的肯定是最适合的最理想的最好的,于是和D美女直接确定了下次的约会时间8号!!
8、8岁9岁。。。。。的相亲男都是如是选择,极品是成群结队出现的,极品的lookup_value的思路都是一样的。从中间开始找,比对大小!!!后面的总是比前面的大!!到底谁告诉你的啊啊啊啊啊!!!!!
当然如果7岁8岁的的相亲男去相亲时D美女没有出现呢,只能返回去找6岁的C。D美女没有出现的记录形式,相亲男记事本如实记录:
=LOOKUP(7,{4,2,6,#DIV/0!},{6,5,3,8}) 或者 =LOOKUP(7,{4,2,6,#N/A},{6,5,3,8})
————————————————————————————————————————————————————
感谢第22楼{:soso_e163:}正弋老兵{:soso_e163:}的指正:
不足的是,没有把问题讲清,讲透澈,因为LOOKUP 它碰到的事例比楼主所举的要多,但始终有4点:
1. 当2分位查找时,查到值小于查找值时,再2分位向后找.
2. 当2分位查找时,查到的值大于查找时,2分位向前查找.
3. 当2分位查找时,查到的值等于查找值时,再逐个向后查,一直到出现不相等时回止,并返回最后一个相等值.
4 .它会忽略数据中的错误值.(查找的方法与是否排序无关)
两个经典公式的出现就是依据上面的解释【LOOKUP(2,1/(条件),查找数组或区域) 或LOOKUP(1,0/(条件),查找数组或区域)】
{关于这两个公式的详细解析可以看gouweicao78的
http://club.excelhome.net/thread-509072-1-1.html
帖子里面也有关于二分法的详细讲解。}
婚介所针对相亲的情况,决定做个统计,但是一个一个的统计觉得太麻烦了,于是老板想了个法子,一次性搞定
打开excel,选择了10个横向的单元格,按了下shift+ctrl+enter
=LOOKUP({0,1,2,3,4,5,6,7,8,9,10},{4,2,6,5},{6,5,3,8})
想纵向排得话 =LOOKUP({1;2;3;4;5;6;7;8;9},{4,2,6,5},{6,5,3,8})
分为三排的话=LOOKUP({1,2,3;4,5,6;7,8,9},{4,2,6,5},{6,5,3,8})
一句话,你要排列都随便你,但是记得如果分为多列多行,每行每列的个数是一样的!!在向量用法中当然第三个参数和第二个参数对应的个数未必需是一样的【此处板油 hjj0451指正,详细参见帖子http://club.excelhome.net/thread-770347-1-1.html】
这就是lookup内存数组的应用。
gvntw 版主的帖子http://club.excelhome.net/dispbbs.asp?boardid=3&id=131309
以及胡版的 http://club.excelhome.net/thread-431489-3-1.html 22楼中讲到用lookup实现数组的变形
|
评分
-
7
查看全部评分
-
|