为什么Javascript ===/== 字符串相等有时具有恒定时间复杂度,有时具有线性时间复杂度?

2023-11-22

在我发现常见/最新的 Javascript 实现正在使用 String Interning 来提高性能之后(常见的 JavaScript 实现是否使用字符串驻留?), 我想===对于字符串将得到常数 O(1) 时间。所以我对这个问题给出了错误的答案:

JavaScript 字符串相等性能比较

由于根据该问题的 OP,它是 O(N),因此将字符串输入加倍会使等式所需的时间加倍。他没有提供任何 jsPerf 因此需要更多调查,

所以我使用字符串实习的场景是:

var str1 = "stringwithmillionchars"; //stored in address 51242

var str2 = "stringwithmillionchars"; //stored in address 12313

“stringwithmillionchars”将被存储一次,假设在内存地址 201012 中 str1 和 str2 都将“指向”这个地址 201012。然后可以通过某种哈希来确定该地址,以映射到内存中的特定位置。

所以在做的时候

"stringwithmillionchars" === "stringwithmillionchars"

看起来像

getContentOfAddress(51242)===getContentOfAddress(12313)

or 201012 === 201012

这将需要 O(1)/常数时间

JSPerfs/性能更新:

即使字符串长 16 倍,JSPerf 似乎也显示恒定时间?请看一看:

http://jsperf.com/eqauality-is-constant-time

上面的字符串可能太小: 这可能显示线性时间(感谢 sergioFC),字符串是用循环构建的。我尝试不使用函数 - 仍然是线性时间/我改变了一点http://jsfiddle.net/f8yf3c7d/3/ .

根据https://www.dropbox.com/s/8ty3hev1b109qjj/compare.html?dl=0(sergioFC 制作的 12MB 文件)当您有一个字符串并且已经在引号中分配了值时,无论 t1 和 t2 有多大(例如 5930496 个字符),它都会花费 0-1 毫秒/瞬时时间。

似乎当您使用 for 循环或函数构建字符串时,该字符串不会被保留。因此,只有当您直接分配带有引号的字符串时,才会发生实习,例如var str = "test";


基于字符串 a 和 b 的所有性能测试(参见原始帖子)操作a === b takes:

  • 常数时间 O(1)如果琴弦被拘留。从例子看来,实习only发生在直接分配的字符串上,例如var str = "test";如果您使用 for 循环或函数通过串联来构建它,则不会。

  • 线性时间 O(N)因为在所有其他情况下,首先比较两个字符串的长度。如果相等,那么我们就逐个字符进行比较。否则他们当然不平等。 N 是字符串的长度。

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

