ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] excel 模糊查找二分法自我理解

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-16 11:36 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
二分法的概念
数学方面牛顿二分法
一般地,对于函数f(x),如果存在实数c,当x=c时,若f(c)=0,那么把x=c叫做函数f(x)的零点。
解方程即要求f(x)的所有零点。
假定f(x)在区间(x,y)上连续
先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
现在假设f(a)<0,f(b)>0,a<b
①如果f[(a+b)/2]=0,该点就是零点,
②如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2赋给a,从①开始继续使用中点函数值判断。
③如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2赋给b,从①开始继续使用中点函数值判断。
这样就可以不断接近零点。当区间小于一定值时,结束迭代过程。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
从以上可以看出,每次运算后,区间长度减少一半,是线性收敛。另外,二分法不能计算复根和重根。

先发上来个二分法的概念有助理解。(请勿插楼,谢谢)

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 11:37 | 显示全部楼层
                                               Excel中二分法的应用
明白了上面二分法的意思,那运用在excel中match、lookup……等的模糊查找就好理解了。但在excel中的应用又和数学方面有些不同。
一、EXCEL和数学方面二分法的不同
1、这第一点的不同是在excel中所有能模糊查找的函数的第二个参数找不到零点,所以用中间值代替。
中间值等于数组最中间那个值。
偶数数组的中间值=数据个数/2 的值=counta(数组)/2的值。
奇数数组的中间值=(数据个数+1)/2的值= counta(数组)/2+1/2的值。
2、这第二点的不同是excel中数组中包含文本值、逻辑值、错误值。这些在模糊查找时会被忽略。
3、如果不规定取数精度的话,数学方面的二分法是永远查找不到值的,只能无限循环下去,有些专家就在说二分法是错误的(这里就不做讨论),在excel里面就没有这方面的考虑。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 11:40 | 显示全部楼层
二、Excel中二分法的具体算法
(这里就不做流程图了)
Exce中的二分法也和数学牛顿二分法的查找方式一样(线性迭代),用excel的查找值(函数第一个参数)与目标值(中间值)进行比较,这里就涉及到4种情况。

情况1:查找值和中间目标值相等
这时会依次从中间值向右判断是否有连续和中间值相等的最后一个值。
例:

clip_image001.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 11:41 | 显示全部楼层
本帖最后由 xia125602 于 2014-8-16 11:51 编辑

情况2:查找值小于中间目标值
  这时会以数组第一个值与中间置为区域进行查找。也就是以中间置为边界向左查找。
:
=lookup(1,{1,2,1},{1,2,3})=1
①  第一次查找
中间值为2,查找值1<2,以2为边界向左查找
②  第二次查找
   就相当于=lookup(1,{1,2},{1,2}) 这时的中间值为1,等于查找值1.
③  第三次查找
   这时就和情况1相同了,依次向右判断时候存在连续的1,这题不存在,返回结果1
=lookup(,{1,2,1},{1,2,3})=#N/A
第一个参数省略,默认为0
①     第一次查找
中间值为2,查找值0<2,以2为边界向左查找
②     第二次查找
相当于=lookup(,{1,2},{1,2}),中间值1,查找值0<1,以1为边界向左查找,没数值,查找不到,出错。
情况3:查找值大于中间目标值
    这时会以数组中间置和数组最后一个值为区域进行查找。也就是以中间置为边界向右查找。和情况2相反。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 11:54 | 显示全部楼层
本帖最后由 xia125602 于 2014-8-16 11:59 编辑

情况4:存在文本值、逻辑值、真空、假空和错误值的情况(以下描述成非纯数值型)。
这里的区别是:查找的中间值如果为文本值、真空、假空、逻辑值和错误值,中间值自动向右变动,直到中间目标值为纯数字为止,这时以这个数字为中间值和查找值进行判断。
例:
  C1=LOOKUP(17,A1:A19,B1:B19)  F1、H1、J1、M1、P1公式同理。

