我正在研究大O符号进行技术访谈然后我意识到javascript的indexOf
方法可能具有O(N)的时间复杂度,因为它遍历数组的每个元素并返回其中的索引找到。
我们也知道O(n ^ 2)(n平方)的时间复杂度对于较大的数据来说不是一个好的性能指标。
在内部循环中使用indexOf
是不是一个坏主意?在javascript中,看到在循环中使用indexOf
方法的代码的常见问题可能是测量相等性或准备一些对象。
我们应该在必要时更喜欢对象,而不是数组,因为它们提供具有恒定时间性能O(1)的查找。
任何建议都将受到赞赏。
答案 0 :(得分:3)
说实话,tl;博士。但是,我对各种检查字符串中出现的方法进行了一些速度测试(如果这是你使用indexOf的目标。如果你真的想要获得匹配的位置,我个人不知道如何帮助你在那里)。我测试的方式是:
.includes()
.match()
.indexOf()
(还有.search()
,.lastIndexOf()
等变体,我尚未测试过。
以下是测试:
var test = 'test string';
console.time('match');
console.log(test.match(/string/));
console.timeEnd('match');
console.time('includes');
console.log(test.includes('string'));
console.timeEnd('includes');
console.time('indexOf');
console.log(test.indexOf('string') !== 0);
console.timeEnd('indexOf');
我知道它们不是循环,但是告诉你所有速度基本相同。老实说,每个人都做不同的事情,取决于你需要什么(你想通过RegEx搜索吗?你需要预先兼容ECMAScript 2015吗?等等 - 我甚至没有列出所有这些)是否真的有必要分析这么多吗?
从我的测试来看,有时indexOf()
会获胜,有时其中一个会获胜。
答案 1 :(得分:2)
在内部循环中使用indexOf
可能是一个坏主意,尤其是在您搜索的dataStructure
非常大的情况下。
解决此问题的方法是使用哈希表或字典,其中包含您可以在O(N)
时间内生成的每个项目的索引,方法是循环遍历数据结构并在每次添加到数据结构时更新它。
如果push
数据结构的末尾需要O(1)
时间来更新此表,最糟糕的情况是如果你将某些东西推到数据结构的开头它会拿O(N)
。
在大多数情况下,将索引设为O(1)
时间是合理的。