ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-5-16 17:50 | 显示全部楼层
本帖已被收录到知识树中,索引项:LOOKUP

   KnifeFox版主说的不错,较圆满。

   哪怕跟EXCEL开发人员的思路不同(也无从知道),只要对过程及结果都能给出合理的解释就是大功告成了,对今后LOOKUP的具体应用也有实用的指导意义。

   多讨论就会有收获。

TA的精华主题

TA的得分主题

发表于 2007-5-17 19:08 | 显示全部楼层

LOOKUP速度测试(之一,数值) 

测试方法    数据区域:A列65536个单元格;公式:LOOKUP(5,A:A)共2000个公式

测试过程

1,A列全部设为1,运行时间:0.006s

   A列全部设为9,运行时间:0.006s

2,A列全部设为1,A1和AA65536两个单元格改为以下三个数字的各种组合:{1,5,9}  运行时间:0.006s

3,A列全部设为RAND()*100【选择性粘贴为数值,且其中没有=5的】,运行时间:0.006s

4,A1:A32767为上半区,A32768:A65536为下半区

  上半区全部=5,下半区两次测试分别=1和RAND()*100,运行时间都是0.006s

5,三次测试——

    A列全部=5,

    下半区=5,上半区=1

    下半区=5,上半区=RAND()*100

    三次测试的结果都是:运行时间 11.609s

结果分析

1,第5个测试时间为什么这么长?看看流程图的中间部分。当X=A(posi)时,LOOKUP要逐个比较。由于下半区全部=5,所以它要比较(65536-32768)次。当下半区不是全部=5,就基本上使用二分法,比如上面说的测试3。

2,onkey流程图在二分法为主导的情况下,能找出另外一个逐个比较法的分支来,确属不易!这个精华是不是应该Double?!

3,两个时间之比=11.609/0.006=1934

  这和查找次数之比基本吻合:

  当采用逐个查找时(测试5),查找次数是:(65536-32768)

  而采用二分法查找同样的区域(如测试1中的A列=1的情况),查找次数是LOG((65536-32768),2)=15

  (65536-32768)/LOG((65536-32768),2)=2184。

  2184与1934非常接近。这是不是也能从另一个侧面佐证:LOOKUP确实是采用的二分法?

                                                                                                                                                                                                                 .

