在我的教科书中,我看到以下内容:
算法顺序的定义
算法A是阶数f(n) - 表示为O(f(n)) - 如果存在常数k和n 0 ,则A要求不超过k * f(n)时间单位解决大小问题n> = n 0 。
我理解:不同复杂性类的时间要求以不同的速度增长。例如,随着n值的增加,O(n)所需的时间比O(n 2 )生长得慢得多,后者的生长速度比O(n 3 ),等等。
我不明白: k和n 0 如何适合这个定义。
什么是n 0 ?具体来说,为什么n有下标0,这个下标是什么意思?
回答问题1时,“n大小问题> = n 0 ”是什么意思?更大的数据集?更多循环重复?问题规模越来越大?
那么k是什么?为什么k乘以f(n)? k与增加问题大小有什么关系 - n?
我已经看过了:
答案 0 :(得分:3)
1)n> n 0 - 意味着我们同意对于小n A可能需要多于k * f(n)次运算。例如。对于非常小的输入,冒泡排序可能比快速排序或合并排序更快。选择0作为下标完全取决于作者的偏好。
2)输入尺寸更大。
3)k是常数。假设一个算法对大小为n的输入执行1000 * n运算,因此它是O(n)。另一种算法需要5 * n ^ 2次操作来输入大小为n。这意味着对于大小为100的输入,第一个算法需要100,000个操作,第二个算法需要50,000个操作。因此,对于大约100的输入大小,你最好选择第二个,虽然它是二次的,第一个是线性的。在下图中你可以看到n 0 = 200,因为只有n大于200的二次函数变得比线性更昂贵(这里我假设k等于1)。
答案 1 :(得分:1)
所有这些条件都旨在简化O符号,使简单操作和复杂操作之间的区别变得无声(例如,只要数量有限,您就不关心操作是一个还是20个周期)。
答案 2 :(得分:1)
n 是问题的大小,但最好测量。因此, n 0 是特定常数 n ,特别是关系成立之后的阈值。具体价值与大哦无关,只对它的存在感兴趣。
k 也是一个任意常数,它的裸存在(与 n 0 一起)对于大哦很重要。
当然,人们也对较小的问题感兴趣,事实上,由于涉及的常数,对于小问题而言,对于大问题的完美算法可能是非常低效的。