这是一个论证,证明算法的运行时间不能被视为Θ(f(n))
,而应该是O(f(n))
。
E.g。关于二元搜索的问题:Is binary search theta log (n) or big O log(n)
MartinStettner的response更令人困惑。
考虑*-case
表演:
最佳表现:Θ(1)
平均情况表现:Θ(log n)
最坏情况表现:Θ(log n)
然后他引用 Cormen,Leiserson,Rivest:“算法简介”:
当我们说“运行时间是O(n ^ 2)”时,我们的意思是最坏情况下的运行时间(n的函数)是O(n ^ 2)...
这是否表明running time
和worst-case running time
这两个词是同义词?
此外,如果running time
引用具有自然输入f(n)
的函数,则必须有Θ
类包含它,例如Θ(f(n))
,对吧?这表示只有在非常精确地知道运行时间时才有义务使用O
表示法(即只知道上限)。
答案 0 :(得分:0)
当您编写O(f(n))
时,表示算法的运行时间超出了函数c*f(n)
,其中c
是常量。这也意味着您的算法可以比c*f(n)
少得多的步骤完成。我们经常使用Big-O表示法,因为我们希望包含算法比我们指示的更快完成的可能性。另一方面,Theta(f(n))
表示算法始终以c*f(n)
步骤完成。二进制搜索为O(log(n))
,因为它通常会在log(n)
步骤中完成,但如果您获得幸运,则可以完成一步(最佳情况)。
答案 1 :(得分:0)
如果我读到有关运行时间的话,我总是感到困惑。
对我来说,运行时间是需要在计算机上执行算法的时间。这可能在很多方面有所不同,因此是一件复杂的事情。
所以我认为算法的复杂性是一个更好的词。
现在, 复杂度(在大多数情况下)是最坏情况下的复杂性。如果你知道最坏情况的上限,你也知道它只会在其他情况下变得更好。
所以,如果你知道,存在一些(可能是微不足道的)情况,你的算法只执行一些(常数)步骤和停止,你不必关心下限,所以你(正常) )使用大的上限 - O
或小 - o
符号。
如果您巧妙地进行计算,也可以使用Θ
表示法。
但请注意:所有复杂性仅适用于他们所附带的案件。这意味着:如果你做出像“输入是最好的情况”这样的假设,这会影响你的计算以及由此产生的复杂性。在二进制搜索的情况下,您发布了三种不同的复杂性的复杂性。
您可以通过说:“二进制搜索的复杂性在O(log n)
”中进行概括,因为Θ(log n)
表示“Ω(log n)
和O(log n)
”和O(1)
是O(log n)
的一部分。
总结一下:
- 如果您知道复杂性的非常精确的函数,则可以使用Θ
- 符号表示复杂性
- 如果要获得整体上限,则必须使用O
- 表示法,直到所有输入情况的下限与上限没有区别。
- 在大多数情况下,您必须使用O
- 表示法,因为算法太复杂而无法获得接近的上限和下限。