Big-O 算法阶数的正式定义中的常量 k 和 n0 是什么?

Big-O What are the constants k and n0 in the formal definition of the order of an algorithm?

在我的课本中,我看到了以下内容:

Definition of the order of an algorithm

Algorithm A is order f(n) -- denoted O(f(n)) -- if constants k and n0 exist such that A requires no more than k * f(n) time units to solve a problem of size n >= n0.


我理解: 不同复杂度的时间需求 类 以不同的速度增长。例如,随着 n 值的增加,O(n) 所需的时间比 O(n2) 增长得慢得多,后者比 O(n3), 依此类推

不明白:k和n0如何符合这个定义。

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

  2. 问题 1 已回答,'a problem of size n >= n0' 是什么意思?更大的数据集?更多的循环重复?问题规模越来越大?

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

我已经看过了:

  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?

  1. 它表示 n 的第一个值,其余值均成立(即我们只对 n 的足够高的值感兴趣)
  2. 问题大小,通常是输入的大小。
  3. 这意味着您不关心 3*n^2 和 400*n^2 之间的差异(例如),因此任何高到足以满足等式的值都可以。

所有这些条件都旨在简化 O 表示法,使简单和复杂操作之间的差异变得模糊(例如,只要数量有限,您不关心操作是 1 个还是 20 个循环)。

1) n > n0 - 意味着我们同意对于小 n A 可能需要超过 k*f(n) 次操作。例如。对于非常小的输入,冒泡排序可能比快速排序或合并排序更快。选择0作为下标完全是作者喜好

2) 更大的输入尺寸。

3) k为常数。假设一个算法对大小为 n 的输入执行 1000*n 次操作,所以它是 O(n)。另一种算法对于大小为 n 的输入需要 5*n^2 次操作。这意味着对于大小为 100 的输入,第一个算法需要 100,000 次操作,第二个算法需要 50,000 次操作。因此,对于大约 100 的输入大小,您最好选择第二个,尽管它是二次的,而第一个是线性的。在下图中,您可以看到 n0 = 200,因为只有当 n 大于 200 时,二次函数才会变得比线性函数更昂贵(这里我假设 k 等于 1)。

n 是问题的大小,但这是最好的衡量标准。因此 n0 是一个特定的常数 n,特别是关系成立的阈值。具体值与big-oh无关,只关心它的存在

k 也是一个任意常数,它的存在(结合 n0) 对于 big-oh.

很重要

自然地,人们也对较小的问题感兴趣,事实上,由于涉及常量,适用于大问题的完美算法对于小问题可能明显效率低下。