Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
DSA 与 JS:用 JavaScript 解释大 O 表示法_创想鸟

DSA 与 JS:用 JavaScript 解释大 O 表示法

dsa 与 js:用 javascript 解释大 o 表示法

废话不多说,我们直接进入正题吧。什么是大 o 表示法以及它的用途是什么?明确的答案是 big o 表示法是一种描述算法性能如何随着输入大小的增长而变化的方法。它可以帮助您了解处理越来越大的数据量时代码的速度有多快或多慢。

简单来说,big o 会告诉您最坏的情况,即随着输入变大,代码将花费多长时间或需要多少空间。

有不同类型或种类的 big o 符号来描述算法随着输入大小的增长而表现如何。这些不同的符号代表不同的效率或性能水平。每种类型都会告诉您算法根据输入大小需要多少时间或空间。

一些常见的 o 符号

o(1) – 恒定时间

当一个操作需要相同的时间来完成时,无论输入的大小如何,它都被视为o(1)。这意味着无论您处理的数据有多大或多小,执行操作的时间都是恒定的,并且不会随着输入的增长而增加。

立即学习“Java免费学习笔记(深入)”;

示例 1:访问数组元素

let numbers = [10, 20, 30, 40, 50];// if you want to access an element at a specific index, like:let num = numbers[2]; // this will give you 30

无论数组有多大,此操作将始终花费相同的时间。无论数组有 5 个元素还是 500 万个元素,直接访问 numbers[2] 的时间总是o(1),因为您只是使用其索引获取一个值。

示例 2:赋值

let a = 10;

示例 3:检查数字是否为偶数

function iseven(number) {  return number % 2 === 0;}

无论数字有多大,该函数的运行时间都是相同的。所以,这也是 o(1).

o(n) – 线性时间

在o(n)中,完成操作所需的时间随着输入的大小直接增加。如果输入加倍,执行操作所需的时间也会加倍。发生这种情况是因为算法需要处理输入中的每一项逐一。

示例 1:循环数组

假设您有一个数组,并且想要打印其中的每个元素。所需的时间取决于数组中有多少元素。这是一个简单的例子:

let numbers = [10, 20, 30, 40, 50];for (let i = 0; i < numbers.length; i++) {  console.log(numbers[i]);}

在此示例中:

如果数组有 5 个元素,则循环将运行 5 次。

如果数组有 100 个元素,则循环将运行 100 次。

如果数组有 n 个元素,则循环将运行 n 次。

示例 2:在数组中搜索值

假设你想查找数组中是否存在特定值:

function findvalue(arr, target) {  for (let i = 0; i < arr.length; i++) {    if (arr[i] === target) {      return true;    }  }  return false;}

在此示例中:

如果数组有 10 个元素,循环可能会运行最多 10 次来查找值。

如果数组有 1,000 个元素,则循环可能最多运行 1,000 次。

对于 n 个元素,在最坏的情况下循环可能会运行 n 次。

因此,数组越大,检查每个元素所需的时间就越长,使其o(n)。

o(n²) – 二次时间

o(n²) 表示完成算法所需的时间随着输入大小的增加呈指数级增加。具体来说,如果输入大小加倍,则所需时间会增加四倍(因为 2² = 4)。如果输入增加三倍,时间就会增加 九倍(因为 3² = 9)。

当您有嵌套循环时,通常会发生这种情况,其中一个循环迭代输入,然后在该循​​环内,另一个循环也迭代相同的输入。

数组上的嵌套循环: 假设您有一个数组,并且您想要将每个元素与数组中的每个其他元素进行比较。这是一个例子:

let numbers = [10, 20, 30, 40, 50];for (let i = 0; i < numbers.length; i++) {  for (let j = 0; j < numbers.length; j++) {    console.log(numbers[i], numbers[j]);  }}

这是发生的事情:

外循环运行n次(其中n是数组的长度)。

对于外循环的每次迭代,内循环也运行n次。

因此,对于数组中的每个项目,您都会再次循环遍历每个项目。如果数组有 5 个元素,则 5 次外循环迭代中的每一次内循环都会运行 5 次,使其总共运行 25 次 (5 × 5 = 25)。

