稀疏图迭代器的时间复杂度及入参检测

来源: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;
31)及 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回答

liuyubobobo

2021-06-25

对于控制平行边,一个简单的解决方案是,不使用 vector<vector<int>>,而使用 vector<set<int>> 或者 vector<unordered_set<int>>,即存储每一个顶点的邻接点的容器是一个红黑树或者哈希表构成的 set,用 set 做去重。


是的,课程中介绍的方式相当于允许平行边,将对平行边的控制下放到了用户的输入层。如果用户认为图中不应该有平行边,可以首先对输入数据做一遍去重工作。这就像对于二分搜索法,我们不会做排序,而把排序的工作(如果需要的话)下放给了用户。


另外,对于邻接表,v 和 w 不一定是 0 或者 1,v 和 w 表示顶点的索引,是 [0, n) 之间的数字。


继续加油!:)

0
6
ych_1997
回复
liuyubobobo
谢谢老师!!
2021-06-28
共6条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程