1 是否可能是 O(n)
Is it possible for 1 to be O(n)
我正在学习 O 表示法,我认为 1 是 O(1),因为因为 1 被认为是一个常数,所以它的大 O 将是 1。但是,我读到它可以是 O(n)以及。这怎么可能?会不会因为n=1就一样了?
实际上,Big O Notation 显示了程序复杂性(可能是时间、内存等)如何取决于问题的大小。
O(1) 表示程序复杂度与问题大小无关。例如访问数组元素。无论你选择哪个索引select,访问时间都与索引无关
O(n) 意味着程序复杂度线性取决于问题的大小。例如如果线性搜索数组中的元素,则需要遍历数组的大部分元素。在最坏的情况下,如果元素不存在于数组中,您将遍历整个数组。
如果我们增加数组的大小,即复杂度,时间复杂度会有所不同,即如果我们遍历 100 个元素,则执行时间将比仅遍历 10 个元素时花费更多时间。
希望对您有所帮助。
是的,一个复杂度为 O(1) 的函数也是复杂度 O(n) —— 复杂度为 O(n2),复杂度为 O(en), 等等。 (从数学上讲,您可以将 1
视为一个始终具有相同值的函数。)
如果你看一下大 O 表示法的 formal definition,你会看到(粗略地说)函数 f(x) 是 O(g(x)) 如果 g(x) 超过 f(x) 至少某个常数因子随着 x 趋于无穷大。引用链接文章:
Let f and g be two functions defined on some subset of the real
numbers. One writes
*f(x)=O(g(x)) as x --> ∞
if and only if there is a positive
constant M such that for all sufficiently large values of x, the
absolute value of f(x) is at most M multiplied by the absolute value
of g(x). That is, f(x) = O(g(x)) if and only if there exists a
positive real number M and a real number x0 such that
*|f(x)| ≤ M |g(x)| for all x ≥ *x0.
但是,我们很少说 O(1) 函数或算法是 O(n),因为说它是 O(n) 是误导性的,并没有表达为很多信息。比如我们说Quicksort算法是O(n log n),Bubblesort是O(n2)。严格来说,Quicksort 也是 O(n2),但这么说是没有意义的——主要是因为很多人不熟悉 Big- O 表示法。
还有另一种称为 Big Theta (Θ) 的符号,它应用更严格的界限。
大 O 表示法是一种数学方法,用于解释函数在接近某个点或无穷大时的行为。这是计算机科学中用于分析算法复杂性的工具。算法的复杂性可以帮助您分析您的算法是否适合您的情况并在合理的时间内处理您的逻辑。
但这并没有回答你的问题。如果 n
等于 1
的问题在大 O 表示法中没有意义。顾名思义,它是一种符号,而不是数学中的一种计算方式。大 O 表示法意味着评估该算法接近无限的行为,以判断算法的哪一部分最重要。例如,如果算法的行为可以用函数 2x^2 + 3x
表示,Big O 表示法表示取该函数的每个部分并对其求值接近无穷大,然后取最重要的函数。因此,通过评估 2x^2
和 3x
,我们将看到 2x^2
将是一个比 3x
更大的无穷大。 x^2
和 3x
之间的差异也是无限的。因此,如果我们消除系数(不是函数的变量部分),我们将有两个复杂度:O(x^2)
和 O(x)
,因此 O(n^2)
和 O(n)
。但我们知道最重要的是 O(n^2)
.
如果在代码的一部分中有两个复杂度 O(1)
和 O(n)
也是一样的,O(n)
将是您的算法复杂度。
但是如果 O(n)
复杂度只处理一个元素,则行为将等同于 O(1)
。但这并不意味着您的算法具有 O(1)
复杂性。
我正在学习 O 表示法,我认为 1 是 O(1),因为因为 1 被认为是一个常数,所以它的大 O 将是 1。但是,我读到它可以是 O(n)以及。这怎么可能?会不会因为n=1就一样了?
实际上,Big O Notation 显示了程序复杂性(可能是时间、内存等)如何取决于问题的大小。
O(1) 表示程序复杂度与问题大小无关。例如访问数组元素。无论你选择哪个索引select,访问时间都与索引无关
O(n) 意味着程序复杂度线性取决于问题的大小。例如如果线性搜索数组中的元素,则需要遍历数组的大部分元素。在最坏的情况下,如果元素不存在于数组中,您将遍历整个数组。
如果我们增加数组的大小,即复杂度,时间复杂度会有所不同,即如果我们遍历 100 个元素,则执行时间将比仅遍历 10 个元素时花费更多时间。
希望对您有所帮助。
是的,一个复杂度为 O(1) 的函数也是复杂度 O(n) —— 复杂度为 O(n2),复杂度为 O(en), 等等。 (从数学上讲,您可以将 1
视为一个始终具有相同值的函数。)
如果你看一下大 O 表示法的 formal definition,你会看到(粗略地说)函数 f(x) 是 O(g(x)) 如果 g(x) 超过 f(x) 至少某个常数因子随着 x 趋于无穷大。引用链接文章:
Let f and g be two functions defined on some subset of the real numbers. One writes
*f(x)=O(g(x)) as x --> ∞
if and only if there is a positive constant M such that for all sufficiently large values of x, the absolute value of f(x) is at most M multiplied by the absolute value of g(x). That is, f(x) = O(g(x)) if and only if there exists a positive real number M and a real number x0 such that
*|f(x)| ≤ M |g(x)| for all x ≥ *x0.
但是,我们很少说 O(1) 函数或算法是 O(n),因为说它是 O(n) 是误导性的,并没有表达为很多信息。比如我们说Quicksort算法是O(n log n),Bubblesort是O(n2)。严格来说,Quicksort 也是 O(n2),但这么说是没有意义的——主要是因为很多人不熟悉 Big- O 表示法。
还有另一种称为 Big Theta (Θ) 的符号,它应用更严格的界限。
大 O 表示法是一种数学方法,用于解释函数在接近某个点或无穷大时的行为。这是计算机科学中用于分析算法复杂性的工具。算法的复杂性可以帮助您分析您的算法是否适合您的情况并在合理的时间内处理您的逻辑。
但这并没有回答你的问题。如果 n
等于 1
的问题在大 O 表示法中没有意义。顾名思义,它是一种符号,而不是数学中的一种计算方式。大 O 表示法意味着评估该算法接近无限的行为,以判断算法的哪一部分最重要。例如,如果算法的行为可以用函数 2x^2 + 3x
表示,Big O 表示法表示取该函数的每个部分并对其求值接近无穷大,然后取最重要的函数。因此,通过评估 2x^2
和 3x
,我们将看到 2x^2
将是一个比 3x
更大的无穷大。 x^2
和 3x
之间的差异也是无限的。因此,如果我们消除系数(不是函数的变量部分),我们将有两个复杂度:O(x^2)
和 O(x)
,因此 O(n^2)
和 O(n)
。但我们知道最重要的是 O(n^2)
.
如果在代码的一部分中有两个复杂度 O(1)
和 O(n)
也是一样的,O(n)
将是您的算法复杂度。
但是如果 O(n)
复杂度只处理一个元素,则行为将等同于 O(1)
。但这并不意味着您的算法具有 O(1)
复杂性。