为什么Javascript ===/== 字符串相等有时具有恒定时间复杂度,有时具有线性时间复杂度? 的相关文章

  • 如何将 Django 中的数组传递给模板并在 JavaScript 中使用它

    我想将数组传递给模板 然后通过 JavaScript 使用它 In my views py I have arry1 Str 500 20 return render to response test html array1 arry1 在
  • 如何使用 JavaScript 选择预节点/块中的文本?

    我了解不允许 JS 将任意文本复制到剪贴板背后的安全原因 但是是否有一种方法可以通过单击按钮来选择预节点中的文本 类似于 select 函数在输入中的工作方式 我不是在寻找复制到剪贴板的 jQuery 插件 我只想突出显示预块中的文本 以便
  • 实现悬停信息框

    我有一个日历 当用户将鼠标悬停在单元格上时 会出现一个很大的信息框 其中包含该日期的详细信息 虽然当用户离开时使信息框消失 但我遇到了一些麻烦 我基本上想要它 这样当鼠标光标移出信息框隐藏的日历单元格时 它就会消失 但我遇到了麻烦 因为mo
  • 在 setInterval / setTimeout 中使用变量作为时间[重复]

    这个问题在这里已经有答案了 这是一个示例情况 var count time 1000 setInterval function count 1 time 上面的代码会将 count 变量加 1 即 1000 毫秒 看来 setInterva
  • str.translate 与 str.replace - 何时使用哪一个?

    何时以及为什么使用前者而不是后者 反之亦然 目前尚不完全清楚为什么有些人使用前者以及为什么有些人使用后者 它们有不同的目的 translate只能用任意字符串替换单个字符 但一次调用可以执行多次替换 它的参数是一个特殊的表 它将单个字符映射
  • html canvas动画卡顿

    谁能解释为什么提供的画布动画断断续续 我创建了一个测试存根来演示该问题 我在桌面上的 FF Chrome IE 以及 Android 上的 FF 和 Chrome 中看到了卡顿现象 口吃是由于垃圾收集造成的吗 似乎 raf 在每次调用时都会
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • ReactCSSTransitionGroup 组件WillLeave 未调用

    我尝试使用 ReactCssTransition 但不知何故该事件没有被调用 componentWillLeave 这是我的组件 import React Component from react import TransitionGrou
  • put方法中的Angularjs文件上传不起作用

    我有一个简单的待办事项应用程序 我试图在其中上传照片和单个待办事项 现在我已经创建了这个工厂函数来负责待办事项的创建 todosFactory insertTodo function todo return http post baseUr
  • jQuery 悬停时滚动到 div 并返回到第一个元素

    我基本上有一个具有设定尺寸的 div 和overflow hidden 该 div 包含 7 个子 div 但一次只显示一个 我希望当它们各自的链接悬停时能够平滑地垂直滚动 但是 第一部分 div 没有链接 并且是没有悬停链接时的默认部分
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • JavaScript Promise 不执行 .then()

    我在 JavaScript 中的 Promise 方面遇到了一些问题 我想做的是获得一个地址列表 然后对于每个地址 我需要调用地理编码 API 来获取 lat lng 然后我将继续将标记与热图一起绘制 这是我的代码 let promiseK
  • JavaScript 提升解释

    下面的片段有什么区别 var a 0 function b a 10 return function a b console log a gt 10 and var a 0 function b a 10 return function a
  • Outlook 加载项,无法读取未定义的属性“BeginRequestEventArgs”

    我使用 Visual Studio 开发了 Outlook 插件 我的插件有一个按钮 用于填充会议邀请正文中的详细信息并添加所需的与会者 这在 99 的情况下都有效 但是 时不时地它会给我下面的 JavaScript 错误 Uncaught
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • 检测浏览器选项卡是否具有焦点

    是否有可靠的跨浏览器方法来检测选项卡是否具有焦点 场景是 我们有一个定期轮询股票价格的应用程序 如果页面没有焦点 我们可以停止轮询并为每个人节省流量噪音 特别是当人们喜欢打开具有不同投资组合的多个选项卡时 Is window onblur
  • case_when 与部分字符串匹配和 contains()

    我正在使用一个数据集 其中有许多名为 status1 status2 等的列 在这些列中 它表示某人是否豁免 完整 注册等 不幸的是 豁免投入并不一致 这是一个示例 library dplyr problem lt tibble perso
  • p5 向量减法“sub”返回错误

    我一直在尝试将 p5 草图上传到 React 构建中 使用react p5 wrapper 我能够成功在屏幕上渲染画布 但是 某些矢量函数会导致错误 var distance this position dist ball position
  • 如何获得 JavaScript 阶乘程序的循环来显示所使用的工作?

    你好 我面临着用 JavaScript 编写一个程序的挑战 尽管我对它不太了解 但它要求用户输入一个数字 然后计算该数字的阶乘 我使用了已经提出的问题并设法使计算正常工作 但无法获得所需的输出 我必须在以下输出中获取它 而不使用任何花哨的库

