Python二进制搜索(最大迭代次数)

Python二进制搜索(最大迭代次数),python,algorithm,binary-search,Python,Algorithm,Binary Search,我在用python搜索二进制文件时发现: 它说,最大迭代次数(与Probe right相同?)和N(列表大小)之间的一般关系由N=2^k-1给出,其中k是最大迭代次数 然而,根据我的理解,一般关系不应该是N=2^k 每次搜索之后,我们都会将列表除以2,直到得到1 因此,最大迭代次数是log2n,而不是log2(N+1) 我在谷歌上搜索了一下,发现一个网站支持我的答案,但没有太多解释。 (此处链接:) 有人能解释一下背后的数学原理吗?谢谢。让p(n)为n元素所需的探针数量。然后我们可以写出以下等

我在用python搜索二进制文件时发现:

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

然而,根据我的理解,一般关系不应该是
N=2^k


每次搜索之后,我们都会将列表除以2,直到得到1

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

我在谷歌上搜索了一下,发现一个网站支持我的答案,但没有太多解释。 (此处链接:)

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

p(n)
n
元素所需的探针数量。然后我们可以写出以下等式:

P(0) = 0
P(n) = 1 + P((n-1)/2)
说明: 首先,我们没有任何元素-无事可做。 然后我们做了一个探测,剩下
(n-1)/2个
元素(我们扔掉了1个,因为我们刚刚检查了它),所以我们需要做
P((n-1)/2)
更多


根据该方程得出的
p(n)
的结果将是
floor(lg(n+1))
。您可以在一些示例(如n=6和n=7)上查看它,也可以阅读如何求解递归方程

“每次搜索后,我们都会将列表除以2,直到得到1”。否:在您引用的实现中,每次迭代都会删除列表中的一个元素,然后将感兴趣的区域缩小到该元素右侧或左侧的所有内容。对于具体性,你应该把一个“探针”看作一个列表查找(<代码> xs[MIDLIZECTION] ),而不是一个迭代。第二个等式应该是<代码> 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)
,但我不知怎么得到了一个不同的解。我用2^n替换n,最终得到
P(n)=log2(n)+1
。虽然差别不大,但如果有人能告诉我如何解决,我真的很感激。谢谢