ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 39701|回复: 63

[分享] 菜鸟的LOOKUP查找之二分法顿悟

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-12-21 09:54 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 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了!!(不是还有CD还没相到么???自以为是的相亲男死脑筋的认为人家婚介所给按年纪给升序了,后面的就不用相亲了!!!)

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号!!!

444号相亲男闪亮登场!!!4大于2,找6岁的C4小于6,又屁颠屁颠的跑回去找2。确定下次约会时间5号!!!婚介所纳闷不是有4岁的么,怎么找了个2岁的呢??相亲男想当然2岁前面的应该是1岁的吧,既然没有best。在bettergood中当然选择better。而且还要去找A,好麻烦噢。升序嘛!!!

5、当然可想而知5岁的相亲男2岁的B6岁的C之间也果断的选择了B,约会时间定于5号!!!一根筋的相亲男哪里会想到best5岁的D会在C的后面,升序嘛!!!5没道理在6后面!!!!

6、万众瞩目的6岁相亲男来了。在2岁和6岁之间必然选择相等的6C美女啦,约会时间3号。

77岁的相亲男呢?26之间必然选择6,相亲男看到6岁看到了希望,升序升序,那最后的肯定是最适合的最理想的最好的,于是和D美女直接确定了下次的约会时间8号!!

889岁。。。。。的相亲男都是如是选择,极品是成群结队出现的,极品的lookup_value的思路都是一样的。从中间开始找,比对大小!!!后面的总是比前面的大!!到底谁告诉你的啊啊啊啊啊!!!!!

当然如果78岁的的相亲男去相亲时D美女没有出现呢,只能返回去找6岁的CD美女没有出现的记录形式,相亲男记事本如实记录:
=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实现数组的变形







2011-12-21_095241.jpg

评分

7

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 10:00 | 显示全部楼层
本帖最后由 cee1011 于 2011-12-21 10:15 编辑

全部放于顶楼。。不分楼放了。

TA的精华主题

TA的得分主题

发表于 2011-12-21 10:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
恭喜修道成仙

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 10:03 | 显示全部楼层
本帖最后由 cee1011 于 2011-12-21 10:14 编辑

还是全部都弄在顶楼吧。。

TA的精华主题

TA的得分主题

发表于 2011-12-21 10:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-12-21 10:04 | 显示全部楼层
前面讲的都很好,二分法通俗准确。
后面一个地方不对:"当然第三个参数和第二个参数对应的个数也需是一样的",参见我的帖子:
http://club.excelhome.net/thread-770347-1-1.html

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 10:06 | 显示全部楼层
本帖最后由 cee1011 于 2011-12-21 10:14 编辑

谢谢楼上指正!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 10:19 | 显示全部楼层
hjj0451 发表于 2011-12-21 10:04
前面讲的都很好,二分法通俗准确。
后面一个地方不对:"当然第三个参数和第二个参数对应的个数也需是一样的 ...

如果是在数组的话,那是不是就得保持一致呢?

TA的精华主题

TA的得分主题

发表于 2011-12-21 10:24 | 显示全部楼层
cee1011 发表于 2011-12-21 09:19
如果是在数组的话,那是不是就得保持一致呢?

数组的话只有1、2参数,不存在这个问题。数组行列写法错误是数组本身的问题。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-21 10:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
hjj0451 发表于 2011-12-21 10:24
数组的话只有1、2参数,不存在这个问题。数组行列写法错误是数组本身的问题。

嗯。呵呵,
  1. #N/A=LOOKUP(8,{4,2,6,5,6},{6,5,3,8})
复制代码
两个参数的维数可以不同维,维数里面的元素个数,是不是如果第三个参数的个数要大于第二个参数?如果是第二个参数的话,有时候则会出现#N/A??
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-30 10:01 , Processed in 0.044357 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表