Big-O算法顺序的形式定义中常量k和n0是什么?

时间:2018-03-05 08:50:47

标签: algorithm performance big-o notation

在我的教科书中,我看到以下内容:

  

算法顺序的定义

     

算法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 如何适合这个定义。

  1. 什么是n 0 ?具体来说,为什么n有下标0,这个下标是什么意思?

  2. 回答问题1时,“n大小问题> = n 0 ”是什么意思?更大的数据集?更多循环重复?问题规模越来越大?

  3. 那么k是什么?为什么k乘以f(n)? k与增加问题大小有什么关系 - n?

  4. 我已经看过了:

    1. Big Oh Notation - formal definition

    2. Constants in the formal definition of Big O

    3. What is an easy way for finding C and N when proving the Big-Oh of an Algorithm?

    4. Confused on how to find c and k for big O notation if f(x) = x^2+2x+1

3 个答案:

答案 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)。

enter image description here

答案 1 :(得分:1)

  1. 这意味着其余成立的n的第一个值(即我们只对n足够高的值感兴趣)
  2. 问题大小,通常是输入的大小。
  3. 这意味着你不关心3 * n ^ 2和400 * n ^ 2之间的不同(例如),所以任何足以满足等式的值都可以。
  4. 所有这些条件都旨在简化O符号,使简单操作和复杂操作之间的区别变得无声(例如,只要数量有限,您就不关心操作是一个还是20个周期)。

答案 2 :(得分:1)

n 是问题的大小,但最好测量。因此, n 0 是特定常数 n ,特别是关系成立之后的阈值。具体价值与大哦无关,只对它的存在感兴趣。

k 也是一个任意常数,它的裸存在(与 n 0 一起)对于大哦很重要。

当然,人们也对较小的问题感兴趣,事实上,由于涉及的常数,对于小问题而言,对于大问题的完美算法可能是非常低效的。