【问题标题】:Python Binary Search (Maximum number of iterations)Python Binary Search(最大迭代次数)
【发布时间】:2016-01-31 22:53:06
【问题描述】:

我在 python 中使用谷歌搜索二进制搜索,我发现了这个: http://openbookproject.net/thinkcs/python/english3e/list_algorithms.html

它表示max之间的一般关系。迭代次数(与 Probe 相同?)和 N(列表大小)由 N = 2^k -1 给出,其中 k 是最大迭代次数。

但是根据我的理解,一般关系不应该是N = 2^k
每次搜索后,我们都会将列表除以 2,直到得到 1。

因此最大迭代次数是log2 N 而不是log2 (N+1)

我用谷歌搜索了这个,我发现一个网站支持我的答案,但没有太多解释。 (此处链接:http://codingexplained.com/coding/theory/binary-search-algorithm

有人能解释一下它背后的数学原理吗?谢谢。

【问题讨论】:

  • "每次搜索后,我们将列表除以 2,直到我们得到 1"。否:在您引用的实现中,每次迭代从考虑中删除列表中的一个元素,然后将感兴趣的区域减少到该元素右侧或左侧的所有内容。具体而言,您应该将“探针”视为列表查找 (xs[mid_index]),而不是迭代。

标签: python algorithm binary-search


【解决方案1】:

P(n)n 元素所需的探测数。那么我们可以写出如下等式:

P(0) = 0
P(n) = 1 + P((n-1)/2)

说明: 首先,我们没有元素——无事可做。 然后我们进行 1 次探测,剩下 (n-1)/2 元素(我们将 1 扔掉,因为我们刚刚检查过它)所以我们需要做更多 P((n-1)/2)

此等式中P(n) 的结果将是floor(lg(n+1))。您可以查看一些示例(例如 n=6 和 n=7),或者您可以阅读如何求解递归方程

【讨论】:

  • 第二个等式应该是P(n) = 1 + P(n // 2):例如,考虑n = 6的情况——我们选择一个“中间”元素,将2个元素留给一侧,3个留给另一侧;在最坏的情况下,我们最终会减少到这 3 个元素,因此我们希望等式最终为 P(6) = 1 + P(3)。 (它产生影响的第一种情况是n = 2;我们应该有P(2) = 2。)
  • 我认为你是对的,但这会产生不同的结果。也许文章真的有错误?
  • 我认为文章没有错误。使用1 + P((n-1)/2),您会得到与文章中的内容不同意的内容,正如我已经为P(2) 指出的那样。 (对于P(2),您应该得到ceil(log2(3)),即2,但根据您的定义,您将得到P(2) = 1。)如果将(n-1)/2 更改为n//2,那么您的定义与文章一致。您认为文章的哪一部分有误?
  • 谢谢你们俩。我正在尝试解决递归方程P(n) = 1 + P(n/2),但我以某种方式得到了不同的解决方案。我将 n 替换为 2^n ,最终我得到了 P(n) = log2(n) + 1 。虽然差异不大,但如果有人能告诉我如何解决它,我会很感激。谢谢。
猜你喜欢
  • 2012-11-11
  • 1970-01-01
  • 2012-09-16
  • 2022-01-04
  • 2019-07-04
  • 1970-01-01
  • 2022-01-22
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多