大 O 表示法初学指南

作者: 极小光 | 来源:发表于2018-11-29 10:17 被阅读24次

简评:任何读过「编程珠玑」或任何其他计算机科学书籍的人都会遇到涉及O(N log N)或其他看似奇怪的语法的章节,本文将帮助了解大 O 的基础知识。

大 O 表示法用来在计算机科学中描述算法的性能或复杂性,大 O 具体描述了最坏的情况,并且可以描述算法所需的执行时间或所使用的空间(内存或磁盘)。

作为程序员和数学家,我发现了彻底理解大 O 的最好方法是在代码中生成一些例子,下面是一些常见的增长顺序以及可能的描述和示例。

O(1)

O(1) 描述了一种无论输入数据集的大小如何总是在相同的时间(或空间)内运行的算法。

bool IsFirstElementNull(IList<String> elements)
{
    return elements[0] == null;
}

O(N)

O(N) 描述了一种性能线性增长并且与输入数据集的大小成正比的算法。下面的示例还演示了大 O 如何支持最坏情况的性能方案,在循环的任何一个迭代期间都可以找到匹配的字符串,并且函数将提前返回,但是大 O 表示法将始终假定算法将执行最大的迭代次数。

bool ContainsValue(IEnumerable<string> elements, string value)
{
    foreach (var element in elements)
    {
        if (element == value) return true; 
    } 
    return false; 
}

O(N²)

O(N²) 表示一种性能与输入数据集大小的平方成正比的算法,常见于涉及数据集嵌套迭代的算法中。更深的嵌套迭代将导致 O(N³)、O(N⁴) 等。

bool ContainsDuplicates(IList<string> elements)
{
    for (var outer = 0; outer < elements.Count; outer++) 
    {
        for (var inner = 0; inner < elements.Count; inner++) 
        { 
            // Don't compare with self 
            if (outer == inner) continue; 
            if (elements[outer] == elements[inner]) return true; 
        }
    }
    return false;
}

O(2^N)

O(2^N) 表示一种随着对输入数据集的每次加法而增长加倍的算法。O(2^N) 函数的增长曲线是指数 —— 从非常小的开始,然后是急剧上升。O(2^N) 函数的一个例子是 Fibonacci 数的递归计算:

int Fibonacci(int number)
{
    if (number <= 1) return number;
    return Fibonacci(number - 2) + Fibonacci(number - 1); 
}

希望这有助于消除围绕大 O 符号和许多常见增长函数的一些谜团,在处理需要大规模操作的算法时,掌握大 O 是一个重要的工具,允许在处理不同的数据集时做出正确的选择。


原文链接:A beginner's guide to Big O notation
推荐阅读:给 console 添加颜色

相关文章

  • 大 O 表示法初学指南

    简评:任何读过「编程珠玑」或任何其他计算机科学书籍的人都会遇到涉及O(N log N)或其他看似奇怪的语法的章节,...

  • 大O表示法

    讨论算法必提到O(),不太懂,尝试理解一下。 大O表示法 描述算法的性能和复杂度。常用O表示。一般考虑为cpu时间...

  • 大O表示法

    算法的速度指的并非时间,而是操作数的增速。 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度...

  • 大O表示法

    大O表示法 是一种特殊的表示法,指出了算法的速度有多快。大O表示法指出了算法有多快。例如,假设列表包含n 个元素。...

  • 大O表示法

    时间复杂度 衡量一个算法可以从占用的空间和时间来评价其是否是一个更好的算法。这里主要从时间方面衡量。时间复杂度,可...

  • 大 O 表示法

    大 O 表示法是一种特殊的表示法,指出了算法的速度有多快。 在我们的日常工作中,基本都是使用其他人编写好的算法,基...

  • 大O表示法

    概念 一般用大O表示法来描述复杂度,它表示的是数据规模n 对应的复杂度。 举个例子: 解析: O(1)O(1)表示...

  • 大O表示法

    一、简介 表示时间的大O符号,是用来描述算法效率的语言和度量单位。大O表示法分析了算法的运行时间如何随列表的增长而...

  • 算法复杂度

    一、大O表示法 算法的时间复杂度通常用大O符号表述 大O表示法 : ,n为算法所需要执行的操作数 该表示法的操作数...

  • 算法学习——复杂度

    一、大O表示法(Big O) 一般用大 O 表示法来描述复杂度,它表示的是数据规模 n 对应的复杂度。 忽略常数、...

网友评论

    本文标题:大 O 表示法初学指南

    本文链接:https://www.haomeiwen.com/subject/mntgqqtx.html