算法的复杂性和问题的复杂性。有什么区别?

Leo*_*uza 5 complexity-theory time-complexity computation-theory space-complexity

我想知道一个算法复杂度和一个问题复杂度之间的区别,也就是这两个东西的不同点

小智 5

好问题!大多数人对两者没有区别,这是一个很大的禁忌。

简单来说,算法的复杂度就是算法的运行时间。这可以用多种方式表示,大 O、大 Theta 或任何各种兰道符号。还有其他表示形式,但最常用的是大 O 表示法,它可用于分析算法的最坏情况时间复杂度作为输入大小的函数。

问题的复杂性通常是解决该问题的任何算法的下限(维基百科是一个不错的资源)。例如,我们可以证明基于比较的排序的下限为n log n。这意味着,任何通过比较元素进行排序的算法,无论哪种算法,n log n在最坏的情况下都至少需要时间。使用朗道表示法,我们会说这个问题需要Omega(n log n)

总之,问题复杂性是一个下限,算法通常会建立一个上限。当您找到一个其上限与问题的下限相匹配的算法时,您就找到了渐近最优算法!

  • “大 O 表示法”“代表当输入大小向无穷大增长时算法的最坏情况时间复杂度”是不正确的;相反,大 O 表示法表示函数的渐近上限。它的一个非常常见的应用是将算法的最坏情况时间复杂度作为输入大小的函数,但是相同的符号可以用于平均情况时间复杂度、最坏情况空间复杂度等,并且其他朗道符号可以同样可用于其中任何一个。 (4认同)