JavaScript 数组的 Big O

2023-11-25

JavaScript 中的数组很容易通过添加和删除项目来修改。它在某种程度上掩盖了这样一个事实:大多数语言数组都是固定大小的,并且需要复杂的操作来调整大小。 JavaScript 似乎可以很容易地编写出性能不佳的数组代码。这就引出了一个问题:

在数组性能方面,我可以从 JavaScript 实现中获得什么性能(就大 O 时间复杂度而言)?

我假设所有合理的 JavaScript 实现最多有以下几个大 O。

  • 访问 - O(1)
  • 追加 - O(n)
  • 前置 - O(n)
  • 插入 - O(n)
  • 删除 - O(n)
  • 交换 - O(1)

JavaScript 允许您使用以下方法将数组预填充到特定大小new Array(length)句法。 (额外问题:以这种方式创建数组是 O(1) 还是 O(n))这更像是传统数组,如果用作预先确定大小的数组,则可以允许 O(1) 追加。如果添加循环缓冲区逻辑,则可以实现 O(1) 前置。如果使用动态扩展数组,则 O(log n) 将是这两种情况的平均情况。

我可以期望某些事情的表现比我在这里的假设更好吗?我不希望任何规范中概述任何内容,但实际上,所有主要实现都可能在幕后使用优化的数组。是否有动态扩展数组或其他一些性能提升算法在起作用?

P.S.

我想知道这一点的原因是我正在研究一些排序算法,其中大多数在描述其整体大 O 时似乎假设附加和删除是 O(1) 操作。


NOTE: While this answer was correct in 2012, engines use very different internal representations for both objects and arrays today. This answer may or may not be true.

与大多数使用数组实现数组的语言相反,在 Javascript 中数组是对象,值存储在哈希表中,就像常规对象值一样。像这样:

  • 访问 - O(1)
  • 追加 - 摊销 O(1)(有时需要调整哈希表的大小;通常只需要插入)
  • 前置 - O(n) 通过unshift,因为它需要重新分配所有索引
  • 插入 - 如果值不存在,则摊销 O(1)。 O(n) 如果你想移动现有的值(例如,使用splice).
  • 删除 - 分摊 O(1) 来删除值,O(n) 如果您想通过以下方式重新分配索引splice.
  • 交换 - O(1)

