我最近完成了两项关于结构类数据的测试,并且我有两次与O(n)和O(n ^ 2)错误相关的问题。我想知道我是否可以帮助理解这个问题。问题是:
假设算法A具有运行时O(n ^ 2)并且算法B具有运行时O(n)。当n = 17时,我们能说出这两种算法的运行时间吗?
a)当n = 17
时,我们不能说具体的运行时间b)算法A将比算法B运行得快得多。
c)算法A将比算法B运行更多的SLOWER
对于这两个测试,我根据https://en.wikipedia.org/wiki/Big_O_notation#Orders_of_common_functions回答了C。我知道B根据提供的链接没有任何意义。现在我开始认为它是A.我猜它的A因为n很小。如果是这种情况,我想知道什么时候n足够大,C才真实。
答案 0 :(得分:2)
这里实际上有两个问题。
第一个是你提到的那个。增长的订单是渐近的。他们只是说存在一些 n 0 ,对于任何 n> n 0 ,该函数以某种方式界定。他们对 n 的具体值没有任何说明,只有“足够大”的值。
第二个问题(你没有提到), O 是just an upper bound (as opposed to Θ),所以即使是足够大的 n 你也无法比较他们俩。因此,如果 A =√n且 B = n ,那么显然 B 比 A 增长得更快。但是, A 和 B 仍然适合这个问题,因为√n= O(n 2 )和 n = O(n)。
答案 1 :(得分:1)
答案是答案。
如果f(x)< = K * g(x)forall x>某个实数
,则函数f(x)的大哦阶是g(x)3 * n + 2的大Oh和n是O(n),因为4 * n大于所有x> 2的两个函数。因为函数的大哦符号都是相同的,我们不能说它们在同一时间运行某些值。例如,在n = 0时,第一个函数的值是2,第二个函数的值是0
因此,我们无法将两个函数的运行时间完全关联到某个值。
答案 2 :(得分:0)
答案是a):对于任何特定的数字,你不能真正说出任何具有大O符号的内容。
c的反例:B的运行时间为1000 * n(= O(n)),A的运行时间为n ^ 2。
答案 3 :(得分:0)
在进行算法分析时,特别是Big Oh,你应该只考虑输入大小趋于无穷大。如此小的尺寸(数十对数千对数百万),两者之间没有显着差异。然而,通常O(n)应该比O(n ^ 2)运行得更快,即使差异小于几毫秒。我怀疑这个问题中的关键词是多。
答案 4 :(得分:0)
我的回答是基于我在竞争性编程方面的经验,这需要对O
或称为大O的基本理解。
当你谈到哪一个更快,哪一个更慢时,当然,基本计算是这样做的。 O(n)比O(n ^ 2)快,根据最坏情况使用大哦。
现在到底发生了什么?好吧,在竞争性编程中,我们使用了10^8
拇指规则。这意味着如果算法复杂度为O(n),然后大约n = 10^8
的时间限制大约为1秒,则算法可以解决问题。
但是如果算法复杂度为O(n ^ 2)怎么办?不,那么,它需要大约(10^8)^2
,大于1秒。 (1秒计算机可以处理大约10 ^ 8的操作)。
因此,对于1秒钟,O(n ^ 2)的最大界限约为10^4
,同时O(n)最多可达10^8
。这是我们可以清楚地看到计算机上1秒钟时间内两种复杂性之间的差异。