首页 web前端 js教程 大 O 表示法:简单指南

大 O 表示法:简单指南

Oct 31, 2024 am 06:48 AM

Big O Notation: A Simple Guide

大 O 表示法是一个数学概念,用于描述算法随着输入大小的增长而在时间和空间方面的性能或复杂性。它帮助我们了解算法的运行时间如何随着输入的增加而增加,从而可以对不同算法进行更标准化的比较。

为什么使用大 O 表示法?

在比较算法时,仅依赖执行时间可能会产生误导。例如,一种算法可能会在一小时内处理大量数据集,而另一种算法可能需要四个小时。但是,执行时间可能会根据计算机和其他正在运行的进程而有所不同。相反,我们使用 Big O 表示法来关注执行的操作数量,这提供了更一致的效率衡量标准。

示例:求和

让我们探索两种计算从 1 到 n 的所有数字之和的方法:

选项 1:使用循环

function addUpTo(n) {
    let total = 0;
    for (let i = 1; i <= n; i++) {
        total += i;
    }
    return total;
}
登录后复制
登录后复制

选项 2:使用公式

function addUpTo(n) {
    return n * (n + 1) / 2;
}
登录后复制
登录后复制

分析复杂性

在选项 1 中,如果 n 为 100,则循环运行 100 次。相反,选项 2 始终执行固定数量的运算(乘法、加法和除法)。因此:

  • 选项1是O(n):时间复杂度随n线性增长。
  • 选项 2 为 O(1):无论输入大小如何,时间复杂度保持不变。

免责声明

虽然选项2涉及三种运算(乘法、加法、除法),但我们关注的是Big O分析的总体趋势。因此,我们不是将其表示为 O(3n),而是将其简化为 O(n)。同样,O(n 10) 简化为 O(n),O(n^2 5n 8) 简化为 O(n^2)。在大 O 表示法中,我们考虑最坏的情况,其中最高阶项对性能的影响最大。

除了上面列出的常见复杂度之外,还有其他形式的表示法,例如表示为 O(log n) 的对数时间复杂度。

什么是大 O 表示法?

大 O 表示法允许我们根据输入大小来形式化算法运行时间的增长。我们不关注特定的操作计数,而是将算法分为更广泛的类别,包括:

  • 恒定时间:O(1) - 算法的性能不随输入大小而变化。
  • 线性时间:O(n) - 性能随着输入大小线性增长。
  • 二次方时间:O(n^2) - 随着输入大小的增加,性能呈二次方增长。

O(n^2) 的示例

考虑以下函数,它打印从 0 到 n 的所有数字对:

function addUpTo(n) {
    let total = 0;
    for (let i = 1; i <= n; i++) {
        total += i;
    }
    return total;
}
登录后复制
登录后复制

在这种情况下,函数有两个嵌套循环,因此当 nnn 增加时,操作数量呈二次方增加。对于 n= 2,有 4 次操作,对于 n=3,有 9 次操作,导致 O(n^2)。

另一个例子:向上和向下计数

function addUpTo(n) {
    return n * (n + 1) / 2;
}
登录后复制
登录后复制

乍一看,人们可能会认为这是 O(n^2),因为它包含两个循环。然而,两个循环独立运行并随 n 线性缩放。因此,总体时间复杂度为 O(n)。

简化分析

分析代码复杂性的各个方面可能很复杂,但一些通用规则可以简化事情:

  • 算术运算被视为常数时间。
  • 变量赋值是常数时间。
  • 访问数组(通过索引)或对象(通过键)中的元素是常数时间。
  • 对于循环,复杂度是循环的长度乘以循环内部发生的事情的复杂度。

空间复杂度

虽然我们关注时间复杂度,但也可以使用 Big O 来计算空间(内存)复杂度。有些人在计算中包含输入大小,但仅关注算法所需的空间通常更有用本身。

空间复杂度规则(基于 JavaScript):

  • 大多数原始值(布尔值、数字等)都是常量空间。
  • 字符串需要 O(n) 空间(其中 n 是字符串长度)。
  • 引用类型(数组、对象)一般都是 O(n),其中 n 是数组的长度或对象中键的数量。

示例

function printAllPairs(n) {
    for (var i = 0; i < n; i++) {
        for (var j = 0; j < n; j++) {
            console.log(i, j);
        }
    }
}

登录后复制

在此函数中,空间复杂度为 O(1),因为无论输入大小如何,我们都使用恒定量的空间(两个变量)。

对于创建新数组的函数:

function countUpAndDown(n) {
    console.log("Going up!");
    for (var i = 0; i < n; i++) {
        console.log(i);
    }
    console.log("At the top!\nGoing down...");
    for (var j = n - 1; j >= 0; j--) {
        console.log(j);
    }
    console.log("Back down. Bye!");
}

登录后复制

这里,空间复杂度是 O(n),因为我们为一个新数组分配空间,该数组随着输入数组的大小而增长。

结论

Big O Notation 提供了一个框架,用于以独立于硬件和具体实现细节的方式分析算法的效率。理解这些概念对于开发高效的代码至关重要,尤其是随着数据规模的增长。通过关注性能扩展方式,开发人员可以就在其应用程序中使用哪些算法做出明智的选择。

以上是大 O 表示法:简单指南的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1665
14
CakePHP 教程
1424
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
JavaScript引擎:比较实施 JavaScript引擎:比较实施 Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

从C/C到JavaScript:所有工作方式 从C/C到JavaScript:所有工作方式 Apr 14, 2025 am 12:05 AM

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

See all articles