[此贴子已经被作者于2007-5-17 20:00:24编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-17 19:09 | 显示全部楼层

LOOKUP速度测试(之二,文本与数值)

测试方法  前面的测试相同。A列整列,公式2000个

测试过程

序号A1A66536其他单元时间(S)
1A5A5.484
225A5.484
3A2A5.484
455A5.484
552A5.484
65AA11.059
79AA11.059
8AAA11.059
92AA11.059
10A9A16.391
1159A16.391

结果分析

1,LOOKUP确实不是“忽略”文本,而是要作更复杂的运算,需要更多的时间

2,前5个测试(序号1-5)下半区都有一个数字。所以LOOKUP只查找了下半区,这和Willin2000增补的流程相吻合;

  而测试6-测试9这四个,下半区没有数字,所以在查找完下半区后,又反过来查找了上半区。因此它的时间是前5个的2倍。

3, 最后两个测试它的时间是测试6-9的1.5倍。为什么是这样?onkey流程图没说,willin2000的流程图也解释不了这个现象。存疑。也许这是完整流程图的突破点之一?(因为下楼要说到另一个突破点)

                                                                                       .

[此贴子已经被作者于2007-5-18 10:18:20编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-17 19:10 | 显示全部楼层

LOOKUP速度测试(之三,各种类型)

测试方法    与前相同,A列整列,2000个公式 LOOKUP(5,A:A)

测试过程

1, A列整列 为文本"A"  运行时间:11.047s

2, A列整列 为空值       运行时间:5.438s

3, A列整列 为各种错误值       运行时间:6.703s

4, 上半区为文本,下半区为空值    时间:8.453s

5, 上半区为#N/A,下半区为数值1 时间:0.006s

6, 上半区为#N/A,下半区为数值5 时间:11.609s

7,……

其他的组合,我就不列出了。

结果分析:

我只想说一句,看来我们把他们统称为“非第一参数类型”是不大恰当的,因为显然——LOOKUP对于非第一参数类型元素的处理是各不相同的!

 增加逻辑值测试:A列整列分别写上两种逻辑值true和false,运行时间:5.578s

[此贴子已经被作者于2007-5-18 10:42:53编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-18 00:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
QUOTE:
以下是引用czzqb在2007-5-17 19:09:56的发言:

.....................

3, 最后两个测试它的时间是测试6-9的1.5倍。为什么是这样?onkey流程图没说,willin2000的流程图也解释不了这个现象。存疑。也许这是完整流程图的突破点之一?(因为下楼要说到另一个突破点)                                                                                .


 

10,11流程图可以解释的.

6/7/8/9的第一次是走下面图中的:1/2/(出口是A)4/5,在5中right=posi-1=posii-1=32678-1
 

posi10/11的第一次是走下面图中的:1/2(出口是B)/3/4/5,5中right=posi-1=65536(出口B的数)-1=65535,这样第二次还要走一次下半区(不含65526了),

 


CZZQB能否把测试附件发上来,因为我这里94的6-9和95楼的1等区别不大,.

(95-5容易解释.)

[此贴子已经被作者于2007-5-18 0:59:06编辑过]

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

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

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

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

TA的精华主题

TA的得分主题

发表于 2007-5-18 01:06 | 显示全部楼层

[em17][em17][em17]

非常棒!czzqb版主的测试!

TA的精华主题

TA的得分主题

发表于 2007-5-18 09:37 | 显示全部楼层
QUOTE:
以下是引用gouweicao78在2007-5-18 1:06:06的发言:

[em17][em17][em17]

非常棒!czzqb版主的测试!

哟,这里这么热闹,谢谢几位版主的无私分享!

TA的精华主题

TA的得分主题

发表于 2007-5-18 10:33 | 显示全部楼层

To willin2000:

1,前面的测试有点问题。主要是因为测试条件不统一。今天把测试条件统一了一下,重新作了一遍,结果已经在上面几个帖子中更改。请按新数据重新验证

2,测试的方法很简单。

(1)A列整列输入数据

(2)B列的B1:B2000输入公式LOOKUP(5,A:A)

(3)来个按钮,关联一段宏。代码是:

Sub myTimer()
Dim t, t1
t = Timer
Calculate
t1 = Timer - t
MsgBox Format(t1, "0.000秒")
End Sub
(4)没了

——这样,就不用发附件了吧?

3,

posi10/11的第一次是走下面图中的:1/2(出口是B)/3/4/5,5中right=posi-1=65536(出口B的数)-1=65535,这样第二次还要走一次下半区(不含65536了),

这个解释很对!是我的疏忽!不好意思。测试二的1/2/3/4/5走下半区;6/7/8/9上半区+下半区(整个A列);而10和11除了整个A列之外,又多走了一遍(差一点)下半区。

——这样我的测试之一、之二的结果就在onkey和willin2000两个流程图中都得到了解释。

下来的工作就是要继续改善流程图,以适应测试之三得到的各种数据。在下面我将继续给出另一个测试结果(之四)

TA的精华主题

TA的得分主题

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

LOOKUP速度测试(之四,文本)

在“测试之三”中除了文本之外其余各种情况已经测试(如各种错误值、各种逻辑值),所有错误值速度基本一样,逻辑值的速度也相同。

文本有没有不同?

测试

测试方法同上(A列整列、2000个公式)

英文

字符串从ABCD……XYZ顺序截取

文本长度:时间s
111.047
212.063
311.234
412.219
511.625
612.578
711.844
812.75
912.016
1012.969
1112.328
1212.328
1313.734
1413.344
  
  
  
2416.578
2513.563
2615.594

这得到了一个很奇怪的结果。

好像文本长度为奇数和偶数的分别采用两种查找;而奇数的增长比偶数快……

汉字

测试字符串:从“中华人民共和国北京是首都”顺序截取。

测试结果是:

 汉字个数 时间s
 111.188
 2 12.188
 3 11.391
 4 12.453
 5 11.826
 6 12.751
 7 12.034
 8 12.875
 9 12.219
 10 13.125
 11 12.587
 12 13.468

看来流程图要想合理地解释这些结果,将会是比较复杂的一个东东吧?(如果这些测试结果正确的话)

[此贴子已经被作者于2007-5-18 11:05:06编辑过]

TA的精华主题

TA的得分主题

发表于 2007-5-19 11:41 | 显示全部楼层

计算时间除了和查找策略有关外,是不是也应该和计算对象有关,因为不同类型的参数在计算机了的存储方式各不相同,同一个表达式在翻译成机器码后机器码的条数也是不一样的.

附件是比较(按"测试"):

HdBsoEA6.rar (8.44 KB, 下载次数: 92)

(由于上传尺寸限制,下载后将A/B/E/G/HJ/K/N到底(65526) (D列为全空)

 


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

本版积分规则

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

GMT+8, 2024-5-6 00:38 , Processed in 0.036414 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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