【问题标题】:How could I make this KD-tree?我怎样才能制作这个KD树?
【发布时间】:2012-09-21 21:15:50
【问题描述】:

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

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

第一次尝试这个似乎很慢而且效率很低……但我觉得我做错了。您能否为我正在尝试做的事情提供算法或伪代码?

【问题讨论】:

  • 如果您对 KDTree 有任何疑问,请告诉我。如果它仍然很慢/效率低,请告诉我;我很好奇!
  • 我将您的实现与 Java-ML (java-ml.sourceforge.net) 中的 KDTree 实现进行了比较,而您的在提取 k 个最近邻居时要慢得多。不过你的界面更好:)
  • 另外,这里有一些更快的实现:robowiki.net/wiki/Kd-tree#Implementations

标签: sorting data-structures tree nearest-neighbor kdtree


【解决方案1】:

如果有帮助,我有一个KD-Tree in Java,它在一个名为 XYZPoint 的内部类中将 XYZ 作为双精度值。您可以使用时区数据增加 XYZ 点,并使用 X 表示经度,使用 Y 表示纬度,使用零表示 Z。它至少可以作为一个起点。

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

另外.. 对于填充 KD-Tree,wikipeda 建议使用 HeapSort (my Java implementation linked) 并重复删除中位数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 2019-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多