大数组查找优化的一个问题?-灵析社区

PunkMaccccc

const arr1 = [2, 4, 5, 7, 10]; const arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 12, 5]; // 直接用 includes 来判断是否存在于 arr1 中 const r1 = arr2.filter(n => !arr1.includes(n)); console.log(r1); // [1, 3, 6, 8, 9, 11, 1, 12] // 如果 arr1 也比较大,可以先生成集合,通过集合来检查会更快;生成集合的同时也可以去重 const arr1Set = new Set(arr1); const r2 = arr2.filter(n => !arr1Set.has(n)); console.log(r2); // [1, 3, 6, 8, 9, 11, 1, 12] 如果你确实需要通过 `splice` 来修改原数组,可能从最后一个元素开始,按逆序来处理,这样就不存在索引移位的问题。不过理论上来说,删除索引是个重量级操作 —— 对真数组来说,每次删除元素都会造成后面的所有元素重排,非常耗时。 如果又想改原数组,又想优化,就需要自己写算法。假如你的是作业,那么接下来的东西就是你需要写的内容了: 1. 找到第一个需要删除的位置 `x`,记录 `s = x` 2. 从 `x + 1` 开始找到下一个不需要删除的位置 `y` 3. 从 `y + 1` 开始找到再下一个需要删除的位置 `z` 4. 将从 `y` 到 `z`(不含)之间的元素挪到 `s` 处,记录结束位置 `p`(此时 `p = s + (z - y)`) 5. 赋值 `s = p; x = z`,从第 2 步开始重复处理 6. 注意上述循环的退出条件和剩余处理 大概画了个示意图,看你能懂不 ![snipaste_2023-09-26_15-41-17.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250103/ea593b1c89664a176ec7884101784e6a.png)

阅读量:1

点赞量:0

问AI