这使得时间复杂度 o(n²),因为对于 n 个元素,您正在执行 n × n 操作。

o(n²) 总结: 当您有嵌套循环时,就会发生 o(n²),其中两个循环都迭代相同的输入。所花费的时间随着输入的大小呈二次方增长。与 o(n) 和 o(log n) 相比,它的速度较慢,因为随着输入大小的增加,操作数量增长得更快。

二次时间在冒泡排序等算法或需要比较数据集中每对项目的问题中很常见。

o(log n) – 对数时间

我认为这个需要更多的关注和仔细来掌握这个概念。

在 o(log n) 中,时间 随着输入大小的增大而增加,但与其他时间复杂度(如 o( n) 或 o(n²).

这里是关键思想: 在 o(log n) 算法中,每一步都会显着减少问题大小(通常减少一半),这意味着随着输入变大,所需的额外步骤数量不会增加太多。事实上,它对数增长,意味着增长非常缓慢。

比较 o(n) 和 o(log n)

o(n) – 线性时间:

如果您有 10 件商品,则可能需要 10 个步骤。

如果您有 100 个项目,则需要 100 个步骤。

如果您有 1,000 个项目,则需要 1,000 个步骤。

这里,时间随着输入大小直接增长。

o(log n) – 对数时间:

如果您有 10 个项目,则可能需要大约 4 个步骤(因为 log 2(10) ≈ 4)。

如果您有 100 个项目,则只需要大约 7 个步骤(因为 log 2(100) ≈ 7)。

如果您有 1,000 个项目,则只需要大约 10 个步骤(因为 log2(1,000) ≈ 10)。

尽管输入增长很多(从 10 到 1,000),步数(“时间”)仅略有增加(从 4 步到 10 步)。

二分查找

o(log n) 的一个经典示例是 二分搜索。假设您有一个已排序的数组,并且您想要查找数组中是否存在目标数字。您可以在每一步将搜索空间减半,而不是一一检查每个数字(这将是 o(n))。

这是二分搜索的示例:

function binarySearch(arr, target) {  let left = 0;  let right = arr.length - 1;  while (left <= right) {    let mid = Math.floor((left + right) / 2);    if (arr[mid] === target) {      return mid;    } else if (arr[mid] < target) {      left = mid + 1; // Search the right half    } else {      right = mid - 1; // Search the left half    }  }  return -1; // Target not found}

运作原理:

首先将数组的中间元素与目标进行比较。

如果中间元素是目标,则完成。

如果中间元素小于目标,则丢弃数组的左半部分并仅在右半部分搜索。

如果中间元素较大,则丢弃右半部分并在左半部分搜索。

每次,您都会将数组切成两半。

最后的话

大 o 表示法 用于描述算法的时间或空间复杂度如何随着输入大小的增长而变化。它为我们提供了一种讨论算法效率的方法,特别是当输入变大时。 big o 专注于最坏情况,帮助我们了解算法性能的上限。

以上就是DSA 与 JS:用 JavaScript 解释大 O 表示法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491596.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
掌握 JavaScript 比较:从基础到高级
上一篇 2025年12月19日 14:06:10
JavaScript 中的交互:“警报”、“提示”和“确认”
下一篇 2025年12月19日 14:06:26

相关推荐

  • PHP一键环境如何配置URL重写_URL Rewrite规则设置

    开启Apache的mod_rewrite模块并配置AllowOverride All,再在.htaccess中添加重写规则,即可实现URL重写,使URL更简洁利于SEO。 在使用PHP一键环境(如XAMPP、WAMP、phpStudy等)时,开启URL重写(URL Rewrite)功能可以让网站的U…

    2026年9月21日
    100
  • MySQL常见错误码代表什么_如何快速定位问题?

    MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?MySQL常见错误码代表什么_如何快速定位问题?

    遇到mysql错误码应先明确错误类型再逐步排查。error 1045表示用户名、密码或访问权限问题,需检查拼写、ip限制和远程访问权限;error 2003表示连接失败,需依次检查服务器状态、mysql服务运行情况、防火墙设置及bind-address配置;error 1054表示sql语句中引用了…

    2026年9月21日 • 用户投稿
    100
  • HuggingFace的AI混合工具如何使用?开发AI模型的实用操作教程

    HuggingFace的AI混合工具核心在于其生态系统设计,通过Transformers库的统一接口、Pipelines的抽象封装、Datasets与Accelerate等工具,实现多模型组合与微调。它允许开发者将复杂任务拆解,利用预训练模型如BERT、T5等,通过Python逻辑串联不同Pipel…

    2026年9月21日
    1000
  • 使用EventBus实现Android实时速度显示与后台保存教程

    本教程详细介绍了如何在Android应用中实现实时速度的显示与后台保存功能。通过利用前台服务(Foreground Service)获取位置数据,并结合EventBus库实现服务与UI界面(MainActivity)之间的实时数据通信,确保即使应用处于后台或屏幕关闭时,速度数据也能持续更新并显示在用…

    2026年9月21日
    000
  • PHP面向对象编程:解决父类构造器传递值在子对象方法中为空的问题

    本文探讨了PHP中一个常见的面向对象编程问题:当父类构造器接收并初始化一个子对象时,如何确保该子对象内部的方法能正确访问到父类传递的值,避免出现null。文章将通过示例代码,详细介绍两种核心解决方案:通过控制器提供内部对象的访问器(Getter),以及采用依赖注入(Dependency Inject…

    2026年9月21日
    400
  • 构建与调试PHP简易路由系统:从原理到实践

    本文将指导您如何从零开始构建一个基础的PHP路由系统,实现URL到控制器和方法的映射。我们将深入探讨$_SERVER[‘REQUEST_URI’]的解析、控制器文件的动态加载、方法调用以及如何通过.htaccess进行URL重写。同时,文章还将详细讲解常见的“未定义变量”错误…

    2026年9月21日
    200
  • PHP框架中间件有什么用处_PHP框架中间件设计与实现

    PHP框架中间件是处理请求和响应的过滤器,用于实现身份验证、日志记录、CORS等通用逻辑,核心价值在于解耦和提升可维护性。通过定义中间件接口、具体中间件类及管道调度器可实现自定义中间件,如身份验证或CORS处理。在Laravel中可通过Kernel.php配置全局、分组或路由级中间件,执行顺序按注册…

    2026年9月21日
    100
  • Linux如何设置目录的执行权限

    目录的执行权限是访问其内容的“钥匙”,使用chmod命令可通过符号或八进制模式设置,常见权限为755(所有者rwx,组和其他用户rx),递归设置时推荐结合find命令分别处理文件和目录,避免误加执行权限。 在Linux中,设置目录的执行权限( x )并非意味着你可以“运行”这个目录,而是赋予了你进入…

    2026年9月21日
    100
  • 如何在Java中配置与数据库连接环境

    答案:Java中配置数据库连接需引入JDBC驱动,如MySQL在Maven中添加对应依赖;通过DriverManager或连接池(如HikariCP)获取Connection,使用try-with-resources管理资源;建议将连接参数存入properties文件,并处理常见问题如驱动加载、权限…

    2026年9月21日
    000
  • Linux查看系统日志的常用命令

    答案是查看Linux日志需综合使用journalctl、dmesg、tail、grep等工具。journalctl用于systemd系统集中查询服务及内核日志,支持时间、优先级、字段等多维度过滤;dmesg专注内核启动与硬件问题;tail -f实时监控日志动态;cat、grep、less结合正则和管…

    用户投稿 2026年9月21日
    000
  • PHP简易路由框架构建:从URL解析到动态控制器加载的实践指南

    本文旨在指导读者构建一个基础的PHP路由系统,实现URL路径到控制器方法的高效映射。内容涵盖URL解析、控制器动态加载、方法调用以及关键的错误处理机制,特别强调如何避免常见的“未定义变量”错误和文件包含路径问题,确保路由系统稳定且易于维护。 一、路由系统核心原理 构建一个简单的php路由系统,其核心…

    2026年9月21日
    200
  • windows怎么禁用sticky keys粘滞键_Windows粘滞键关闭方法

    粘滞键被误触后可通过快捷键、控制面板、注册表或组策略关闭。首先连续按Shift键五次,在弹出窗口中选择关闭;其次通过控制面板的“轻松使用”设置取消勾选启用粘滞键;若需彻底禁用,可修改注册表中StickyKeys项的Flags值为506;专业版用户还可通过组策略编辑器将“启用粘滞键”设为已禁用,防止再…

    2026年9月21日
    1000
  • ThinkPHP生产环境部署的注意事项

    在生产环境中部署thinkphp应用需要注意以下几点:1.确保服务器环境满足thinkphp要求,使用php 7.2+和支持的web服务器;2.配置php.ini和application/config.php文件,关闭调试模式,设置合适的日志级别和数据库连接;3.采取安全措施,保护应用目录结构,使用…

    2026年9月21日
    200
  • 如何模拟用户登录状态进行测试?

    模拟用户登录状态是为了测试系统功能和安全性。1.在开发初期帮助发现和修复问题。2.测试不同用户权限下的功能访问。方法包括:1.直接操作session或cookie。2.使用测试框架如junit或testng。3.模拟api请求。 模拟用户登录状态进行测试是确保软件系统用户体验和安全性的关键步骤。无论…

    2026年9月21日
    300
  • Linux系统信息查看命令整理

    答案:掌握Linux系统需从系统信息、资源使用、性能瓶颈、日志分析和用户权限五方面入手。uname、lscpu、free、df、ip、ss等命令用于查看系统软硬件状态;top、htop、vmstat、iostat、iftop等可诊断CPU、内存、磁盘、网络性能瓶颈;/var/log日志文件结合jou…

    2026年9月20日
    100
  • Java从文本文件随机读取多行连续内容的教程

    本教程旨在指导java开发者如何高效地从文本文件中随机读取并打印指定数量(例如5行)的连续内容,尤其适用于处理结构化文本块(如诗歌)。我们将探讨如何避免仅读取文件开头固定行数的局限,通过将文件内容一次性加载到内存并结合随机数生成器来精确选取所需的文本块,从而实现真正的随机性与灵活性。 引言与问题分析…

    2026年9月20日
    200
  • JAXB中动态获取Java对象QName并创建JAXBElement的反射策略

    本文探讨了在jaxb中,当`jaxbintrospector.getelementname`无法获取java对象对应的`qname`时,如何通过反射机制调用`objectfactory`中生成的`create`方法来动态创建`jaxbelement`。该方法避免了大量类型判断,提高了代码的灵活性和可…

    2026年9月20日
    100
  • Windows11的SFC /SCANNOW命令无法修复系统文件怎么办_Windows11SFC无法修复系统文件修复方法

    先使用DISM工具修复系统映像,再运行SFC扫描。若失败,可指定外部安装源、手动替换损坏文件或使用安装媒体进行离线修复,确保系统文件完整性。 如果您在Windows 11中运行sfc /scannow命令后,发现系统提示“Windows 资源保护找到了损坏文件,但其中有一些文件无法修复”,这通常意味…

    2026年9月20日
    000
  • 如何在Laravel中实现数据导出

    在laravel中实现数据导出,核心思路是根据具体需求选择合适方法。1. 使用maatwebsite/laravel-excel处理excel或csv导出;2. 通过队列优化大量数据导出性能;3. 结合分块读取降低内存占用;4. 利用lazy collections控制内存使用;5. 支持多种格式如…

    2026年9月20日
    000
  • mysql如何解决连接本地数据库失败的问题

    连接本地MySQL数据库失败通常由服务未启动、连接参数错误、用户权限不足或防火墙阻止引起。首先确认MySQL服务是否运行,Windows可通过“服务”管理器查看,Linux/macOS使用systemctl或brew命令;若服务未启动,尝试手动启动并检查日志。其次核对连接参数:主机应为localho…

    2026年9月20日
    000

发表回复

登录后才能评论
关注微信