Sorting 我怎么做这棵KD树?

Sorting 我怎么做这棵KD树?,sorting,data-structures,tree,nearest-neighbor,kdtree,Sorting,Data Structures,Tree,Nearest Neighbor,Kdtree,我有一个很长的半排序的纬度、经度和时区三元组列表。我希望能够快速搜索此列表,以找到距离任何给定纬度和经度最近的时区,因此我希望将此列表制作成KD树 我认为应该先将整个文件读入某种数据结构(什么数据结构?可能是ArrayList?)。然后取该结构中的中间元素,并将其作为根,给我留下一个左右列表。然后继续获取每个列表的中间元素,并将其作为左或右子元素添加 第一次尝试这个似乎是缓慢和低效的。。。但我觉得我做错了。你能为我提供一个算法或伪代码吗?如果有帮助的话,我有一个在一个叫做XYZPoint的内部类

我有一个很长的半排序的纬度、经度和时区三元组列表。我希望能够快速搜索此列表,以找到距离任何给定纬度和经度最近的时区,因此我希望将此列表制作成KD树

我认为应该先将整个文件读入某种数据结构(什么数据结构?可能是
ArrayList
?)。然后取该结构中的中间元素,并将其作为根,给我留下一个左右列表。然后继续获取每个列表的中间元素,并将其作为左或右子元素添加

第一次尝试这个似乎是缓慢和低效的。。。但我觉得我做错了。你能为我提供一个算法或伪代码吗?

如果有帮助的话,我有一个在一个叫做XYZPoint的内部类中将XYZ作为双精度的。您可以使用时区数据扩充XYZ点,并使用X表示经度,Y表示纬度,零表示Z。它至少可以是一个起点

然后,您可以使用最近邻(欧几里德距离)方法(已经实现)来计算距离某个点最近的时区


还有。。对于填充KD树,建议重复使用和删除中间值。

如果您对KD树有任何疑问,请告诉我。如果仍然很慢/效率低下,请告诉我;我很好奇!我将您的实现与javaml()中的KDTree实现进行了比较,您的实现在提取k个最近邻方面要慢得多。不过,您的界面更好:)此外,以下是一些更快的实现: