Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌套for循环的最佳替代方案是什么?_Javascript_Optimization_Nested Loops - Fatal编程技术网

Javascript 嵌套for循环的最佳替代方案是什么?

Javascript 嵌套for循环的最佳替代方案是什么?,javascript,optimization,nested-loops,Javascript,Optimization,Nested Loops,我试图优化这段代码,它测量空间中2个点的长度,如果长度是鸦片,则画一条线。问题是它非常慢(主要是在智能手机上)。 我能做些什么来加快速度吗?比如避免一些不必要的代码。几周来我一直在努力 this.dots.forEach(p => { this.dots.forEach(q => { // Using x * x instead of Math.pow for efficiency let z = Math.sqrt((q.x -

我试图优化这段代码,它测量空间中2个点的长度,如果长度是鸦片,则画一条线。问题是它非常慢(主要是在智能手机上)。 我能做些什么来加快速度吗?比如避免一些不必要的代码。几周来我一直在努力

   this.dots.forEach(p => {
      this.dots.forEach(q => {
        // Using  x * x instead of Math.pow for efficiency
        let z = Math.sqrt((q.x - p.x) * (q.x - p.x) + (q.y - p.y) * (q.y - p.y));

        if(p != q && z < this.STRING_MAX && z > this.STRING_MIN) {

         // Background's oposite color
          if(p.y > p5.windowHeight + 45) {
            p5.stroke(0, this.transp);
          } else {
            p5.stroke(255, this.transp);
          }
          p5.line(p.x, p.y, q.x, q.y);
        }
      });
    });
this.dots.forEach(p=>{
this.dots.forEach(q=>{
//使用x*x代替Math.pow提高效率
设z=Math.sqrt((q.x-p.x)*(q.x-p.x)+(q.y-p.y)*(q.y-p.y));
如果(p!=q&&zthis.STRING\u MIN){
//背景颜色
如果(p.y>p5.windowHeight+45){
p5.行程(0,本次运输);
}否则{
p5.行程(255,本次运输);
}
p5.行(p.x,p.y,q.x,q.y);
}
});
});
这就是它的外观(它不仅画线,这就是为什么它更慢的原因):


首先,数学函数可以在if()测试循环中完成,因为这将忽略p==q项

但是,对于这样的情况,我建议更典型的是有两个循环-外循环从0到倒数第二项,内循环从外循环的计数器+1到最后一项:

for (let i = 0; i < items.length - 1; i++) {
  for (let j = i + 1; j < items.length; j++) {
    // check values at i and j
  )
}
for(设i=0;i

这样,i和j就永远不会是相同的,您也不需要为i的每个实例迭代整个数组。

您可以计算出
Math.sqrt()
调用并将
z
与这两个极限的平方进行比较。此外,如果你正在进行一个组合过程,该过程涉及将列表的成员与列表的所有其他成员配对,循环机制本身并不是核心问题;这是一个缓慢的基本过程。当然,你可以将计算结果记录下来。这uld避免重新计算已计算值的内容。您可能不必检查每个点与其他点的对应关系。可能首先筛选屏幕相同部分的点的子列表?您可以查看“四叉树”,这是一种算法,可以对彼此相邻的对象进行预选。第一件事我没有想到。第二件事非常聪明!谢谢!这实际上是一种寻找结果顺序无关紧要的组合的技术-即ab和ba被认为是相同的。此外,你只需要做一些事情如果Math.abs(q.x-p.x)和Math.abs(q.y-p.y)小于您的“适当”值,则使用组合距离。这将立即消除任何已经相距太远的对。是的-如果直角三角形较短边的任一侧大于您的适当长度,斜边值也必须大于该值。a²+b²=c²,因此要使c²的sqrt小于您的最大值,a和b也必须小于您的值r max.对不起,如果x或y中的任何一个(但不是两个)相同,则有一个例外-因此差异为0。假设最大值为100,则(100²*0²)可以,但(101²*0²)或(100²*1²)不可以