Algorithm 复杂性符号是如何处理预计算的?

Algorithm 复杂性符号是如何处理预计算的?,algorithm,time-complexity,Algorithm,Time Complexity,假设我有一个算法,对于大小为n的每个输入都以O(n)的形式运行,但只在给定大小n的预计算步骤O(n^2)之后运行。该算法是否仍被视为O(n),O(n^2)已摊销?或者大O只考虑在n的算法中的一个“run”,因此预计算步骤被包含在符号中,使得真正的记号O(n+n ^ 2)或O(n ^ 2)</p>< p>人们通常关心在讨论复杂性等时完成事情的总时间。 因此,如果要得到结果R需要执行步骤A和B,那么complexity(R)=complexity(A)+complexity(B)。在您的特定示例中,

假设我有一个算法,对于大小为n的每个输入都以O(n)的形式运行,但只在给定大小n的预计算步骤O(n^2)之后运行。该算法是否仍被视为O(n),O(n^2)已摊销?或者大O只考虑在n的算法中的一个“run”,因此预计算步骤被包含在符号中,使得真正的记号O(n+n ^ 2)或O(n ^ 2)</p>< p>人们通常关心在讨论复杂性等时完成事情的总时间。 因此,如果要得到结果
R
需要执行步骤A和B,那么
complexity(R)=complexity(A)+complexity(B)
。在您的特定示例中,这是
O(n^2)

您已经注意到,对于
O
分析,增长最快的项支配着总体复杂性(或者换句话说,在管道中,最慢的模块定义吞吐量)

然而,如果
A
B
是不相交的,则它们的复杂性分析通常会单独执行

总之,重要的是获得结果所花费的时间,但是您可以(通常也可以)独立地对各个步骤进行推理



在某些情况下,您不能仅指定管道的最慢部分。一个简单的例子是BFS,其复杂性为
O(V+E)
。由于
E=O(V^2)
,将BFS的复杂性写成
O(E)
(因为
E>V
)。但是,这是不正确的,因为可能存在一个没有边的图!在这些情况下,您仍然需要迭代所有顶点。

通过将成本明确划分为两个不同的部分来解释这一点并不少见。例如,在美国,人们谈论诸如&langle;O(n2)、O(1)和rangle-问题的时间解,其中O(n2)表示预计算成本,O(1)表示查找成本。您有时也会在字符串算法中看到这一点:a,while

这样做的原因是这里涉及的权衡实际上取决于用例。它可以让您定量地衡量在预处理时间开始变得值得之前必须进行多少查询。

O(…)表示法的目的不是衡量算法的运行速度,因为在许多特定情况下,O(n)可能比O(n^3)慢得多。(想象一下以10^100 n步运行的算法与以n^3/2步运行的算法相比。)如果我告诉你我的算法以O(n^2)时间运行,它不会告诉你n=1000需要多长时间

O(…)的要点是指定当输入大小增加时算法的行为。如果我告诉你,我的算法在O(n^2)时间内运行,运行n=500需要1秒,那么对于n=1000,你会期望4秒,而不是1.5秒,也不是40秒


因此,为了回答您的问题--不,算法不是O(n),而是O(n^2),因为如果我将输入大小加倍,时间将乘以4,而不是2。

这是一个更适合exchange站点的理论问题。将在此处发布,谢谢。