考虑两种算法,A和B.这些算法都解决了同样的问题,并且具有时间复杂性 (根据他们执行的基本操作的数量)给出 分别由
a)(n) = 9n+6
b)(n) = 2(n^2)+1
(i)哪种算法最好渐近?
(ii)哪个是小输入尺寸n的最佳值,n是什么值的n 案件? (您可以在必要时假设n> 0。)
我认为这是A.我是对的吗?
B部分的答案是什么?他们究竟想要什么?
答案 0 :(得分:13)
哪种算法最好渐近?
要回答这个问题,你只需要看看两个函数中 n 的指数:渐近, n 2 将增长快于 n 。所以A∈O( n )渐近是比B∈O( n 2 )更好的选择。
对于小输入尺寸 n 哪个最佳, n 的值是什么情况? (您可以在必要时假设 n > 0。)
要回答这个问题,您需要找到两个函数具有相同值的交点。对于 n = 5,两个函数都计算为51(参见9n+6=2(n^2)+1 on Wolfram Alpha)。并且由于A(4)= 42且B(4)= 33,因此对于 n ,B是更好的选择。 5。
答案 1 :(得分:7)
我认为plotting those functions对了解正在发生的事情非常有帮助。
答案 2 :(得分:1)
您应该首先熟悉渐近,大O符号等。渐渐地,一个会更好。为什么?因为可以证明,对于足够大的N,a(n)≤ b(n)对于n> Ñ
证明作为读者的练习。
答案 3 :(得分:1)
通过查看常数,很容易看出a在开始时将大于b。通过观察n的出现(b中的n,n ^ 2),可以看出b渐近更大。所以我们只需要弄清楚b上哪个点大于a。要做到这一点,我们只需要为n。
求解方程a(n) = b(n)
答案 4 :(得分:1)
9n + 6是最好的。
举个例子,如果你的n是10,那么
9n + 6 = 96 2(n ^ 2)+ 1 = 201
现在,取n是100
9n + 6 = 906 2(n ^ 2)+ 1 = 20001
它继续......
如果n = 4那么
9n + 6 = 40 2(n ^ 2)+ 1 = 33
结论,如果n <= 4,则第二个更好,但是5个或更多则最差。
BTW,在计算算法的复杂度时,我们通常最终会降低因子和常数,因为它们不会对速度差异产生太大的影响,所以它应该简化为a(n)= n和b(n)= n ^ 2,它给你一个明确的答案。答案 5 :(得分:1)
简单的图形软件将显示9n + 6的表现会比简单的代数更快。在5个或更多的集合中,9n + 6将更快。
答案 6 :(得分:1)
渐近地,O(n)比O(n ^ 2)更好(更便宜)。
对于n的小值,这是一个简单的代数问题:
找到9n+6=2(n^2)+1
的{n':清理它,我们得到二等式2(n^2)-9n-5=0
。这产生n = 5,这意味着,对于n = 5,两个过程将具有相同的成本:
这意味着B对于n <5更好,对于n = 5它们是相等的,并且对于n> 5则A更好。如果你希望在绝大多数情况下n小于5,那么B可能是更好的选择,但只有在算法很多的情况下它才有意义。如果你把它作为一个函数实现,那么B的微小好处就会对调用开销产生影响,因此它们不会引起注意。
总之,除非你非常确定你要做什么,否则继续使用A.一般来说,你总是希望算法具有更好(更便宜)的渐近成本。只有当您拥有相同的通用顺序或关于您可能获得的输入数据的可靠知识时,更深入的洞察才值得付出努力,即使这样,最好的方法是使用实际数据对理论分析进行基准测试。
答案 7 :(得分:0)
渐近地, a(n)更好,因为它是 O(n)而不是 O(n 2 )< / em>的。这是作为 n 的函数的plot运行时间。正如您所看到的,对于 n 的小值, a(n)的速度会更慢。
答案 8 :(得分:0)
我要做的是针对您描述的情况(以及具有不同处理器的计算机)多次运行算法,并获得开始时间和完成时间。然后查看每个案例的时间差异。
答案 9 :(得分:0)
很明显,如果我们有: * 9n + 6 =&gt; n:5 =&gt; 9 * 5 + 6 = 45 + 6 = 51 * 2(n ^ 2)+1 =&gt; n:5 =&gt; 2(5 * 5)+1 = 2 * 25 + 1 = 50 + 1 = 51 那么 9n + 6 要好得多。
答案 10 :(得分:0)
第一部分的答案显然是(a)因为O(n * n)>为O(n)。
第二部分的答案是你不能说“哪个是最适合小输入尺寸的”,因为你没有提供关于每种情况下“基本操作”的信息,也没有提供每个操作所花费的时间。编译器或CPU可以应用一些优化,这使得所谓的较慢算法比小输入大小的“更好”算法执行MUCH更快。
通过'小'输入大小可能意味着10,100或100万+!巧妙的O(n)算法和哑O(n * n)算法之间的交叉可能是巨大的,因为编译器和CPU非常适合快速运行哑代码。
许多人错误地在O()的基础上“优化”他们的代码而不考虑输入的大小,也没有测试他们将使用他们将使用的数据集的表现。
当然,这并不意味着当有更好的算法或数据结构可以在O(n)时间内完成时,你应该总是正确的代码,但它确实意味着你应该在投入工作之前仔细考虑创建一个更聪明(但难以维护)的算法,你认为它是最优的,因为它有更好的O()。