在循环中使用indexOf是一个坏主意吗?

时间:2016-09-13 06:30:20

标签: javascript algorithm performance big-o indexof

我正在研究大O符号进行技术访谈然后我意识到javascript的indexOf方法可能具有O(N)的时间复杂度,因为它遍历数组的每个元素并返回其中的索引找到。

我们也知道O(n ^ 2)(n平方)的时间复杂度对于较大的数据来说不是一个好的性能指标。

在内部循环中使用indexOf是不是一个坏主意?在javascript中,看到在循环中使用indexOf方法的代码的常见问题可能是测量相等性或准备一些对象。

我们应该在必要时更喜欢对象,而不是数组,因为它们提供具有恒定时间性能O(1)的查找。

任何建议都将受到赞赏。

2 个答案:

答案 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)时间是合理的。