Node.js 在一组点中找到比给定距离(接近度)更近的对
我正在用node.js开发一个多人游戏。每秒钟我都会得到每个玩家的坐标(X,Y,Z)。我怎样才能为每个球员提供一份距离他一定距离以外的所有球员的名单Node.js 在一组点中找到比给定距离(接近度)更近的对,node.js,algorithm,indexing,nearest-neighbor,Node.js,Algorithm,Indexing,Nearest Neighbor,我正在用node.js开发一个多人游戏。每秒钟我都会得到每个玩家的坐标(X,Y,Z)。我怎样才能为每个球员提供一份距离他一定距离以外的所有球员的名单 有没有避免O(n²)计算的想法?您不是在寻找聚类算法 相反,您正在寻找支持radius查询的数据库索引 示例: R*-树 kd树 M-树 网格文件 八叉树(用于3d,四叉树用于2d) 其中任何一个都应该做到这一点,并在理论上产生O(nlogn)性能。实际上,这并不像这样容易。如果所有对象都非常接近,“比给定坐标更接近”可能意味着每个对象,即O(
有没有避免O(n²)计算的想法?您不是在寻找聚类算法 相反,您正在寻找支持radius查询的数据库索引 示例:
- R*-树
- kd树
- M-树
- 网格文件
- 八叉树(用于3d,四叉树用于2d)
其中任何一个都应该做到这一点,并在理论上产生
O(nlogn)
性能。实际上,这并不像这样容易。如果所有对象都非常接近,“比给定坐标更接近”可能意味着每个对象,即O(n^2)。您不是在寻找聚类算法
相反,您正在寻找支持radius查询的数据库索引
示例:
- R*-树
- kd树
- M-树
- 网格文件
- 八叉树(用于3d,四叉树用于2d)
其中任何一个都应该做到这一点,并在理论上产生
O(nlogn)
性能。实际上,这并不像这样容易。如果所有对象都非常接近,“比给定坐标更接近”可能意味着每个对象,即O(n^2)。您不是在寻找聚类算法
相反,您正在寻找支持radius查询的数据库索引
示例:
- R*-树
- kd树
- M-树
- 网格文件
- 八叉树(用于3d,四叉树用于2d)
其中任何一个都应该做到这一点,并在理论上产生
O(nlogn)
性能。实际上,这并不像这样容易。如果所有对象都非常接近,“比给定坐标更接近”可能意味着每个对象,即O(n^2)。您不是在寻找聚类算法
相反,您正在寻找支持radius查询的数据库索引
示例:
- R*-树
- kd树
- M-树
- 网格文件
- 八叉树(用于3d,四叉树用于2d)
其中任何一个都应该做到这一点,并在理论上产生
O(nlogn)
性能。实际上,这并不像这样容易。如果所有对象都非常接近,“比给定坐标更近”可能意味着每个对象,即O(n^2)。您要查找的是三维的四叉树,即八叉树。八叉树基本上与二叉树相同,但不是每个节点有两个子树,而是每个节点有2^D=2^3=8个子树,其中D是维度
例如,想象一个立方体。为了创建下一级根,实际上每个节点都代表多维数据集中的8个子多维数据集,以此类推
此树将产生快速查找,但小心不要将其用于更多维度。我已经建立了一个多态四叉树,不会超过8-10维,因为它变得太扁平了
另一种方法是kd-tree,实际上在每一步都要将数据集(玩家)减半
您可以使用提供最近邻搜索的库。您要查找的是三维的四叉树,即八叉树。八叉树基本上与二叉树相同,但不是每个节点有两个子树,而是每个节点有2^D=2^3=8个子树,其中D是维度 例如,想象一个立方体。为了创建下一级根,实际上每个节点都代表多维数据集中的8个子多维数据集,以此类推 此树将产生快速查找,但小心不要将其用于更多维度。我已经建立了一个多态四叉树,不会超过8-10维,因为它变得太扁平了 另一种方法是kd-tree,实际上在每一步都要将数据集(玩家)减半
您可以使用提供最近邻搜索的库。您要查找的是三维的四叉树,即八叉树。八叉树基本上与二叉树相同,但不是每个节点有两个子树,而是每个节点有2^D=2^3=8个子树,其中D是维度 例如,想象一个立方体。为了创建下一级根,实际上每个节点都代表多维数据集中的8个子多维数据集,以此类推 此树将产生快速查找,但小心不要将其用于更多维度。我已经建立了一个多态四叉树,不会超过8-10维,因为它变得太扁平了 另一种方法是kd-tree,实际上在每一步都要将数据集(玩家)减半
您可以使用提供最近邻搜索的库。您要查找的是三维的四叉树,即八叉树。八叉树基本上与二叉树相同,但不是每个节点有两个子树,而是每个节点有2^D=2^3=8个子树,其中D是维度 例如,想象一个立方体。为了创建下一级根,实际上每个节点都代表多维数据集中的8个子多维数据集,以此类推 此树将产生快速查找,但小心不要将其用于更多维度。我已经建立了一个多态四叉树,不会超过8-10维,因为它变得太扁平了 另一种方法是kd-tree,实际上在每一步都要将数据集(玩家)减半
您可以使用提供最近邻搜索的库。我回答自己的问题,因为我现在有答案了。感谢G.Samaras和Anony Mouse: 我使用kd树算法:
- 首先,我用所有的树来建造这棵树
var kd = require('kdtree'); var tree = new kd.KDTree(3); // A new tree for 3-dimensional points var players = loadPlayersPosition(); // players is an array containing all the positions for (var p in players){ //let's build the tree tree.insert(players[p].x, players[p].y, players[p].z, players[p].username); } nearest = []; for (var p in players){ //let's look for neighboors var RANGE = 1000; //1km range close = tree.nearestRange(players[p].x, players[p].y, players[p].z, RANGE); nearest.push(close); }