Gui*_*ndi 6 excel excel-formula
我多年来一直在使用这个Excel公式.它工作正常,但我想了解它的工作原理!该公式用于查找列表中的最后一个关联值.例如:
C14中的公式: =LOOKUP(2,1/(B1:B12="meat"),C1:C12)
这里,公式在C14
B列中查找最新"meat"
标记的单元格,并返回C列中的关联值.报告认为"meat"
,在B9
和相应的返回值C9
.
公式中最令人费解的部分是"1/(....)"
.这个师是什么?这种语法来自哪里?可以在其他地方使用吗?为什么查找值2
?
这是发生了什么:这
=LOOKUP(2,1/(B1:B12="meat"),C1:C12)
Run Code Online (Sandbox Code Playgroud)
变成了这个
=LOOKUP(2,1/{TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE},C1:C12)
Run Code Online (Sandbox Code Playgroud)
这变成了这个
=LOOKUP(2,{1;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;#DIV/0!;1;#DIV/0!;#DIV/0!;#DIV/0!},C1:C12)
Run Code Online (Sandbox Code Playgroud)
该B1:B12="meat"
部件被评估为TRUE和FALSE值的数组.当您在TRUE或FALSE上进行数学运算时,它会变为1或0.将1乘1或0除以1表示所有真值,div/0表示所有falses.
既然你知道你将拥有一个完全由两个东西组成的数组(1或div/0),你可以查找任何大于1的数字,它将返回列表中的最后1个.你可以=LOOKUP(800,...)
,它仍将返回"小于或等于查找值的最大值",或者在你的情况下1.
所以这两者有点武断 - 它只是一个大于1的数字.它的关键是创建只包含1和错误的查找数组参数--LOOKUP忽略错误.
二进制搜索
我没有关于此的官方文档,所以这是非官方版本.LOOKUP,HLOOKUP和VLOOKUP有一个参数,告诉函数数据是否已排序.如果该参数为False,则该函数将一直查看每个条目,直到结束.如果该参数为True或省略,则该函数使用二进制搜索.这样做 - 参数只存在 - 因为二进制搜索比一次一次搜索更快.
二元搜索通过查找中间值并根据所寻求的值进行评估来工作.如果中间值较大,则右侧的所有内容都将被丢弃 - 所寻求的值必须在左侧.它需要左半部分并找到它的中间值.如果它更大,它会丢弃右边并保持左边.继续迭代,直到找到值.
那么为什么LOOKUP(2,{1,1,#DIV/0!,1,1,#DIV/0!,1,1},...)
找到最后一个1
而不是一些任意的1
呢?我不知道MS究竟是如何实现二进制搜索的,所以我必须做出一些假设.我的假设是错误值被抛出数组,并且当存在偶数个条目(没有中间值)时,使用中间左侧的值.这些假设可能是错误的,但它们对结果没有任何影响.
首先,抛弃错误.现在您有这些条目及其原始位置
1 1 1 1 1 1
1 2 4 5 7 8
Run Code Online (Sandbox Code Playgroud)
"中间"数字是1(4).它小于2(寻求值),所以我们抛弃左边的所有东西并重新处理右边.现在我们有
1 1 1
5 7 8
Run Code Online (Sandbox Code Playgroud)
中间值为1(7).它小于2,所以我们抛弃左边的所有内容并重新处理右边的内容.现在我们有
1
8
Run Code Online (Sandbox Code Playgroud)
我们只有一个条目,所以这就是答案.如果搜索到的值高于所有其他值,则二进制搜索将始终返回最后一个值.
归档时间: |
|
查看次数: |
127 次 |
最近记录: |