ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: onkey

[分享] [函数用法讨论系列10] LOOKUP的查找策略!

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-4-9 21:46 | 显示全部楼层
本帖已被收录到知识树中,索引项:LOOKUP

我试着解释一下,lookup返回结果应该是正确的。

首先,查找中间第7个位置的值,比较,小于中间值,返回上半区查找,查找第3个值(44),仍然小于,再返回查找int((1+2)/2) (即第一位的值),仍然小于(11<21),由于查找值小于第一个值,而lookup认为数据是升序排列的,所以认为找不到,因此返回一个找不到的值(#N/A),所以结果是正确的。

你可以尝试着改变D3单元格的值,(大于11,11,小于11),就可以看到结果了。

TA的精华主题

TA的得分主题

发表于 2006-4-9 21:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

根据onkey的流程图对31楼的问题做个解释:不一定正确,仅供参考!

第一次的查找值是int((1+14)/2)=7位置对应的65,11小于65,确定下次的查找区域为位置1:6对应的数据。

第二次的查找值是int(1+(7-1))/2)=3位置对应的44,11小于44,确定下次的查找区域为位置1:2对应的数据。

第三次的查找值是int(1+(3-1))/2)=1位置对应的21,11小于21,21又处在第一位,所以公式返回错误值。

如果把位置1的21改为10,公式不再返回错误值。

我理解在任意一次查找时,如果查找值小于被确定位置上的值,系统自动计算下一次的查找区域,继续进行查找。如果遇到上述情况,即小于后,而该位置为第一个,前面没有数据,公式肯定会返回错误值。反之,如果查找值大于被确定位置上的值,而该位置是最后一位,公式也将返回错误值。

TA的精华主题

TA的得分主题

发表于 2006-4-9 21:54 | 显示全部楼层

======在 2006-4-9 21:48:53 您来信中写道:======
那么说来流程图有错误?
======================================
流程图不错,我是根据流程图来查找运算的。

关节点是:H1,D1,B1(这是你的数据中查找的顺序)

如果H1<11,关节点为:

H1,L1,N1(L1<11) 如果L1>11,即查找:

H1,L1,J1

TA的精华主题

TA的得分主题

发表于 2006-4-9 22:01 | 显示全部楼层
我在31楼又贴了图,有个地方标出来了,这个问题困惑了我2天!!! 按我的理解,流程图错了那个地方。新流程就是: left=1,right=14 →posi=7 →Aposi=65 Xleft →right=posi-1=6 →posi=int((1+6)/2)=3 →Aposi=44 Xleft →right=posi-1=2 →posi=int((1+2)/2)=1 →Aposi=21 Xleft(False) →posi=1?(True) →返回#N/A 这下子才是对的。 与我理解的二分法和hbhfgh4310兄、chenhuafu兄的解释吻合。 是不是这个过程就表示运算了3次或4次?(四海飘零作了次数的解释=LOG(14,2)=3.8次) 应该说是4次=CEILING(LOG(14,2),1)=4——如果向上取整的话。3个判断X与Aposi加1个返回!
[此贴子已经被作者于2006-4-9 22:18:38编辑过]

TA的精华主题

TA的得分主题

发表于 2006-4-9 22:33 | 显示全部楼层
一个是位置的比较,另一个是位置值的比较。这两者是不同的。

TA的精华主题

TA的得分主题

发表于 2006-4-9 22:37 | 显示全部楼层
以下是引用[I]chenhuafu[/I]在2006-4-9 22:33:58的发言:
一个是位置的比较,另一个是位置值的比较。这两者是不同的。
有点含糊:我理解的left、right、posi是位置,Aposi是位置值。 我附件中之所以用“位置”这一行是想更方便看出返回结果所在的区间或者说位置是否正确。 根据流程图,由初始的left、right值确定posi——这些都是位置(在数据行中的位置,其实与“位置”这个行根本没什么关系)。然后由posi位置的值Aposi与X比较,来确定下一步往何处走(左、右、下)。 如果Aposi=X,进入“下”的流程或循环流程,如果Aposi[此贴子已经被作者于2006-4-9 22:58:19编辑过]

TA的精华主题

TA的得分主题

发表于 2006-4-10 08:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

gouweicao兄的钻研精神真值得佩服!

onkey的流程图确实在这个地方错了。

过去我看这个流程图时,都是从下半区开始的。搞通了下半区,自然就想到上半区是一个原理,所以基本就没看上半区。刚才我看了一下,gouweicao78兄的测试是完全对的,错的是onkey。

错在左侧的判断框:"posi<left?" 。

对比一下右侧的判断框,我们就知道,应该把这个改为:"posi>left?"

因为很显然——任何时候posi都不会小于posi,这里显然是onkey的一个笔误。chenhuafu和hbhfgh4310的解释都没错,问题在于没有按流程图一步一步来解释gouweicao78碰见的问题。

流程图是用来一步一步走的,gouweicao78兄的做法是对的,而其他两位只是以“原则”来解释,这不符合流程图原本的用意。

再说明一点,我说查找次数=LOG(14,2)=3.8次,这是一个统计上的平均,不是每次都如此。这点从流程图也能看出来。

TA的精华主题

TA的得分主题

发表于 2006-4-10 08:35 | 显示全部楼层
我还是觉得流程图没有错,posi<left?这个没错,当posi的位置是第一位时,比较后肯定为“No”,因此,比较就往下,进行“posi=1?”,是,返回“#N/A”,因此,gouweicao78的查找仍然是按照流程图来进行比较。所以说,该流程图没有错。

TA的精华主题

TA的得分主题

发表于 2006-4-10 08:55 | 显示全部楼层

POSI=1时:

我的理解是,
POSI>LEFT?→NO→POSI=1?→

你的理解是:

POSI<LEFT?→NO→POSI=1?→

所以对于POSI=1,怎么都没问题。

而对于POSI=2或其他时,流程的流向就不同了!

TA的精华主题

TA的得分主题

发表于 2006-4-10 09:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

早上发现——倒不是posi<left错误了,而是其上下的Yes和No对调个位置的问题。或者说:把posi<left改为posi>=left才是正确的。我已经基本把这个流程图的收敛模型做出来了。过一会儿修改完毕再发上来。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 15:27 , Processed in 0.031443 second(s), 5 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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