C++图结构中边的有效表示
Efficient representation of edges in a C++ graph structure
我计划在C++中表示一个相当大、稀疏、无向的图结构。这将是10000+个顶点的数量级,每个顶点的阶数约为10。
我读过一些关于将图表示为相邻矩阵或列表的背景知识,但它们似乎都不适合我想做的事情
- 图形中的每条边都将附加一些属性(数值)
- 初始图形创建后,可以删除边,但永远不会创建边
- 永远不会创建或删除顶点
- 图上的主要查询操作将是查找边E,以确定其他边与它相连。这相当于查找与E两端顶点相连的边
正是这最后一点使得邻接矩阵看起来不合适。据我所见,每个查询都需要2*N个操作,其中N是图中的节点数。
我相信邻接列表会减少所需的操作,但似乎不合适,因为我在每条边上都包含了参数,也就是说,邻接列表存储了每个
有没有更好的方法来存储我的数据,这样这些查询操作会更快,并且我可以用它的参数存储每条边?我不想开始实现一些不是正确方法的东西。
我认为通常的面向对象方法没有问题。使用Edge<V,E>
和Vertex<V,E>
类型,其中V
是由顶点存储的内容,E
是由边存储的内容。每条边都有两个对其各自顶点的引用和两个索引,表示在各自顶点的哪个槽处查找该边:
template <typename V, typename E>
class Edge {
struct Incidence {
size_t index;
Vertex<V,E>& v;
};
std::array<Incidence,2> vertices;
E content;
};
template <typename V, typename E>
class Vertex {
std::vector<Edge<V,E>*> edges;
};
如果移除边e
,则转到Vertex<V,E>::edges
并将back
处的位置移动到e
的上一个位置。持续时间移除。用于枚举特定边的所有相邻边的线性时间(以运算结果的大小为单位)。听起来不错。
这样的事情看起来合理吗?这存储边缘邻接:
#include <vector>
#include <map>
typedef int vertex;
struct edge
{
vertex a,b;
// other data
};
bool operator< (const edge &a, const edge &b)
{
unsigned long long ahash = a.a;
ahash << 32;
ahash |= a.b;
unsigned long long bhash = b.a;
bhash << 32;
bhash |= b.b;
return ahash < bhash;
}
// support for your query operation
typedef std::map<edge, std::vector<edge &> > edge_adjacency;
看起来你有点想把边映射到顶点,然后使用一些非常标准的东西。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 欧拉项目#8答案是大以获得有效答案
- 如何将ampl中的集合表示为c++中的向量
- 调整大小后指向元素值的指针unordered_map有效?
- 为什么是0;C++中的有效语句
- 最高有效数字侧的第N位
- std::is_base_of表示ctor编译错误
- GCC对可能有效的代码抛出init list生存期警告
- 输入中的字符串数未知(以字母表示)
- 有效地使用std::unordered_map来插入或增加键的值
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++中O(n^(1/3))中一个数的除数的有效计数
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 一种使用 unordered_map 表示对称稀疏矩阵的有效方法
- C++图结构中边的有效表示
- 在C++03中,在未赋值的上下文中使用表示非静态数据成员的id表达式有效吗
- 数据包:有效地表示不同的数据包类型
- c++使用一个函数表示多个变量.只有第一次运行有效
- 表示上下三角矩阵的有效方法
- 16位wchar_t对于表示完整的Unicode是否正式有效