Time complexity 当实际时间复杂度是阶跃函数时,为什么二进制搜索的时间复杂度为O(logn)?

Time complexity 当实际时间复杂度是阶跃函数时,为什么二进制搜索的时间复杂度为O(logn)?,time-complexity,binary-search,Time Complexity,Binary Search,这是人们通常遇到的对数时间复杂度的定义: 对数运行时间O(logn)本质上意味着运行时间与输入大小的对数成比例增长 但在某些情况下,时间似乎并不严格地与输入大小的对数成比例地增长。例如,考虑二进制搜索。据说该算法的时间复杂度为O(logn)。我已经生成了大小从2到1000的数组,对于每个数组,我已经计算了最坏情况下的迭代次数(即数组拆分)。这就是结果 显然,实际的时间复杂度不是log2(n)(只有当log2(x)为整数时,两个函数才具有相同的输出x) 所以我的问题是,为什么我们说二进制搜索算法

这是人们通常遇到的对数时间复杂度的定义:

对数运行时间
O(logn)
本质上意味着运行时间与输入大小的对数成比例增长

但在某些情况下,时间似乎并不严格地与输入大小的对数成比例地增长。例如,考虑二进制搜索。据说该算法的时间复杂度为
O(logn)
。我已经生成了大小从2到1000的数组,对于每个数组,我已经计算了最坏情况下的迭代次数(即数组拆分)。这就是结果

显然,实际的时间复杂度不是
log2(n)
(只有当
log2(x)
为整数时,两个函数才具有相同的输出
x


所以我的问题是,为什么我们说二进制搜索算法有一个
O(logn)
复杂度,而时间复杂度实际上是一个阶跃函数?
(从
1=n/2^x
开始的推导,经过一些代数运算后,最终得到
x=log2(n)
并没有解释原因)你的观察是对的。然而,big-O是渐近表示法。一般来说,在讨论时间复杂度时,我们对给出精确操作数的函数不感兴趣,但我们感兴趣的是时间如何随着输入大小的函数而增长,特别是对于输入大小

如果你花点时间去理解big-O的性质,你会发现一些有趣的性质。其中一个性质是O(f(n))=O(cf(n)+d)*,其中c>0,d是常数(如果f(n)不是常数)


让我们从您的示例中获取阶跃函数s(x)。我们知道,对于任何x,log(x)-1你的观察是正确的。然而,big-O是渐近表示法。一般来说,在讨论时间复杂度时,我们对给出精确操作数的函数不感兴趣,但我们感兴趣的是时间如何随着输入大小的函数而增长,特别是对于输入大小

如果你花点时间去理解big-O的性质,你会发现一些有趣的性质。其中一个性质是O(f(n))=O(cf(n)+d)*,其中c>0,d是常数(如果f(n)不是常数)


让我们从您的示例中获取阶跃函数s(x)。我们知道,对于任何x,log(x)-1,您还应该指定
d>=0
,否则您将允许O(1)=O(1+(-1)),这是不正确的。你仍然会允许O(0)=O(0+1),这也是不正确的,所以最好忘记“+d”部分。@kaya3谢谢你,是的,常数情况f(n)=c更复杂。为了简洁起见,我省略了它,因为我们在这里讨论的是logn。我将进行编辑以使您满意:)您还应该指定
d>=0
,否则您将允许O(1)=O(1+(-1)),这是不正确的。你仍然会允许O(0)=O(0+1),这也是不正确的,所以最好忘记“+d”部分。@kaya3谢谢你,是的,常数情况f(n)=c更复杂。为了简洁起见,我省略了它,因为我们在这里讨论的是logn。我将编辑到您满意的程度:)