【问题标题】:Using an "approximate" STL map使用“近似”STL 映射
【发布时间】:2012-03-26 15:21:34
【问题描述】:

我想创建一个 STL 映射来查找一个项目是否与 3 维空间中的另一个项目足够接近。到目前为止,我的“小于函子”运行良好,粘贴到以下链接。

现在这个问题还不是“最近邻”问题。而是“在一定距离内是否有邻居”的问题。

我的示例只显示了一个维度。为了清楚起见,我跳过了 Y/Z 尺寸。

My attempt so far

class ApproximateLessFunctor {
 public:
  ApproximateLessFunctor( float fudgeFactor ) :
    mFudgeFactor( fudgeFactor ) {};

  bool operator()( float a, float b ) const {
    return (a < (b - mFudgeFactor) );
  }

  float mFudgeFactor;
};

typedef map<float, int, ApproximateLessFunctor> XAxisMap;

class XAxis {
 public:
  XAxisMap vMap;

  XAxis(ApproximateLessFunctor functor, float x, int v)
  : vMap( functor )
  {
    vMap.insert(make_pair(x, v));
  }
};

在极少数情况下,我的意思是——非常罕见——当位置重叠时,地图找不到匹配的条目。

还有什么我可以做的更好的实现,仍然使用 STL 容器吗?

【问题讨论】:

  • 所以这是搜索半径的最近邻问题,对吧?您可能想看看 FLANN 库,它实现了半径搜索。我猜其他图书馆也是如此。
  • 你的函子必须定义一个strict weak ordering。你的没有。
  • 实际上,再看一遍,我认为它确实定义了 SWO,但我认为多维版本不会。为什么不发布呢?
  • @OliCharlesworth 他的函数没有定义 SWO,因为如果 b - a &lt; fudgec - b &lt; fudge,他的函数可能对 a, c 返回 true,但对 a, bb, c 返回 false。
  • @OliCharlesworth 要求它可以双向工作。那!(a &lt; b) || !(b &lt; c)) =&gt; !(a &lt; c)。 (想一想,我想你会同意的。)

标签: c++ stl map approximate approximate-nn-searching


【解决方案1】:

现在这个问题还不是“最近邻”问题。而是“在一定距离内是否有邻居”的问题。

不过,就前者而言,后者的措辞非常简单。找到最近的邻居,然后确定它是否足够近。考虑到任务可用的数据结构数量,这似乎是一条合理的路线。

也就是说,kd-tree 非常常见,实施起来并不难。同样相关的是R-tree,尽管我还没有实现它,也无法评论它的难度。

【讨论】:

  • 使用区域网格将大有帮助如果您的积分分布比较均匀。
  • @MooingDuck:嗯?这些都不使用网格。
  • 不,我只是在考虑另一种选择。如果点聚集在一起,kd-trees 肯定会赢,但对于某些数据,网格可能会更好。你有一个很好的答案,我主要是在沉思。
  • @MooingDuck:哦,明白了。如果点是均匀分布的,kd-tree 将生成一个网格。 :) (虽然你是对的,对网格进行硬编码,比如八叉树,可以节省空间。但是 kd 树的通用性对我来说更胜一筹。)
  • 这不是一个均匀分布的问题。
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
相关资源
最近更新 更多