如果str.replace()
函数的时间复杂度为O(n)或O(1),我很困惑,例如:
var str = "Hello World";
str = str.replace("Hello", "Hi");
console.log(str);
//===> str = "Hi World"
它总是相同的答案还是取决于我们取代的东西?
有任何想法或有用的链接?!
答案 0 :(得分:2)
绝对不是O(1)(comparison of string searching algorithms),而是ECMAScript 6 doesn't dictate the search algorithm:
搜索第一次出现searchString的字符串,并将pos作为匹配子字符串的第一个代码单元的字符串中的索引,并匹配为searchString。如果未找到searchString,则返回字符串。
所以这取决于实施。
总是相同的答案还是取决于我们取代的是什么?
通常,较长的搜索字符串会较慢。依赖于实现的速度要慢多少。
答案 1 :(得分:1)
首先它应该是
str = str.replace("Hello", "Hi");
其次,
搜索字符串中的子字符串可以使用最有效的KMP算法在线性时间内完成。 在最坏的情况下更换也需要线性时间。
整体时间复杂度: O(n)
此处 n 取决于字符串str
。
在最坏的情况下,它将最终遍历整个字符串,但仍然没有找到给予replace函数的searchValue。
答案 2 :(得分:1)
您必须深入了解实施细节以获得完整答案。但要从那里开始V8&#39} runtime-strings.cc和builtins-string-gen.cc。它是一个深刻的潜水 - 我不知道c ++,所以我不完全确定我是否正在查看正确的文件,但他们似乎使用不同的方法取决于引脚的大小和构建搜索树所需的递归深度。
例如,在 builtins-string-gen.cc 中,ES6 #sec-string.prototype.replace
下的search_string
块会检查subject_string
的长度是否为1,如果0xFF
长度大于255(Runtime_StringReplaceOneCharWithString
)。如果这些条件为真,则会调用 runtime-strings.cc 中的StringReplaceOneCharWithString
,然后首先尝试使用树遍历subject_string
调用StringReplaceOneCharWithString
。
如果该搜索达到递归限制,则运行时再次调用subject_string
,但这次使用展平subject_string
。
所以,我在这里的部分教育猜测是你总是在寻找某种线性时间。当达到递归限制并进行后续天真搜索时,可能 O(mn)。我不确定这是一个天真的搜索,但对我来说,一个扁平的字符串意味着逐步遍历subject_string
而不是通过搜索树。
当树遍历没有达到递归限制时,可能还有小于 O(mn)的东西,尽管我并不完全确定它们获得了什么通过递归raw = { 'A': [1, 10],'B': [100,1000],'logA': [0, 1], 'logB':[2,3]}
df= pd.DataFrame(raw, columns=['A','B','logA','logB'])
行走。
对于实际 Javascript实现的时间复杂度,您可能希望直接询问运行时开发人员或查看他们正在做的事情是否与其他{{ 3}}找出哪些案例以时间复杂度运行。