【问题标题】:Find median of coordinates to build kd tree (2D) - C++查找坐标的中位数以构建 kd 树(2D) - C++
【发布时间】:2015-08-05 15:49:43
【问题描述】:

我在 2D 问题中有一个最近邻问题,我发现 kd-trees 是最好的解决方案。 我找不到我正在使用的结构的现成实现,所以我决定创建自己的。

我使用的结构是:

struct Point{
  int id;
  double x;
  double y;
};

我有将近100000个点,我的问题是:每次我要划分我的点时如何进行找到中点,以及如何同时定义左右分区?

另一个问题是:有没有更有效的方法? (耗时越少越好)。

【问题讨论】:

  • 您是否需要中间点作为最接近均值的点?因为在 2D 系统中 x 和 y 坐标的中点不同。
  • 我的意思是将我的所有观点分成两个不同的分区,点数相等(或多或少)。是的,每次都取决于我们使用的是 x 还是 y。

标签: c++ median nearest-neighbor kdtree


【解决方案1】:

如何计算中位数?有没有更有效的方法?

这两个问题我都会给出一个答案:你可以使用std::nth_element,像这样:

std::vector<float> v;                                   // data vector (global)
bool myfunction (int i,int j) { return (v[i]<v[j]); } 

int find_median(std::vector<int> &v_i)
{
    size_t n = v_i.size() / 2;
    nth_element(v_i.begin(), v_i.begin()+n, v_i.end(), myfunction);
    return v_i[n];
}

您也可以查看我的question 了解更多信息。


如何同时定义左右分区?

每个小于中位数的值都属于左分区,而每个大于中位数的值都属于右分区。

由您决定与中位数相等的值的去向。只需选择左或右并记住您的决定。

【讨论】:

  • 重点是我没有看到任何使用坐标的好方法。
  • 这取决于您的实施。你问走哪条路,路是nth_element。希望这有助于和良好的编码! :) @TahaBenabdallah
  • 谢谢,我会努力解决的:)
  • @TahaBenabdallah 这就是精神。如果您需要在您的尝试中发布另一个可能有问题的问题,我支持您,这样您就可以获得更多的声誉!祝你好运!
猜你喜欢
  • 2016-09-22
  • 2022-10-15
  • 2011-05-11
  • 2015-02-03
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多