我现在已经解决了几个小时的问题了,我需要澄清一下:
我需要简化(尽可能多)以下的big-O表达式。对于每一个,我放下了我认为正确的答案。我想要解决方案,但如果我不正确,我也会感谢您的解释。我试图尽可能地学习Big O符号,我认为做这些问题有很大帮助。我只是想确保我走在正确的道路上。
a)O(sqrt(n) + log(n)*log(n))
我认为这是O(n)
b)O(3log2 n + 2log3 n)
我认为这是O(log3 (n))
c)O(n^3 + 2n^2 +3n + 4)
我认为这是O(n^3)
感谢您的帮助!
答案 0 :(得分:1)
让我们一次完成这个。
O(sqrt(n)+ log(n)* log(n))。我以为这是 O(n)
你是对的,这是O(n),但这不是一个特别严格的约束。让我们从一个简化的问题开始:增长得更快,O(sqrt(n))或O(log(n)* log(n))?使用该信息,您可以从总和中删除两个术语中的一个吗?
O(3log2 n + 2log3 n)。我以为这是 O(log3(n))
请记住" big-O忽略了对数的基数" (对于任何大于1的b和c,log b n = O(log c n))。从技术上讲,它是O(log3 n),但这不是最干净的解决方案。你最好在这里说O(log n)。
O(n ^ 3 + 2n ^ 2 + 3n + 4)。我以为这是 O(n ^ 3)
完全正确!这是有效的,因为2n 2 + 3n + 4是O(n 3 ),因此您可以从求和中删除这些项。现在,您是否可以使用类似的技巧来简化您对(a)部分的回答?
希望这有帮助!
答案 1 :(得分:0)
(a)是我认为最艰难的一个; (b)和(c)使用相当普遍的Big-Oh简化规则。
对于(a),我建议做一个替换:让m = [n的某个函数使两个术语中的一个更简单]并重新排列得到n = [something]。然后,您可以使用它将m替换为表达式,从而消除n的所有外观,并根据Big-Oh规则简化它。然后,如果您选择的函数是n的递增函数,则可以将n替换为n并在需要时进一步简化。
答案 2 :(得分:0)
好的答案很长,但我一直很好。
<强>说明:强>
你需要做的第一件事就是正确定义大O的意思。Relevant read。传统上它只被定义为上限。但它在计算机科学中并不是很有用,至少不适用于像你这样的任务。你可以从技术上回答任何增长速度超过例子的事情,即说O(n!)
所有问题在技术上都可以。
更有用的是大theta,通常在CS中我看到大O从上面的阅读重新定义为大Theta的含义。区别在于你的约束,必须更严格,也可以从下面申请。
定义/规则:我最喜欢的计算Big O(和Theta)的方法是使用限制。它允许以简单直接的方式求和渐近行为关系。
基本上如果(此处及其后隐含x->inf
):
lim f(x) / g(x) = infinity
- 渐进式增长大于g lim f(x) / g(x) is a constant > 0
- f渐近增长与g lim f(x) / g(x) = 0
- 渐进式增长慢于g 2号是大Theta。第2和第3组合是传统的大O,如“f
属于O(g)
”(或“是 O(g)
”,这有点令人困惑的措辞) 。这意味着f
不会超过g
,因此g
是其上限。
现在用一点点数学很容易证明Big O(或Theta)只关心增长最快的术语。这直接来自极限属性。
从现在开始,我将使用O
作为大Theta,因为一切都适用于Big O,因为它更宽松。
示例说明:
你的第三个例子是最简单的。您可以安全地删除2n^2 +3n + 4
,因为n^3
增长得更快。您可以通过计算n^3 + 2n^2 +3n + 4
来证明O(n^3)
为lim n^3 / (n^3 + 2n^2 +3n + 4)
。
同样适合你的第二次尝试,但你需要通过对数属性。基本上是:
log b1 (x) = c log b2 (x)
- 这意味着你可以以常数为代价切换对数的基数......并且从上面的规则定义中,常数因子不会改变任何东西,它仍然是2.只是常数变化。 / p>
你的第一个例子是最难/最棘手的,因为限制是最复杂的。但是,O(f+g)
是 O(f)
或O(g)
,因为其中一个增长得更快,因此另一个可以被删除或渐渐增长相同所以任何一个都可以被选中(他们增长最快的任期将是相同的)。这意味着你需要检查哪一个增长得更快,你可以通过...计算lim sqrt(n)/(log(n)*log(n))
并根据上面的规则进行选择。我认为这需要医院治疗。