【问题标题】:Why does a binary search have a time complexity of O(log n), when the actual time complexity is a step function?当实际时间复杂度是阶跃函数时,为什么二分查找的时间复杂度为 O(log n)?
【发布时间】:2022-04-13 19:48:02
【问题描述】:

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

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

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

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

所以我的问题是,为什么我们说二分搜索算法具有O(log n) 复杂度,而时间复杂度实际上是一个阶跃函数?(以@987654329 开头的推导@ 并且在一些代数操作以 x = log2(N) 结束后没有解释原因)

【问题讨论】:

    标签: time-complexity binary-search


    【解决方案1】:

    您的观察是正确的。但是,big-O 是渐近符号。一般来说,在讨论时间复杂度时,我们对提供精确操作数量的函数不感兴趣,但我们对时间如何作为输入大小的函数增长感兴趣 - 特别是对于sufficiently large 输入大小。

    如果你花点时间了解一下 big-O 的definition,你会发现一些有趣的属性。一个这样的性质是 O(f(n)) = O(c * f(n) + d),其中 c > 0 和 d em> 是常量(如果 f(n) 不是常量)。

    让我们从您的示例中获取阶跃函数 s(x)。我们知道对于任何 x,log(x) - 1 。我们认识到 -1 是一个常数,因此可以得出 O(s(x)) = O(log(x))。

    【讨论】:

    • 您还应该指定d >= 0,否则您将允许 O(1) = O(1 + (-1)) 不正确。而且你仍然允许 O(0) = O(0 + 1) 这也是不正确的,所以最好忘记“+ d”部分。
    • @kaya3 谢谢,是的,常数情况 f(n) = c 涉及更多。为简洁起见,我省略了它,因为我们在这里讨论的是 logn。我会编辑到您满意的:)
    猜你喜欢
    • 2022-10-24
    • 2011-07-09
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 2019-12-09
    相关资源
    最近更新 更多