我更喜欢尽可能少的正式定义和简单的数学。


当前回答

大 O 是算法使用时间/空间的尺寸,与其输入的尺寸相比。

如果一个算法是O(n),那么时间/空间将与其输入相同的速度增加。

如果一个算法是O(n2)则时间/空间增加以其输入的速度为方形。

等等等。

其他回答

假设我们正在谈论一个算法A,该算法应该做一些与数据集的尺寸n。

然后 O( <某些表达式 X 涉及 n> ) 意思,在简单的英语:

如果您在执行 A 时不幸,可能需要尽可能多的 X(n) 操作完成。

正如发生的那样,有某些功能(想想它们作为X(n))的实施,这些功能往往很常见,这些功能是众所周知的,易于比较的(例子:1、Log N、N、N^2、N!等)。

比较这些,当谈到A和其他算法时,很容易根据他们可能需要完成的操作数量排序算法。

总的来说,我们的目标将是找到或结构一个算法A,以便它有一个函数X(n)返回尽可能低的数字。

什么是“大O”笔记的明确英语解释?

我想强调“大O”评分的驱动动力是一件事,当算法的输入尺寸变得太大时,算法的某些部分(即恒数、比例、术语)的方程式描述算法的尺寸变得如此无意义,以至于我们忽略它们。

因此,如果输入尺寸不太大,那么“大O”评分(上限)的想法将毫无意义。


Lets say you want to quantify the performance of the following algorithm
int sumArray (int[] nums){
    int sum=0;   // here we've 1 operation
    for(int i=0; i < nums.length;i++){   // we've n times
        sum += nums[i]; // taking initialization and assignments, 3 ops
    }
    return sum;
}

在上面的算法中,让我们说你发现T(n)如下(时间复杂性):

T(n) = 3*n + 2

n= 1,000,000   -> T(1,000,000) = 3,000,002
n=1,000,000,000  -> T(1,000,000,000) = 3,000,000,002
n=10,000,000,000  -> T(10,000,000,000) = 30,000,000,002

将此类输入给另一个函数 F(n) = n

n= 1,000,000   -> F(1,000,000) = 1,000,000 
n=1,000,000,000  -> F(1,000,000,000) = 1,000,000,000
n=10,000,000,000  -> F(10,000,000,000) = 10,000,000,000

因为你可以看到输入尺寸变得太大,T(n)大约相当于或接近F(n),所以连续2和比例3变得太不重要,现在大O“评级的想法来了,

O(T(n)) = F(n)
O(T(n)) = n

大 O 评分最常被编程者用作计算(算法)将需要多长时间完成的约定测量,表达为输入组的尺寸的函数。

在许多情况下,一个算法的“O”将落入下列情况之一:

O(1) - 完成时间是相同的,无论输入组的尺寸. 一个例子是通过指数访问一个序列元素. O(Log N) - 完成时间增加大约与 log2(n)相匹配。 例如, 1024 个元素需要大约两倍的长度为 32 个元素,因为 Log2(1024) = 10 和 Log2(32) = 5. 一个例子是找到一个元素在二进制搜索树(BST)。

大 O 忽略了没有有意义的因素,因为输入尺寸向无限增加,而函数的增长曲线,这意味着由函数添加或加倍的恒数只是被忽略。

1(一) :

这种复杂性与O(1)相同,除非它只是稍微糟糕一点,对于所有实用目的,你可以把它视为一个非常大的连续规模。

和(n):

O(n log n):

O(n2):

它作为一个平方,在那里 n 是平方侧的长度. 这是与“网络效应”相同的增长率,在那里网络中的每个人都可以知道网络中的每个人. 增长是昂贵的. 大多数可扩展的解决方案不能使用这个复杂度的算法,而不做显著的体操。

二(二) :

算法例(Java):

public boolean search(/* for */Integer K,/* in */List</* of */Integer> L)
{
    for(/* each */Integer i:/* in */L)
    {
        if(i == K)
        {
            return true;
        }
    }
    
    return false;
}

算法描述:

这个算法搜索一个列表,项目按项目,寻找一个密钥,在列表中的每个项目,如果它是密钥,然后返回真实,如果循环没有找到密钥,返回虚假。

Big-O 评分代表了复杂性(时间、空间等)的顶端。

要找到 The Big-O on Time Complexity:

计算时间(考虑到输入大小)最糟糕的案例需要: 最糟糕的案例: 关键不在列表中 时间(Worst-Case) = 4n+1 时间: O(4n+1) = O(n) <unk>在大O,恒例被忽视 O(n) ~ 线性

还有大欧米加,它代表了最佳案例的复杂性:

最佳案例:关键是第一个项目 时间(最佳案例) = 4 时间: Ω(4) = O(1) ~ Instant\Constant