仍然不了解 Big-O 与最坏情况时间复杂度

Posted

技术标签:

【中文标题】仍然不了解 Big-O 与最坏情况时间复杂度【英文标题】:Still not understanding Big-O vs Worst Case Time Complexity 【发布时间】:2021-10-11 09:14:22 【问题描述】:

线性搜索花费时间的最坏情况是当项目位于列表/数组的末尾或不存在时。在这种情况下,算法将需要执行n 比较,以查看每个元素是否是所需的值,假设n 是数组/列表的长度。

根据我对大 O 表示法的理解,说这个算法的时间复杂度是 O(n) 是有道理的,因为它可能会发生最坏的情况,并且在以下情况下使用大 O我们想对“最坏情况”进行保守估计。

从 Stack Overflow 上的很多帖子和答案来看,这种想法似乎是有缺陷的,诸如 Big-O 表示法与最坏情况分析无关。

请帮助我理解这种区别,而不仅仅是增加我的困惑,就像这里的答案:Why big-Oh is not always a worst case analysis of an algorithm? 那样。

我没有看到 big-O 与最坏情况分析无关。在我目前的山顶上,看起来 big-O 表示最坏情况如何随着输入大小的增长而增长,这似乎与最坏情况分析非常“相关”。

诸如此类的声明,来自https://medium.com/omarelgabrys-blog/the-big-scary-o-notation-ce9352d827ce:

例如,最坏情况分析给出了假设输入处于最坏可能状态的最大操作数,而大 o 表示法表示在最坏情况下完成的最大操作数。

帮不上什么忙,因为我看不出所指的是什么区别。

非常感谢任何增加的清晰度。

【问题讨论】:

【参考方案1】:

大 O 表示法确实独立于最坏情况分析。它适用于您想要的任何功能。

在线性搜索的情况下,

最坏情况的复杂度是 O(n)(实际上甚至是 Θ(n)),

平均情况复杂度是 O(n)(实际上甚至是 Θ(n)),

最佳情况下的复杂度是 O(1)(实际上甚至是 Θ(1))。


因此,大 O 和最坏情况是不同的概念,尽管算法运行时间的大 O 界限必须适用于最坏情况。

【讨论】:

【参考方案2】:

是这样的:

如果找到问题解决方案的算法在O(f(n)) 中,则意味着通过算法找到问题解决方案的最坏情况在O(f(n)) 中。换句话说,如果最坏的情况可以通过算法在g(n)步骤中找到,那么g(n)O(f(n))中。

例如,对于搜索算法,正如您所提到的,我们知道最坏的情况可以在O(n) 中找到。现在,虽然算法在O(n) 中,但我们可以说算法也在O(n^2) 中。如您所见,这是 Big-Oh 复杂性和最坏情况之间的区别。

总之,算法的最坏情况复杂度是算法 Big-Oh 复杂度的子集。

【讨论】:

以上是关于仍然不了解 Big-O 与最坏情况时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

数据结构第六课------------狄泰软件学院

归并排序的时间复杂度O(n*log n)是怎么得来的,求大神详细的讲解一下

是否有用于查找复杂多边形的凸包的线性时间算法?

用于迭代列表中步骤的 Big-O 表示法-Python

数据库索引及其 Big-O 表示法

(递归记忆化)最好与最坏的选择——375. 猜数字大小 II