边缘搜索二进制搜索

时间:2012-12-08 22:28:31

标签: algorithm binary-search

想象一个网站每天使用条形图以图形形式发布每日通勤者的数量。我想在将图形保存为图像后通过读取条形图来确定数字(图像内容在这里并不重要)。我想要读取条形图的方法是转到一个像素数字(#of通勤者轴)并询问问题,“像素是'开'还是'关'?” (打开意味着条形图存在且关闭意味着此猜测太高)注意:存在0的下限,从技术上讲,是无限上限。但是,实际上,10000可能是现实的上限。另请注意,从昨天开始没有变化是经常发现的。

鉴于昨天的起始编号猜测,找到这个数字的最有效方法是什么?高效意味着询问像素是打开还是关闭的查询数量最少。

(对于我的非CS眼睛,这看起来像某种边缘搜索二分法搜索,但没有预定义的数组。我可以说我已经学到了很多关于搜索的内容。)

我的算法作为一个函数。任何建议都是最受欢迎的。

def EdgeFind(BlackOrWhite,oldtrial,high,low):
# BlackOrWhite is a 0 or 1 depending on if the bar is present or not.  A 1 indicates that you are below or equal to the true number.  A 0 indicates that you are above the true number

# the initial values for oldtrial, high, and low all equal yesterday's value

 factorIncrease = 4#5
 finished = 0

 if BlackOrWhite == 1 and oldtrial==high:
    newtrial = oldtrial+factorIncrease*(high-low)+1
    high = newtrial
    low = oldtrial
 elif BlackOrWhite == 1 and high-oldtrial==1:
    finished = 1
    newtrial = oldtrial
 elif BlackOrWhite == 1:
    newtrial = oldtrial+(high-oldtrial)/2
    low = oldtrial

 if BlackOrWhite == 0 and oldtrial==low:
    newtrial = (oldtrial)/2
    high = oldtrial
    low = newtrial
 elif BlackOrWhite == 0 and oldtrial-low==1:
    finished = 1
    newtrial = oldtrial-1
 elif BlackOrWhite == 0:
    newtrial = oldtrial-(oldtrial-low+1)/2
    high = oldtrial

 if (oldtrial==1) and low!=1:
    finished = 1

 return finished,newtrial,high,low

1 个答案:

答案 0 :(得分:1)

调用边缘确实可以通过修改的二进制搜索来完成。

它类似于这个问题:Find an element in an infinite length sorted array

让搜索到的索引为idx

鉴于昨天的价值 - 您需要找到“边缘”,这样做可以通过指数增加/减少idx来找到。

例如,如果昨天是1000,您将在1000,1001,1002,1004,1008,1016,1032,...中搜索,直到您发现像素更改了颜色的开关。

假设您在迭代i中找到它,这意味着搜索到的边缘位于范围内的某个位置:[1000 + 2^(i-1), 1000 + 2^i]。 (当然这同样适用于向下而不是[1000 - 2^(i-1), 1000 - 2^i]

现在,您在此范围内有一个经典的二进制搜索问题。

复杂性仍为O(logN),其中N是自昨天以来变化的高度。