稀疏图迭代器的时间复杂度及入参检测
来源:7-3 相邻结点迭代器
ych_1997
2021-06-25
稀疏图添加元素的代码如下,我们课程代码是允许添加平行边的(如果做限制就加大了时间复杂度)
private:
int n, m; // 节点数和边数
bool directed; // 是否为有向图
// 向图中添加一个边
void addEdge( int v, int w ){
assert( v >= 0 && v < n );
assert( w >= 0 && w < n );
g[v].push_back(w);
if( v != w && !directed )
g[w].push_back(v);
m ++;
}
addEdge(v, w)
参数可能存在以下可能
1) v = 0, v = 1;
2) v = 1, v = 0;
3) 1)及 2)任意重复输入
如果需要以下代码严格的O(E)复杂度,是不是需要控制入参类似0 1
组合仅能出现一次?我认为可以在读文件的时候进行合并0 1
组合。亦或将O(E)
的复杂度的语义跟 O(m)既包含平行边的复杂度
统一起来即可。我理解的对吗?
// O(E)
for( int v = 0 ; v < N ; v ++ ){
cout<<v<<" : ";
SparseGraph::adjIterator adj( g1 , v );
for( int w = adj.begin() ; !adj.end() ; w = adj.next() )
cout<<w<<" ";
cout<<endl;
}
写回答
1回答
-
对于控制平行边,一个简单的解决方案是,不使用 vector<vector<int>>,而使用 vector<set<int>> 或者 vector<unordered_set<int>>,即存储每一个顶点的邻接点的容器是一个红黑树或者哈希表构成的 set,用 set 做去重。
是的,课程中介绍的方式相当于允许平行边,将对平行边的控制下放到了用户的输入层。如果用户认为图中不应该有平行边,可以首先对输入数据做一遍去重工作。这就像对于二分搜索法,我们不会做排序,而把排序的工作(如果需要的话)下放给了用户。
另外,对于邻接表,v 和 w 不一定是 0 或者 1,v 和 w 表示顶点的索引,是 [0, n) 之间的数字。
继续加油!:)
062021-06-28
相似问题