如下图:文本值、真空、假空、逻辑值、错误值的结果一致,原理一致。
①        第一次查找
   中间值为第10行的值(依次为:a、 、””、ture、#DIV/0!),中间值不为纯数字,向右找取第一个纯数字为13,这时以13作为中间值。查找值17>13,属于情况3,以13为边界向右查找。
PS: I、J列单独剔出来讲

由于每小时限发5个帖子,所以暂请不要插楼,谢谢合作。
123.jpg

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 13:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 xia125602 于 2014-8-16 13:12 编辑

②  第二次查找
123.jpg
以上图作为区域进行第二次查找,中间值为16对应的a,不为纯数字,中间值向右变动找到纯数字18,以18作为中间值,查找值17<18,此时关键点注意。由于非纯数值型全部被忽略,所以相当于就剩下{13,18}了。所以最后结果返回13对应的值。关键点:在查找中间值的前,非纯数值型是已经被忽略的了(原因好像是excel所有函数是先处理参数,然后再处理参数之间的运算的,这是我的理解,不知道对不对),但数组的个数是没有被忽略的,所以中间值还是要从数组最中间那个值判断起的,而且中间值必须要是一个纯数字才能进行判断。IJ列的情况:
①  第1次查找
123.jpg
中间值为第10行的0,查找值17>0,以中间值0为边界向右查找
②   第2次查找
123.jpg
中间值为14对应的0,查找值17>0, 以中间值0为边界继续向右查找
③   第3次查找
123.jpg
中间值为16对应的0,查找值17>0, 以中间值0为边界继续向右查找
④  第4次查找
123.jpg
中间值为17对应的0,查找值17>0, 以中间值0为边界继续向右查找
⑤   第5次查找
123.jpg
中间值为18,查找值17<18, 以中间值18为边界继续向左查找这时只有{0,18},所以结果返回0所对应的17。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-16 13:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
最后一个问题。
我们常遇见的汉字字母数字混合取数字的问题:
例: 我爱你中国123    (要得到123)
一般公式为:=-lookup(,-right(a1,row($1:9)))
lookup的二个参数的结果为:{-3;-23;-123;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!;#VALUE!}
这时你会看到如果按照二分法解析的话,中间值是第5个,是个错误值,依次向右取一个纯数字,取不到。难道和情况4产生了矛盾。难道情况4解释不通??
我的理解是,这时候的LOOKUP查找不是二分法查找,而是顺序查找,所以能返回结果。
最后的最后,上传一个例子加深对情况4的理解,该例子不做解释(愿意了解的兄台自己了解下结果)。 clip_image002.jpg

点评

看此帖21楼解释。仍然为二分法查找:http://club.excelhome.net/thread-809629-3-1.html  发表于 2014-8-17 08:49

TA的精华主题

TA的得分主题

发表于 2014-8-16 13:39 | 显示全部楼层
清晰明朗,拨云见月,之前也有几位前辈做过分析,对吾等还是过于高深了,顺便补上前辈的流程图
chrisfang


liuchengsw

TA的精华主题

TA的得分主题

发表于 2014-8-16 13:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2014-8-16 14:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 jacky1998 于 2014-8-16 14:45 编辑
xia125602 发表于 2014-8-16 13:22
最后一个问题。
我们常遇见的汉字字母数字混合取数字的问题:
例: 我爱你中国123    (要得到123)

忽略错误值的函数不多。对于二元结构,LOOKUP是认定序列满足任何排序的。也就是说,如果查找值大于所有值,那么肯定会查到最后一个有效值(这样查找结果一般不满足最小的最大值)。只有在规则下查找不到任何有效值,结果才会出错,与被查找序列中的错误值无关(好比其它函数忽略逻辑值),LOOKUP函数的运行机制并不检测被查找序列的排序方式。
只有序列不满足升序,而查找值不大于所有序列有效值,查找结果会在二分查找到第一有效值邻近取值(这样查找结果一般不满足最小的最大值)。(查找结果一般不满足最小的最大值的前提是序列满足升序排序。至于错误值是否影响排序的有效性,大家可自测,换句话说,就是指全序列是否需要连续不中断升序排序)



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

本版积分规则

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

GMT+8, 2024-4-27 08:11 , Processed in 0.043211 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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