本帖最后由 Bodhidharma 于 2013-8-11 13:01 编辑
论坛里有几位大师版主深深的研究过lookup的二分法运算过程及规率,我的理解是:①所有二分法,第一参数只能是2.如lookup(2,….②如果数据是升序排列,那么从左到右找,找到>=本身时停止并返回对应的数值(有第三个参数时)或者返回>=本身的那个值(没有第三个参数时).③当乱序的时候,从中间向右边找(包含中间值)先找左边第一个值,如果<=本身,则返回对应值,否则去右边找,找到<=本身时返回对应值。。。[当然在找的时候都是跳过错误值]
呃…從這段話來看,樓主似乎對LOOKUP和二分法有很大的誤解,建議樓主搜尋一下「二分搜尋法(Binary Search),並研讀一下板上LOOKUP的精華帖 http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=113915&pid=1566407 1.二分搜尋法是一種演算法(Algorithm),是lookup的計算機制,跟查找的數無關,lookup的第一個參數不管是什麼,都還是使用(非嚴格義意上的)二分搜尋法,也不會因為第一個參數為零,就變成「0分搜尋法」 2.二分搜尋法基本上是從中間開始找,你這種從前到後的找法,基本上是精確查找的作法(當然精確找法會遍歷,若全部都找不到則反回#N/A 3.亂序時,查找的流程比較複雜,跟你講的也有所不同,建議詳讀一下上面連結中的流程圖
以你提供的例子來說(本身是亂序的,是由{0;0;-0.2;-0.22;n-4個錯誤值}組成的序列 套進流程圖的話,查找的過程會是: ----------------------- 5、6的情形 | left=1,right=5,posi=3 | left=4 | posi=4 | left=5 | posi=5 | posi=4 |
----------------------------------- 7的情形 | left=1,right=7,posi=4 | left=5 | posi=6 | right=5 | posi=5 | posi=4 |
------------------------------------ 8的情形 | left=1,right=8,posi=4 | left=5 | posi=6→posi=7→posi=8 | right=7 | posi=6→posi=7 | right=6 | posi=5→posi=6 | right=5 | posi=5 | posi=4 |
--------------------------------------------------- 9(以上)的情形 | left=1,right=9,posi=5 | posi=6→posi=7→posi=8→posi=9 | right=8 | posi=4 | left=5 | posi=6→posi=7→posi=8 | right=7 | posi=6→posi=7 | right=6 | posi=5→posi=6 | right=5 | posi=5 | posi=4 |
------------------------------------------------------ 由此可以解釋為什麼會返回0.22 但是如果這個圖是對的,照理來說全部都會返回0.22,不應該出現0 由此可知,該流程圖在處理錯誤值上面,似乎仍然不完備 不知為何,POSI最後跑到2去了,這個值得好好研究 不過大體上來講,在不存在錯誤值的情況下,該流程圖應該是正確的
|