Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Search_Hash_Binary Search - Fatal编程技术网

Javascript 针对值范围内的对象高效搜索具有多个属性的对象数组

Javascript 针对值范围内的对象高效搜索具有多个属性的对象数组,javascript,arrays,search,hash,binary-search,Javascript,Arrays,Search,Hash,Binary Search,前言: 假设我有大量对象(使用JavaScript符号): 现在,假设我生成了一个条目: var generatedPoints = { x0: 2.1032884, x1: 5.6160203, y0: 3.1433283, y1: 11.0626134, }; 我想做的是,使用generatedPoints和一些误差范围值e,返回一个点数组returnedpoints数组,对于generatedPoints的每个属性,该数组与误差范围内的生成点相匹配 因此,对于ret

前言:

假设我有大量对象(使用JavaScript符号):

现在,假设我生成了一个条目:

var generatedPoints = { 
  x0: 2.1032884, 
  x1: 5.6160203,
  y0: 3.1433283, 
  y1: 11.0626134,
};
我想做的是,使用
generatedPoints
和一些误差范围值
e
,返回一个点数组
returnedpoints数组
,对于
generatedPoints
的每个属性,该数组与误差范围内的生成点相匹配

因此,对于
returnedPointsArray
,每个属性都在
generatedPoints
对应属性的+-
e
范围内

例如,如果
generatedPoints.x0===5.0241002
E===0.02
,则
returnedPointsArray
中的每个对象都将具有
x0
属性,介于
5.0041002
(即
x0-E
)和
5.0441002
(即
x0+E

问题:

因此,有一个明显的解决方案可以迭代整个数组,并检查每个属性是否在
生成点的+-
e
之间(最坏的情况是
O(2n)
复杂性,对
+e
-e
进行两次单独的搜索)

我知道对于单个值,我可以对点数组进行排序,并对+-
e
执行两次二进制搜索,以将复杂性降低到
O(2log(n))
。但我不知道如何/是否可以对多个值执行此操作

我还考虑使用散列将四个属性“减少”为一个散列键,然后对其进行二进制搜索。但是,考虑到我正在搜索范围之间的属性值,我不知道/不确定是否可以这样做

问题


在具有搜索对象相应属性的对象数组中的对象范围之间搜索属性值的最快方法是什么?

您似乎在寻找or-数组是不够的。我想您可以使用
Math.round
作为哈希函数,然而,四舍五入需要与
e
的数量级相同。嘿@Bergi,非常感谢您的评论。我考虑了
Math.round
,这似乎是减少散列的一个很好的解决方案。你能详细介绍一下k-d树,以及它们在本案例中的用途/性能吗?我对性能编程非常陌生,我想知道哪一个是更好的选择!我想你必须做一些类似于
pointsArray.filter的东西(p=>Math.abs(Math.hypot(p.x1-p.x0,p.y1-p.y0)-Math.hypot(generatedPoints.x1-generatedPoints.x0,generatedPoints.y1 generatedPoints.y0))
var generatedPoints = { 
  x0: 2.1032884, 
  x1: 5.6160203,
  y0: 3.1433283, 
  y1: 11.0626134,
};