仍然不了解 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 与最坏情况时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章