Javascript 针对值范围内的对象高效搜索具有多个属性的对象数组
前言: 假设我有大量对象(使用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
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,
};