Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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中查找多个数组中最近的两点_Javascript_Arrays_Find_Compare - Fatal编程技术网

在javascript中查找多个数组中最近的两点

在javascript中查找多个数组中最近的两点,javascript,arrays,find,compare,Javascript,Arrays,Find,Compare,我有: 实际上,路径元素更高,路径数也更高 需要从pathx和path1、path2、path3中查找最接近的clossest编号。 在本例中,距离pathx最近的是39,距离path3最近的是40。 结果需要是路径号和元素位置(路径X位置4和路径3位置2) 需要将pathx与path3连接后,结果将为 pathx=[15,12,25,39,40,5,43,7] 并将新的pathx与保持在相同模式下的path1、path2进行比较。。。直到完成 所有路径。但这可以让我自己。。。没问题! 路径的值

我有:

实际上,路径元素更高,路径数也更高

需要从pathx和path1、path2、path3中查找最接近的clossest编号。
在本例中,距离pathx最近的是39,距离path3最近的是40。 结果需要是路径号和元素位置(路径X位置4和路径3位置2)

需要将pathx与path3连接后,结果将为 pathx=[15,12,25,39,40,5,43,7]

并将新的pathx与保持在相同模式下的path1、path2进行比较。。。直到完成 所有路径。但这可以让我自己。。。没问题! 路径的值实际上是[xx+yy]。。。那么毕达哥拉距离是多少 容易计算。。。最后,pathx将包含坐标数组[x,y] 但first是如何让自己做到这一点的

提前谢谢

谢谢你们的第一个回答,所有的路径,所有的路径,我第一个问的时候犯了一个错误

这样就行了。。 有很多方法可以提高效率,但如果这些是我们讨论的数量,那就足够了

  let path1=[17,32,71,91];
  let path2=[15,12,25,39,7];
  let path3=[52,63,9,29,49,37];
  let path4=[43,40,5];
  let paths=[path1,path2,path3,path4];

  let num1 = 0;
  let num2 = 0;
  let minDiff = Number.MAX_VALUE;
  for(let i = 0; i < paths.length - 1; i++){
    let arr=[];
    for(let j = i+1; j < paths.length; j++){
      arr=[...arr, ...paths[j]];
    }
   
    for(let m =0; m< paths[i].length; m++){
      for(let n = 0; n < arr.length; n++){
        let currDiff = Math.abs(paths[i][m] - arr[n]);
        if(currDiff < minDiff){
          minDiff = currDiff;
          num1 = paths[i][m];
          num2 = arr[n];
        }
      }
    }
  }
  
let path1=[17,32,71,91];
设path2=[15,12,25,39,7];
设path3=[52,63,9,29,49,37];
设path4=[43,40,5];
让路径=[path1,path2,path3,path4];
设num1=0;
设num2=0;
设minDiff=Number.MAX_值;
for(设i=0;i

在此之后,
minDiff
将为1,
num1
将为39,
num2
将为40:)

解决此问题的一种方法是创建一个包含所有点的数组,数据指示每个点的路径索引、位置索引和位置

接下来,按位置对数组进行排序,并删除由相同路径上的点包围的项目,因为这些项目肯定不会构成最佳对

然后,对排序后的数组中的每个点,计算具有较高位置的不同路径上的最近点的距离(不必考虑较低的位置,因为对应的配对早在外环中已经考虑过)。由于排序后进行过滤,每个项目最多将与其他两个项目(可能一个来自同一路径,另一个来自不同路径)进行比较

该解决方案根据点数(从排序开始,然后是
O(n)
过程)来缩放
O(n log n)
,如果需要考虑的点数较多,这可能会很有用

下面是一个Javascript实现示例

const路径=[
[17, 32, 71, 91],
[15, 12, 25, 39, 7],
[52, 63, 9, 29, 49, 37],
[43, 40, 5]
]
//将[path_idx,position_idx,position]三元组添加到数组中。
让数组=[];
for(设i=0;ib位置)
返回1;
其他的
返回0;
});
//放置由同一路径上的点包围的项目,如下所示
//项目绝对不会构成最佳组合。
array=array.filter(函数(项,idx){
if(idx==0 | | idx==array.length-1)
返回true;
常量左=数组[idx-1];
const right=数组[idx+1];
return item.path_idx!==left.path_idx | | item.path_idx!==right.path_idx;
});
//从不同路径查找最近的项目。
设最小距离=null;
设最近值=null;
for(设i=0;i
我修改了代码。。。结果是:

      <script>


  let pathx=[15,12,25,39,7];
  let path0=[17,32,71,91];
  let path1=[52,63,9,29,49,37];
  let path2=[43,40,5];
  let paths=[path0,path1,path2];

  let num1 = 0;
  let num2 = 0;
  let num3 = 0;
  let num4 = 0;
  let num5 = 0;
  let minDiff = Number.MAX_VALUE;
  for(let i = 0; i < pathx.length; i++){
    for(let m =0; m< paths.length; m++){
      for(let n = 0; n < paths[m].length; n++){
        let currDiff = Math.abs(paths[m][n] - pathx[i]);
        if(currDiff < minDiff){
          minDiff = currDiff;
          num1 = paths[m][n];
          num2 = pathx[i];
          num3 = i;
          num4 = m;
          num5 = n;
        }
      }
    }
  }
  
          console.log("minDiff="+minDiff+" num1="+num1+" num2="+num2);
          console.log("pathx["+num3+"]="+num2+" paths["+num4+"]["+num5+"]="+num1)
</script>
      <script>


  let pathx=[15,12,25,39,7];
  let path0=[17,32,71,91];
  let path1=[52,63,9,29,49,37];
  let path2=[43,40,5];
  let paths=[path0,path1,path2];

  let num1 = 0;
  let num2 = 0;
  let num3 = 0;
  let num4 = 0;
  let num5 = 0;
  let minDiff = Number.MAX_VALUE;
  for(let i = 0; i < pathx.length; i++){
    for(let m =0; m< paths.length; m++){
      for(let n = 0; n < paths[m].length; n++){
        let currDiff = Math.abs(paths[m][n] - pathx[i]);
        if(currDiff < minDiff){
          minDiff = currDiff;
          num1 = paths[m][n];
          num2 = pathx[i];
          num3 = i;
          num4 = m;
          num5 = n;
        }
      }
    }
  }
  
          console.log("minDiff="+minDiff+" num1="+num1+" num2="+num2);
          console.log("pathx["+num3+"]="+num2+" paths["+num4+"]["+num5+"]="+num1)
</script>
minDiff=1 num1=40 num2=39
pathx[3]=39 paths[2][1]=40