我有一个指向非常简单的Point
类的指针:
class Point{
public:
float x;
float y;
float z;
};
如何使用STL找到与指示点最近的对象?
我是否需要先对矢量进行排序,还是有更有效的方法?
答案 0 :(得分:7)
排序需要O(n*log(N))
,因此效率不高。只需迭代元素并记住最佳匹配,就可以在O(n)
中完成。
使用for_each
中的<algorithm>
,您可以定义一个跟踪最近元素并在O(n)
中完成的函数。
或者,您甚至可以使用min_element
,也可以使用<algorithm>
。
答案 1 :(得分:1)
这里的基本问题是你经常对一组点进行查询。
如果你要在集合中找到一个最近的点,那么@Lucian是正确的:你可以将点保持未排序,并进行线性搜索以找到正确的点。
如果你针对同一组点进行相对大量的查询,那么组织点数据以提高查询速度是值得的。 @izomorphius已经提到了一个k-d树,这绝对是一个很好的建议。另一种可能性(诚然,非常相似)是一种八叉树。在这两者之间,我发现一个oct-tree更容易理解。从理论上讲,k-d树的效率应该稍微高一些(平均而言),但我从来没有看到太大的差异 - 尽管可能有不同的数据,差异会变得很大。
但请注意,构建像kd树或oct-tree这样的东西非常慢,所以你不需要对一组点进行大量的查询证明建立一个。一个查询显然不能证明这一点,两个可能也不会 - 但与Luchian所暗示的相反,O(N log N)(仅举例)并不是非常慢。粗略地说,log(N)是数字N中的位数,因此O(N log N)实际上并不比O(N)慢很多。反过来,这意味着您不需要特别大量的查询来证明组织数据以加快每个查询的速度。
答案 2 :(得分:0)
如果你只知道矢量中有点,那么你不能比线性比较更快。但是,如果您有其他知识,可以改进很多。例如,如果您知道所有点都是有序的并且位于同一条线上,那么就有一个对数解决方案。
还有更好的数据结构来解决您的问题,例如k-d tree。它不是STL的一部分 - 您必须自己实现它,但它是用于解决您遇到的问题的数据结构。
答案 3 :(得分:0)
您可以尝试使用Quadtree http://en.wikipedia.org/wiki/Quadtree
或类似的东西。