【问题标题】:Edge finding Binary Search寻边二分搜索
【发布时间】:2012-12-08 22:28:31
【问题描述】:

想象一个网站,它每天使用条形图仅以图形形式发布每日通勤人数。我想在将图形保存为图像后通过读取条形图来确定数字(图像的东西在这里并不重要)。我想阅读条形图的方法是转到像素数(#of commuters 轴)并提出问题,“像素是“开”还是“关”? (开意味着存在柱,关意味着这个猜测太高了) 注意:有一个下限为 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

【问题讨论】:

  • 问题是什么?如果您希望审核您的代码 - 请将其发布到 CodeReview.SE。如果您的算法失败 - 请提及。如果是别的,请直接说是什么
  • 我的问题是,找到我所说的优势的最佳方法是什么?任何指导表示赞赏。 (我的代码运行良好,但不知道是不是最高效的算法)

标签: algorithm binary-search


【解决方案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 是自昨天以来的变化高度。

【讨论】:

  • 谢谢。这给了我一些思考。非常感谢。
猜你喜欢
  • 2021-05-26
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2021-08-30
相关资源
最近更新 更多