一般来说,设置或取消设置字典中的任何键都会摊销 O(1),对于数组也是如此,无论索引是什么。任何需要对现有值重新编号的操作都是 O(n),因为您必须更新所有受影响的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 数组的 Big O 的相关文章

  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • 我应该对算法使用递归还是记忆化?

    如果我可以选择使用递归或记忆来解决问题 我应该使用哪一个 换句话说 如果它们都是可行的解决方案 因为它们提供了正确的输出并且可以在我正在使用的代码中合理地表达 那么我什么时候会使用其中一个而不是另一个 它们并不相互排斥 您可以同时使用它们
  • 如何使用javascript确保元素仅在圆上朝一个方向移动?

    好吧 我承认我对三角学真的很糟糕 出于上下文的考虑 我将添加我在这里提到的问题中的内容 参考问题 https stackoverflow com a 39429290 168492 https stackoverflow com a 394
  • JavaScript 验证和 PHP 验证?

    我正在使用 jquery 验证插件来验证空表单 我还应该在 PHP 中检查一下以确保 100 正确吗 或者用 javascript 验证就可以了 谢谢 您应该始终在服务器上进行验证 如果用户以某种方式不使用 Javascript 提交表单
  • 为什么这个算法的Big-O复杂度是O(n^2)?

    我知道这个算法的大O复杂度是O n 2 但我不明白为什么 int sum 0 int i 1 j n n while i lt j sum 即使我们设定了j n n一开始 我们在每次迭代期间递增 i 并递减 j 因此最终的迭代次数不应该比n
  • 如何获得n个具有不同元素数量的数组的所有可能组合?

    我有一些在编程时未知的数组数量 也许是 3 或 4 或 7 每个数组都有一些元素 即 a 1 2 3 4 b 6 7 5 2 1 c 22 4 6 8 4 8 5 4 d e f g 我想通过从每个数组中采样一个数字来获得所有可能的组合 例
  • 如何通过单击链接来更改 div 的内容?

    这是我的网页的 修改后的 jsfiddle 它还有很多 而且定位是正确的 与此相反 http jsfiddle net ry0tec3p 1 http jsfiddle net ry0tec3p 1 a href class btn1 st
  • IE 中的 XPath 查询使用从零开始的索引,但 W3C 规范是从一开始的。我应该如何处理差异?

    问题 我正在转换目前仅适用于 Internet Explorer 的相对较大的 Javascript 代码 以便使其也适用于其他浏览器 由于代码广泛使用 XPath 我们做了一些兼容性功能以使事情变得更容易 function selectN
  • 如何使用 Javascript 设置查询字符串

    有没有办法使用 javascript 设置查询字符串的值 我的页面有一个过滤器列表 单击该列表时 它将更改右侧的页内结果窗格 我正在尝试更新 url 的查询字符串值 因此如果用户离开页面 然后单击 后退 按钮 他们将返回到最后一个过滤器选择
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 如何在另一个自定义 Hook 中使用返回值的自定义 Hook?

    我正在使用 React native 其中有一个名为的自定义 HookuseUser使用以下方法从 AWS Amplify 获取用户信息Auth getUserInfro方法 然后获取返回对象的一部分并用它设置一个状态变量 我还有另一个名为
  • 如何计算特定字符在字符串中出现的次数

    我正在尝试创建一个函数来查看数组中的任何字符是否在字符串中 如果是 有多少个 我尝试计算每一种模式 但是太多了 我尝试使用 Python 中的 in 运算符的替代方案 但效果不佳 function calc fit element var
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 如何使用 JavaScript 或 jQuery 克隆 HTML 元素的样式对象?

    我正在尝试克隆元素的样式对象 这应该允许我在更改后重置所述元素的样式 例如 el style left 50px curr style left 50px Modify the elements style The cloned style
  • 使用javascript动态更新css内容

    需要将 css 更新为动态值 我不确定最好的方法是什么 div style zoom 1 div 缩放级别将根据窗口大小调整触发 应用程序将相应缩放 我将此应用程序加载到 cordova 中并让它在 iPAD 中运行 然后我意识到需要使用
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • Flot 库将 y 轴设置为最小值 0 和最大值 24

    如何将 y 轴设置在 0 到 24 的范围内 这是我的代码 j plot j placeholder d1 xaxis mode time min new Date 2010 11 01 getTime max new Date 2011
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容

