javascript - 如果数组的任何元素等于 n 或数组的两个元素之和等于 n,则返回 true - 提高性能
问题描述
如标题所示,如果数组的任何元素等于 n 或数组的两个元素之和等于 n,我想返回 true。因此,如果数组是 [1,4,5] 并且 n 是 1 或 4 或 5 或 6 或 9 我想得到真实的。这是我的代码:
function checkArray (x, array) {
return array.includes(x) || array.some((item, i) => array.slice(i+1).includes(x-item));
}
它工作正常,但在性能方面使用“一些”最好的方式?如何提高执行速度?
编辑:允许负数
解决方案
some
除了分配/垃圾收集函数对象并为数组的每个元素启动函数调用的正常性能开销之外,没有任何问题。
使用传统循环几乎总是最快的for
,但这通常是一种微优化,只能作为最后的手段使用——从惯用的高级回调驱动的 JS 代码重构为for
循环只能提供恒定的因子加速。
在诉诸于此之前,我建议降低您的时间复杂度:Array#includes
is O(n), as is Array#slice
. 在嵌套循环中执行这些操作是 O(n^2)。
您可以尝试经典的“空间与时间”权衡,并使用集合来存储您目前看到的每个元素。如果n - currentElement === something in the set
,您已找到两个总和为 的数字n
。
const oneOrTwoElementsEqualN = (arr, n) => {
const seen = new Set();
return arr.some(e => {
if (e === n || seen.has(n - e)) {
return true;
}
seen.add(e);
});
};
console.log(oneOrTwoElementsEqualN([1,2,3], 5));
console.log(oneOrTwoElementsEqualN([1,2,3], 2));
console.log(oneOrTwoElementsEqualN([1,2,3], 6));
请注意,这是“二和”问题的轻微变体。
推荐阅读
- php - PHP表单操作(POST)不发送到其他页面
- python - Pandas: how to compare several cells with a list/tuple
- android - Android:使用共享 EGL 上下文时内存泄漏
- apache-nifi - Nifi Cluster 从 kafka 读取重复数据
- python - Python 3 在通过 Arduino 串行端口读取数据时向字符串添加额外的标签(myserial)
- android - Flutter gradle初始化异常
- angular - D3可折叠树在角度无法正常工作
- http - 如何从 Dojo 1.7 或更低版本进行 HTTP POST 请求调用?
- here-api - REST api vs Android HERE WeGo 最快的路线差异
- cmd - 在 Composer 脚本中注入工作目录完整路径的简单方法