我的理解是,如果算法是O(1)
,它也是O(n)
,O(n^2)
,O(n^3)
等等,这使得它看起来毫无用处。例如,如果有人问我任何算法的Big-Oh表示法,我可以简单地说O(n^n)
而不考虑它(从字面上看)并且在大多数情况下在技术上是正确的。
因为(这是我的理解)这是真的,这有用的信息怎么样?使用类比,如果我问某人他们拥有多少房子,那么“1到无限”这样的答案就不是很有用。一个有用的答案(这有点像Big-Theta)将是“1”。
答案 0 :(得分:7)
Big-O建立 上限。如果您知道算法是O(n 2 ),那么您知道它的复杂性是最差二次方。它实际上可能是O(n)或O(1),但绝对不是O(n 3 )。找出算法运行时的上限是非常有用的。
你说的问题是“这个算法的大O是什么?”措辞不好。 “the”这个词不正确。算法中没有一个Big-O。有许多。无限多。 Big-O没有建立紧上限。这就是Big-Theta的用武之地.Big-Theta断言了上限和下限:它给出了一个精确的渐近界。问题应该是,“这个算法的Big-Theta是什么?”
但重要的是不要抛出Big-O,因为并非所有算法都具有已知的精确界限。 Matrix multiplication是众所周知的问题,没有确定的Big-Theta。朴素算法是O(n 3 ),现有技术是O(n 2.3727 )。这是 上限,但它可能不是 (最佳)上限。 Big-Theta位于O(n 2.3727 )和Ω(n 2 )之间。
答案 1 :(得分:1)
这是向美国数学学会提出O符号的letter by Donald Knuth
答案 2 :(得分:0)
说任何算法都是O(n ^ n)是不正确的,因为大哦指的是一个紧上限。我们也没有说算法是O(n ^ n),而是算法的时间复杂度是O(n ^ n)。
我希望这能澄清事情。