编程语言
首页 > 编程语言> > 为什么Javascript === / ==字符串相等有时具有恒定的时间复杂度,有时具有线性时间复杂度?

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

作者:互联网

在我发现常见/最新的Javascript实现使用String Interning进行性能提升(Do common JavaScript implementations use string interning?)后,我认为===对于字符串将获得恒定的O(1)时间.所以我对这个问题给出了错误的答案:

JavaScript string equality performance comparison

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

所以我使用字符串实习的方案是:

var str1 =“stringwithmillionchars”; //存储在地址51242中

var str2 =“stringwithmillionchars”; //存储在地址12313中

一旦我们在内存的地址201012中说出“stringwithmillionchars”就会被存储起来
并且str1和str2都将“指向”该地址201012.然后可以通过某种散列来确定该地址以映射到存储器中的特定位置.

这样做的时候

“stringwithmillionchars”===“stringwithmillionchars”

看起来像

getContentOfAddress(51242)=== getContentOfAddress(12313)

或201012 === 201012

需要O(1)/恒定时间

JSPerfs /性能更新:

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

http://jsperf.com/eqaulity-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-1ms /即时时间.

看来,当你使用for循环或函数构建一个字符串时,字符串不会被实现.因此只有当您直接为带有引号的字符串(例如var str =“test”)分配时,才会发生实习;

解决方法:

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

>如果字符串被固定,则为常数时间O(1).从示例中可以看出,实际上只发生在直接分配的字符串中,例如var str =“test”;而不是如果你使用for循环或函数连接构建它.
>线性时间O(N),因为在所有其他情况下,首先比较两个串的长度.如果它是相等的,那么我们逐字符比较.当然,他们并不平等. N是字符串的长度.

标签:string-interning,javascript,performance,string,time-complexity
来源: https://codeday.me/bug/20191006/1862313.html