假设我有一个例程,它扫描n个项目的整个列表3次,根据大小进行排序,然后bsearched排序列表n次。扫描是O(n)时间,我将调用O(n log(n)),n次bsearch是O(n log(n))。如果我们将所有3加在一起,它只是给我们3的最坏情况 - n log(n)值或者语义是否允许增加时间?
非常确定,现在我输入的答案是n log(n),但我现在可以确认我输入了它:)
答案 0 :(得分:10)
总和确实是Big-O三者中最差的。
原因是你的函数的时间复杂度是
(n) => 3n + nlogn + nlogn
是
(n) => 3n + 2nlogn
这个函数在3nlogn之上,所以它在O(n log n)中。
您可以选择任何常量。我碰巧选择了3,因为它是一个很好的渐近上界。
答案 1 :(得分:2)
你是对的。当n变得非常大时,n log(n)占主导地位3n。
答案 2 :(得分:0)
是的,这只是最糟糕的情况,因为O符号只是渐近的表现。
这当然不应被视为添加这些额外步骤对您的程序性能没有影响。对于程序运行的给定n范围,其中一个O(n)步骤很容易消耗大部分执行时间。
答案 3 :(得分:0)
正如Ray所说,答案确实是O(n log(n))。这个问题的一个有趣的部分是你看它的方式并不重要:添加意味着“实际添加”还是意味着“最坏的情况”。让我们证明这两种看待它的方式会产生相同的结果。
令f(n)和g(n)为函数,并且不失一般性,假设f为O(g)。 (非正式地,g比f更“差”。)然后根据定义,存在常数M和k,使得f(n)<每当n> M时,M * g(n) ķ。如果我们以“最坏情况”的方式看待,我们期望f(n)+ g(n)是O(g(n))。现在以“实际添加”的方式看待它,并专注于n&gt;的情况。 k,我们有f(n)+ g(n)< M * g(n)+ g(n)=(M + 1)* g(n),因此根据定义f(n)+ g(n)是所需的O(g(n))。