我经常看到有关表示图形的三种方式:
- 对象和指针
- 邻接矩阵
- 邻接表
然而,我根本不明白这些对象和指针表示是什么 - 然而每个招聘人员和许多博客都引用Steve Yegge的博客,证明它们确实是一种单独的表示。
这个广为接受的答案对一个非常类似的问题似乎表明,顶点结构本身没有内部指向其他顶点的指针,而所有边都由包含指向相邻顶点的指针的边结构表示。
在任何情况下,这种表示如何提供任何可辨别的分析优势呢?
我经常看到有关表示图形的三种方式:
然而,我根本不明白这些对象和指针表示是什么 - 然而每个招聘人员和许多博客都引用Steve Yegge的博客,证明它们确实是一种单独的表示。
这个广为接受的答案对一个非常类似的问题似乎表明,顶点结构本身没有内部指向其他顶点的指针,而所有边都由包含指向相邻顶点的指针的边结构表示。
在任何情况下,这种表示如何提供任何可辨别的分析优势呢?
对象和指针的表示将空间复杂度降至精确的V+E
,其中V
是顶点数,E
是边数(从V+2E
降至邻接表甚至2V+2E
,如果您在单独的哈希映射中存储索引->顶点映射),牺牲时间复杂度:特定边查找将需要O(E)
,在稠密图中等于O(V^2)
(从邻接表的O(V)
上升)。通过删除出现在邻接表中的重复边来实现节省空间。
这是我一直在使用的一种创建图形的方法:
#include <vector>
class Node
{
public:
Node();
void setLink(Node *n); // *n as argument to pass the address of the node
virtual ~Node(void);
private:
vector<Node*> m_links;
};
负责创建顶点之间链接的函数是:
void Node::setLink(Node *n)
{
m_links.push_back(n);
}