随机推荐

  • 哪个 iOS 类/代码返回磁北?

    我想获取设备与磁北的偏差 以度为单位 并在我正在编写的一些代码中使用该值 我不想使用设备的定位服务 因此我对获取真北不感兴趣 而是对磁北感兴趣 仅使用设备的磁力计 哪个类 或编码过程 可以为我提供该值 仅依赖于磁力计 CLLocationM
  • PHP 中可以有嵌套类吗?

    我不是在谈论继承 我不是在谈论嵌套对象 我在说话 System Web Templating 一种筑巢 这些是您不应该创建实例的类 所以 No 但是 您可以通过在 getInstance 中返回实例化对象来执行类似的操作 myClass g
  • 谷歌地图使用 PHP 在 MySQL 中保存多边形和点

    现在我有一个应用程序 允许用户在谷歌地图上绘制多边形 我需要使用 PHP 和 MySQL 保存这个多边形 但我不确定最佳实践 我应该启用空间扩展并保存几何图形吗 我应该将每个垂直 纬度 经度对 保存在数组中吗 我不知道的另一种方法 我想知道
  • Internet Explorer 中触发 window.resize 事件

    如您所知 在 Internet Explorer 中 当页面上的任何元素调整大小时 将触发 window resize 事件 页面元素是否通过分配 更改其高度或样式属性 通过简单地向其添加子元素或其他方式来调整页面元素的大小并不重要 即使元
  • C# 数据集访问数据库

    我有一个从 csv 文件动态创建的数据集 我想要做的是将行插入到我的 MS Access 表中 但我不知道从哪里开始 数据集中数据的标头可能会因顺序而异 但标头的名称将始终与 Access 数据库匹配 我是否必须在插入命令中静态调用标头名称
  • WPF 将用户控件属性绑定到父属性

    我创建了一个用户控件 它有 2 个依赖属性 我想将这些依赖属性绑定到 mainViewModel 的属性 以便每当用户控件中的某些内容发生更改时 父级的属性都会更新 我尝试过 可以正常绑定 但没有成功 如何将用户控件的 DP 绑定到父级的属
  • javascript中的第n个孩子

    这是我的 jquery 代码 我需要 javascript 代码来选择第 n 个孩子 是否可以使用 javascript 选择第 n 个孩子
  • 如何剪辑或剪切可组合项?

    如何剪辑或剪切可组合内容以使图像 按钮或可组合项具有自定义形状 这个问题不是关于使用Modifier clip 更像是用替代方法来完成任务 这些方法允许产生不可能的结果 或者当很难创建像云或方圆这样的形状时 This is 分享您的知识 问
  • 如何显示 HTML 资源文件?

    我有一个 html文件在我的assets目录 如何在 Flutter 中显示 渲染它 包裹来自颤动团队昨天发布 webview flutter 如何加载本地资源 将文件添加到项目并更新您的 pubspec assets assets you
  • 在 jQuery 中设置日期格式

    var date Fri Jan 29 2012 06 12 00 GMT 0100 我怎样才能以格式显示它2012 01 29 06 12 在 PHP 中是函数 gt 格式 在 Javascript 中也是格式 但如果我尝试使用它 则会出
  • 使用 useEffect 和异步函数反应错误边界,我缺少什么?

    In my Hello jsx我正在调用一个可能会失败的 API 组件 这里调用了一个假APIloader import React useEffect from react export const Hello gt const load
  • 是否可以更改 docker 容器中的日期?

    我有一个容器 里面有一个正在运行的程序 tomcat 我只需要更改此容器中的日期并测试我的程序行为 我有时间敏感的逻辑 有时需要看看几天或几个月后会发生什么 在docker中可以吗 我读到 如果我更改容器中的日期 主机系统上的日期也会更改
  • 为 Firebase 部署单独的 Cloud Function

    我希望能够为 Firebase 部署单独的 Cloud Function 这样我就不必每次都部署整个项目 没有通过 CLI 的选项 但如果 Google 或 Firebase 公开了一个 REST API 或其他一些接口来简化此操作 那就太
  • 如何将表情符号与 R 正则表达式匹配?

    我想确定矢量的哪些元素包含表情符号 x c no no x 1 U0001f602 no U0001f379 U0001f600 no U0001f61b 相关文章仅涵盖其他语言 并且因为它们大多引用专门的库 所以我无法找到翻译为 R 的方
  • 使用大量控件填充 FlowLayoutPanel 并按需绘制缩略图

    我正在尝试做一个ImageListBox一种可以显示大量缩略图的控件 就像 Picasa 使用的控件一样 这是我的设计 我有一个FlowLayoutPanel那里居住着很多UserControl对象 例如 4 000 个 每个UserCon
  • log-sum-exp 技巧为什么不递归

    我一直在研究 log sum exp 问题 我有一个以对数形式存储的数字列表 我想将其求和并以对数形式存储 朴素的算法是 def naive listOfLogs return math log10 sum 10 x for x in li
  • 作为开发人员,不同的 Ruby 线程模型(Ruby 与 JRuby)会对您的代码产生什么实际影响?

    我试图了解 MRI Ruby 1 8 和 JRuby 之间不同线程模型的实际影响 作为开发人员 这种差异对我意味着什么 另外 MRI Ruby 1 8 中是否有任何实际代码示例 由于不同的线程模型 它们在 JRuby 上的性能特征会更差 S
  • 如何进入微软的.NET框架源代码?

    我想进入微软的源代码 但不能 我按照以下说明进行操作配置 Visual Studio 进行调试 特别是 我禁用了 仅启用我的代码 并启用了 启用 NET Framework 源步进 最后 将源符号位置设置为 http referenceso
  • nginx 作为 NodeJS+socket.io 的代理:除了大消息外一切正常

    正如上所解释的nginx 的网站我使用了 nginx 的这些设置来将 websocket 代理到 NodeJS 服务器 location socket io proxy pass http backend proxy http versio
  • 为什么Javascript ===/== 字符串相等有时具有恒定时间复杂度,有时具有线性时间复杂度?

    在我发现常见 最新的 Javascript 实现正在使用 String Interning 来提高性能之后 常见的 JavaScript 实现是否使用字符串驻留 我想 对于字符串将得到常数 O 1 时间 所以我对这个问题给出了错误的答案 J