【发布时间】:2019-02-13 21:49:15
【问题描述】:
我有一个项目数组,对于数组中的每个项目,我需要对同一数组中的其余项目进行一些检查。
这是我正在使用的代码:
const myArray = [ ...some stuff ];
let currentItem;
let nextItem;
for (let i = 0; i < myArray.length; i++) {
currentItem = myArray[i];
for (let j = i + 1; j < myArray.length; j++) {
nextItem = myArray[j];
doSomeComparision(currentItem, nextItem);
}
}
虽然这可行,但我需要找到一种更有效的算法,因为如果数组非常大,它会显着减慢。
有人可以提供一些关于如何使这个算法更好的建议吗?
编辑 1
我很抱歉。
我应该提供更多关于我在这里尝试做的事情的背景信息。
我将上面的循环与 HalfEdge 数据结构一起使用,也就是 DCEL。
基本上,HalfEdge 是一个具有 3 个属性的对象:
class HalfEdge = {
head: // some (x,y,z) coords
tail: // some (x,y,z) coords
twin: // reference to another HalfEdge
}
给定HalfEdge 的twin 定义如下:
/**
* if two Half-Edges are twins:
* Edge A TAIL ----> HEAD
* = =
* Edge B HEAD <---- TAIL
*/
我的数组包含许多HalfEdges,对于数组中的每个HalfEdge,我想找到它的孪生(即满足上述条件的)。
基本上,我在比较两个 3D 向量(一个来自 currentItem,另一个来自 nextItem)。
编辑 2
修正了代码示例中的错字(即,从 let j = 0 到 let j = i + 1)
【问题讨论】:
-
这可能更适合Code Review
-
您能否添加更多关于您要比较的项目的信息,如果没有更多信息,您将无法远离通用比较
-
如果你的比较是对称的 - 即 doSomeComparision(a, b) === doSomeComparision(b, a),你可以通过设置 j = i + 1 -
for (let j = i + 1; j < myArray.length; j++) {` -
@devlincarnate 此代码可能是 CR 上的 on-topic,但
myArray需要正确定义,以便代码可以运行,并且需要添加对这段代码作用的更好解释
标签: javascript arrays algorithm for-loop