Big o 大O代数简化问题
我已经研究一个问题好几个小时了,我需要澄清: 我需要简化(尽可能多地)下面的big-O表达式。对于每一个问题,我都记下了我认为正确的答案。我想要解决方案,但如果我不正确,我也希望得到解释。我正在尽可能地学习大O符号,我认为解决这些问题帮助很大。我只是想确定我走的是正确的道路 a)Big o 大O代数简化问题,big-o,Big O,我已经研究一个问题好几个小时了,我需要澄清: 我需要简化(尽可能多地)下面的big-O表达式。对于每一个问题,我都记下了我认为正确的答案。我想要解决方案,但如果我不正确,我也希望得到解释。我正在尽可能地学习大O符号,我认为解决这些问题帮助很大。我只是想确定我走的是正确的道路 a) O(sqrt(n)+log(n)*log(n)) 我以为这是O(n) b) O(3log2n+2log3n) 我以为这是O(log3(n)) c) O(n^3+2n^2+3n+4) 我以为这是O(n^3) 谢谢你的帮助
O(sqrt(n)+log(n)*log(n))
我以为这是O(n)
b) O(3log2n+2log3n)
我以为这是O(log3(n))
c) O(n^3+2n^2+3n+4)
我以为这是O(n^3)
谢谢你的帮助 让我们一次看一遍这个 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,logbn=O(logcn))。从技术上讲,它是O(log3n),但这不是最干净的解决方案。你最好在这里说O(logn) O(n^3+2n^2+3n+4)。我以为这是O(n^3) 完全正确!这是因为2n2+3n+4是O(n3),所以可以从求和中删除这些项。现在,你能用类似的技巧来简化(a)部分的答案吗 希望这有帮助 (a)是我认为最难的一个;(b) 和(c)使用相当常见的规则来简化大型Oh
对于(a),我建议做一个替换:让m=[使两项中的一项更简单的n的某个函数]并重新排列得到n=[某物]。然后,您可以使用它将m替换为表达式,从而消除n的所有外观,并根据大Oh规则对其进行简化。然后,假设您选择的函数是n的递增函数,您可以将n替换回,并在需要时进一步简化。好的,答案很长,但我始终都很满意 简介: 你需要做的第一件事是正确定义你所说的“大O”是什么意思。传统上,它只被定义为上限。但它在计算机科学中不是很有用,至少对于像你这样的任务来说不是。从技术上讲,你可以用比示例增长更快的任何东西来回答问题,例如,对所有问题说
O(n!)
,从技术上来说都可以
更有用的是大θ,通常在CS中,我从上面的阅读中看到大O被重新定义为大θ的含义。不同的是,你的界限,必须更紧,也适用于从下面
定义/规则:我最喜欢的计算大O(和θ)的方法是使用极限。它允许以简单直接的方式求和渐近行为关系
基本上,如果(x->inf
在此处和之后暗示):
lim f(x)/g(x)=无穷大
limf(x)/g(x)是一个大于0的常数
limf(x)/g(x)=0
-f渐近增长慢于gf
属于O(g)
”(或“isO(g)
”,这有点让人困惑)。这意味着f
不会超过g
,因此g
是它的上限
现在用一点数学很容易证明大O(或θ)只关心增长最快的项。这直接来自极限属性
从现在起,我将使用O
作为大θ,因为大O更松散,所以一切都适用
示例说明:
你的第三个例子是最简单的。您可以安全地放下2n^2+3n+4
,因为n^3
增长更快。通过计算limn^3/(n^3+2n^2+3n+4)
可以证明n^3+2n^2+3n+4
是O(n^3)
第二个例子也是如此,但需要遍历对数属性。基本上:
logb1(x)=clogb2(x)
-这意味着你可以在牺牲常数的情况下切换对数的底。。。根据上面的规则定义,常数因子不会改变任何东西,它仍然是2。只是不断的变化
你的第一个例子是最难/最棘手的,因为限制是最复杂的。然而,
O(f+g)
要么是O(f)
要么是O(g)
,因为其中一个增长更快,所以另一个可以被丢弃,或者它们渐进地增长相同,所以可以选择其中一个(它们的最快增长项无论如何都是相同的)。这意味着你需要检查哪一个生长得更快,你可以通过。。。计算limsqrt(n)/(log(n)*log(n))
并根据上面的规则进行选择。我认为这一条需要医院规则。看来你走对了路。你以后可能想问cs.stackexchange这类问题。哦,谢谢AndyG,我是新来的,下次我会记得的。澄清:O(sqrt(n)+log(n)*log(n))不是O(n)。前者是后者的子集,但它们并不相等。例如,T(n)=n在O(n)中,但不在O(sqrt(n)+log(n)*log(n))中。技术上是这样的。大Oh只定义上限。这就是为什么人们说“这不是一个特别严格的约束”。@luk32不,不是。满足O(n)的松散界限的函数不一定满足较紧的界限。因此,这两个集合不能相等。O(sqrt(n)+log(n)*log(n))的一切