随机推荐

  • 使用 method_add 动态覆盖实例方法了解 ruby​​ 元编程

    我有以下来自 Programming Ruby 1 9 的代码 稍作修改 我只是想确保我的思维过程是准确的 module Trace def self included culprit Inject existing methods wit
  • (276/304)*304 的小数舍入关闭

    如果将以下代码放入编译器中 结果会有点奇怪 decimal x 276 304 304 double y 276 304 304 Console WriteLine decimal x x Console WriteLine double
  • Apache 应该服务什么,Tomcat 应该服务什么?

    我正在尝试在 Tomcat 之前设置 Apache Apache 提供什么服务 我知道 Apache 对于静态页面和图像效果更好 我目前在 Tomcat 中部署了一个 war 文件 其中包含静态页面 图像和 Flash 文件 我应该把这些都
  • ASP.NET 托管环境/shadowCopyBinAssemblies

    今天我偶然发现了ShadowCopyBinAssemblies选项中的托管环境 tag 显然这个属性是网络配置 system web 配置布尔选项 指示 Bin 目录中应用程序的程序集是否卷影复制到应用程序的 ASP NET 临时文件目录
  • 未添加本机代码的 Java 致命错误 SIGSEGV

    我从 Java 编译器收到一条我不理解的错误消息 我已经使用 Java 6 和 7 在 OSX 10 6 10 9 和 Ubuntu 14 04 上测试了我的代码 当我使用 Eclipse 调试器或解释器 使用 Xint 选项 运行时 一切
  • Django 无法迁移 PostgreSQL:关系 Y 的约束 X 不存在

    我正在尝试在 PostgreSQL 9 6 5 数据库上运行 Django 1 11 迁移 但出现了奇怪的错误 Applying myapp 0011 auto 20171130 1807 Traceback most recent cal
  • sqlalchemy中的连接池是线程安全的吗?

    文档称连接池也不是为多线程设计的 至关重要的是 当使用连接池时 以及扩展时 使用通过 create engine 创建的引擎 连接不会与分叉进程共享 TCP 连接是 表示为文件描述符 通常跨进程工作 边界 这意味着这将导致对文件的并发访问
  • iPhone 应用程序无法在旧设备(3G、3GS...)上运行[重复]

    这个问题在这里已经有答案了 可能的重复 使用 Xcode 4 2 和 iOS 5 SDK 时是否可以针对旧版 iOS 版本 我开发了一个适用于 iPhone 4 iOS 4 3 和 5 的应用程序 在开发过程中使用 现在我尝试在3GS iO
  • 您可以记录角度数据绑定错误吗?

    如果绑定属性或表达式失败 是否有办法记录 i e
  • 如何为 JBoss 实例设置代理

    我有一个正在运行的 JBoss 实例 我想通过代理路由所有流量 我尝试将系统属性设置为在 run sh 中加载 如下所示 JAVA OPTS Dhttp proxyHost localhost Dhttp proxyPort 1234 JA
  • 发送电子邮件而无需在 Google 中启用不太安全的应用程序

    我用 C 制作了一个电子邮件程序 但您必须在 google 中启用不太安全的应用程序 有没有解决的办法 如果不是 其他应用程序如何安全地发送电子邮件而不被归类为安全性较低的应用程序 private void SendButton Click
  • 聚合物多重继承/组合

    高分子网站says在 Polymer 中使用 extend 属性不支持多重继承 或组合 我希望一个元素由一个 Polymer 元素中的一些方法和另一个 Polymer 元素中的一些方法组成 以使其反映应用程序逻辑 目前有什么方法可以在 Po
  • 正则表达式替换除破折号之外的非单词

    我有一个正则表达式模式 W 不适合h e l l o w o r d 替换字符串为 它返回类似这样的内容 h w 我希望至少能看到这样的事情 h e l l o w o r d 如何替换所有非单词字符和 不包括 symbol 要匹配除破折号
  • 为什么 strtotime 在不同时区给出不同的结果?

    我不知道为什么strtotime 在 PHP 中 即使给出相同的日期作为参数 在不同的时区也会返回不同的结果 有人知道答案吗 我也想知道 我可以做类似的任务 转换datetime to an int轻松地进行计算 与另一个在不同时区给出相同
  • 如何为 SQL Server 数据库中的所有表创建触发器

    我有一个专栏LastUpdate在我数据库的所有表中 我想说 在插入更新时LastUpdate getdate 我可以使用触发器来做到这一点 但我发现很难为数据库的每个表编写数百个触发器 如何动态创建影响所有表的触发器 如何为每个表动态创建
  • 将数据从 php 传回给 ajax

    如何将数据从 php of then rows 传递回 ajax PHP query SELECT FROM picture order by rand LIMIT 10 result mysql query query while rec
  • Android 在 snapchat 上分享图片

    我使用此代码来分享分数的屏幕截图 Intent sharingIntent new Intent Intent ACTION SEND sharingIntent setType image png Uri image Uri parse
  • 如何编写 EF.Functions 扩展方法?

    我看到 EF Core 2 有 EF Functions 属性EF Core 2 0 公告 which can be used by EF Core or providers to define methods that map to da
  • 在 Python 3 中导入 Rosbag

    我正在尝试从 Python 3 读取 rosbag 文件 我安装了 ROS2 Eloquent Elusor 它应该支持 Python 3 当我跑步时 import rosbag bag rosbag Bag test bag 从Pytho
  • JavaScript 数组的 Big O

    JavaScript 中的数组很容易通过添加和删除项目来修改 它在某种程度上掩盖了这样一个事实 大多数语言数组都是固定大小的 并且需要复杂的操作来调整大小 JavaScript 似乎可以很容易地编写出性能不佳的数组代码 这就引出了一个问题