如何解决在javascript中找到多个数组的最接近的两个点
我有:
pathx=[15,12,25,39,7] path1=[17,32,71,91] path2=[52,63,9,29,49,37] path3=[43,40,5]
实际上,路径元素最高,路径数量也最高!
需要从pathx以及path1,path2,path3中找到最接近的数字。
在此示例中,最接近路径3的是39,路径3是40。
结果必须是路径号和元素位置(pathx position4和path3 position2)。
需要将pathx与path3结合后,结果将是 pathx = [15,5,43,7]。
并以相同模式将新的pathx与其余的path1,path2进行比较...直到完成 所有路径。但这可以尝试使自己...没问题! 并且路径的值实际上是[x x + y y] ...因此pythagora距离为 易于计算...最终pathx将包含坐标数组[x,y] 但是首先怎么做才能做到这一点
谢谢!
感谢您对所有路径的所有回复,我在第一个询问时犯了一个错误!
解决方法
就可以了。 有一些方法可以更有效地执行此操作,但是如果这些数量足以满足我们的要求,那么它应该足够好了。
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];
}
}
}
}
此minDiff
将为1之后,num1
将为39,num2
将为40:)
解决此问题的一种方法是创建一个包含所有点的数组,并用数据指示每个点的路径索引,位置索引和位置。
接下来,按位置对数组进行排序,并删除由同一路径上的点包围的项目,因为这些项目肯定不会包含最佳对。
然后对于已排序数组中的每个点,计算到另一条路径上具有较高位置的最近点的距离(无需考虑较低的位置,因为相应的配对早已在外部循环中被考虑过了) 。由于排序后会进行过滤,因此每个项目最多只能与另外两个项目进行比较(可能一个项目来自同一路径,另一个项目来自不同路径)。
解决方案根据要点的数量来缩放O(n log n)
(从排序开始,然后是O(n)
过程),如果要考虑的点很多,这可能很有用。
这是一个使用Javascript的示例实现。
const paths = [
[17,91],[15,7],[52,37],[43,5]
]
// Add [path_idx,position_idx,position] triples to an array.
let array = [];
for (let i = 0; i < paths.length; ++i) {
const path = paths[i];
for (let j = 0; j < path.length; ++j) {
array.push({path_idx: i,position_idx: j,position: path[j]});
}
}
// Sort the array by position values.
array.sort(function(a,b) {
if (a.position < b.position)
return -1;
else if (a.position > b.position)
return 1;
else
return 0;
});
// Drop items that are surrounded by points on the same path,as these
// items will definitely not comprise the optimal pair.
array = array.filter(function(item,idx) {
if (idx === 0 || idx === array.length - 1)
return true;
const left = array[idx - 1];
const right = array[idx + 1];
return item.path_idx !== left.path_idx || item.path_idx !== right.path_idx;
});
// Find the closest items from different paths.
let min_distance = null;
let closest = null;
for (let i = 0; i < array.length; ++i) {
let item_i = array[i];
for (let j = i + 1; j < array.length; ++j) {
let item_j = array[j];
if (item_i.path_idx === item_j.path_idx)
continue;
const distance = item_j.position - item_i.position;
if (min_distance === null || distance < min_distance) {
min_distance = distance;
closest = [item_i,item_j];
}
break;
}
}
// Output (zero-indexed):
// [
// { path_idx: 1,position_idx: 3,position: 39 },// { path_idx: 3,position_idx: 1,position: 40 }
// ]
console.log(closest);
,
我修改了代码...结果就是这样:
<script>
let pathx=[15,7];
let path0=[17,91];
let path1=[52,37];
let path2=[43,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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。