我正在尝试创建一些类来构建O(N * logN)中的云点的 3D Convex Hull 。
我已经解决了复杂度为O(N²)的天真问题,其中 N 是点数。 它的工作原理如下:
我有一个std ::点数列表。这些点是我创建的类的等级。 我随机化列表并逐一提取列表中的所有点。 对于每个点,我检查从那一点可见的哪个方面。因此,复杂性太高,因为方面是O(N)(大于6 * N)
然后我做一些操作来删除可见方面,找到地平线并将该点与地平线连接起来。有关这些操作的信息无助于解决我的问题。
我需要的是一个创建和处理二分图的示例,该图可以快速添加和删除节点。
我尝试构建自己的类,但是因为我的图表太慢而失败了。 但是几天前我发现boost库有解决方案:this。
但我一直坚持如何用所有这些选项创建我的简单图形,我不明白如何创建它。我已经阅读了很多次这篇文档...
现在,问题是: 如何使用boost建立二分图?
必须是:
我不关心内存使用情况。我只需要快速。
这是我的第一个问题,所以我不知道是否清楚。 如果有人能够如此友好地给我一个例子,说明如何构建具有我给你的这些特征的图形,那将是很棒的。 如果您知道其他方法可以轻松创建它,那么它也会很好。
答案 0 :(得分:0)
当你说双向时,我认为你的意思是无向的。如果这意味着您希望图表被定向但是可以访问顶点的入边和出边,那么只需将boost::undirectedS
替换为boost::bidirectionalS
关于它的创建,你可以做到这一点:
#include <cstdint>
#include <boost/graph/adjacency_list.hpp>
enum class vertex_kind : std::uint8_t {
POINTD,
DCEL_FACE,
UNKNOWN
};
struct pointd_property { /* Whatever is needed */ };
struct dcel_face_property { /* Whatever is needed */};
struct vertex_property {
vertex_kind kind;
union {
pointd_property pointd;
dcel_face_property dcel_face;
};
vertex_property() : kind(vertex_kind::UNKNOWN) {}
vertex_property(pointd_property const& pprop) : kind(vertex_kind::POINTD) { new (&pointd) pointd_property(pprop); }
vertex_property(dcel_face_property const& fprop) : kind(vertex_kind::DCEL_FACE) { new (&dcel_face) dcel_face_property(fprop); }
};
typedef boost::adjacency_list<boost::vecS, boost::hash_setS, boost::undirectedS, vertex_property> graph_type;
现在填充图表非常简单:
auto graph = []() {
graph_type g;
auto a = boost::add_vertex({pointd_property()}, g);
auto b = boost::add_vertex({dcel_face_property()}, g);
boost::add_edge(a, b, g);
return g;
} ();
// Do whatever you please with g.
当然,顶点属性的内容应符合您打算使用的BGL算法的要求。如果有任何要求,请告诉我,以便我可以编辑我的答案。