关于迭代器的问题

来源:7-3 相邻结点迭代器

小慕0436321

2019-05-12

bobo老师,在sparsegraph中vector g是私有变量,  为什么在 adjiterator中可以直接进行G.g[v].size  ,并且在java中无法实现这操作, 只能把sparsegraph中g设为公有,老师, 有其他方法可以实现吗,将其设为私有, 还用调用这变量

写回答

1回答

liuyubobobo

2019-05-13

不同的语言,对访问限制的设计是不同的:)


其实,Java本身内置了迭代器,非常好用(其实C++也内置了,但由于使用起来语法复杂,所以课程没有采用)。直接使用课程官方提供的Java版本的代码就可以:)就是这样的:

// 返回图中一个顶点的所有邻边    
public Iterable<Integer> adj(int v) {      
    return g[v];    
}


课程官方代码传送门,注意,每一小节都要配套的Java代码:

https://github.com/liuyubobobo/Play-with-Algorithms


具体使用也非常简单,可以参考下面的main函数,算作一个测试用例:)

import java.util.Vector;
import java.util.Random;

// 稀疏图 - 邻接表
public class SparseGraph {
    
    private int n;  // 节点数
    private int m;  // 边数
    private boolean directed;    // 是否为有向图
    private Vector<Integer>[] g; // 图的具体数据
    
    // 构造函数
    public SparseGraph( int n , boolean directed ){
        assert n >= 0;
        this.n = n;
        this.m = 0;    // 初始化没有任何边
        this.directed = directed;
        // g初始化为n个空的vector, 表示每一个g[i]都为空, 即没有任和边
        g = (Vector<Integer>[])new Vector[n];
        for(int i = 0 ; i < n ; i ++)
            g[i] = new Vector<Integer>();
    }
    
    public int V(){ return n;} // 返回节点个数
    public int E(){ return m;} // 返回边的个数
    
    // 向图中添加一个边
    public void addEdge( int v, int w ){
        assert v >= 0 && v < n ;
        assert w >= 0 && w < n ;
        g[v].add(w);
        if( v != w && !directed )
            g[w].add(v);
        m ++;
    }
    
    // 验证图中是否有从v到w的边
    boolean hasEdge( int v , int w ){
        assert v >= 0 && v < n ;
        assert w >= 0 && w < n ;
        for( int i = 0 ; i < g[v].size() ; i ++ )
            if( g[v].elementAt(i) == w )
                return true;
        return false;
    }
    
    // 返回图中一个顶点的所有邻边
    // 由于java使用引用机制,返回一个Vector不会带来额外开销,
    public Iterable<Integer> adj(int v) {
        assert v >= 0 && v < n;
        return g[v];
    }
    
    public static void main(String[] args) {
        int N = 20;
        int M = 100;
        Random rand = new Random();
        SparseGraph g = new SparseGraph(N , false);
        for( int i = 0 ; i < M ; i ++ ){
            int a = rand.nextInt(N);
            int b = rand.nextInt(N);
            g.addEdge(a, b);
        }
        for(int v = 0 ; v < N ; v ++ ){
            System.out.print(v + " : ");
            for(int w: g.adj(v)) // 使用adj这个迭代器
                System.out.print(w + " ");
            System.out.println();
        }
    }
}


课程后续所有算法的Java版本,也都是基于这个迭代器版本实现的。相较而言,比C++方便不少呢:)


加油!:)

0
0

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

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

11187 学习 · 1614 问题

查看课程