数据结构与算法图的基本结构介绍 | 邻接表与邻接矩阵编码实战

Posted 大数据小禅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法图的基本结构介绍 | 邻接表与邻接矩阵编码实战相关的知识,希望对你有一定的参考价值。

🚀 作者 :“大数据小禅”

🚀文章简介:本篇文章对基本数据结构 图进行了一个概述,并使用领接矩阵与邻接表的方式来实现一个图

🚀个人主页: 大数据小禅

图的基本结构介绍

图的应用

  • 图是一种数据结构,图的应用比较广泛

  • 深度优先遍历(DFS)

  • 广度优先遍历(BFS)

  • 最小生成树 Kruskal Rrim

  • 最短路径 Dijkstra Floued Bellman-Ford

  • 图是一种数据结构,一个图就是一些节点的集合,这一些节点通过边来连接。是一种多对多的数据结构

  • 生活中常见的例子:地铁,每个站与每个站之间都是相连的。

图的分类

  • 图主要有以下这几种分类:

  • 有向无权图

  • 无向无权图

  • 无向有全图

  • 有向有权图

  • 图的几个相关术语
    – 顶点 Vertex
    – 边 Edge
    – 有权图
    – 无权图

  • 图的表示 邻接矩阵

  • 顶点与顶点是相连的,用1来表示,不相连则用0。

    使用二维数组的方式表示

  • 编码实现

public class AdjMartix 

    //顶点
    private static int V;
    //边
    private static int E;
    //邻接矩阵
    private static int[][] adj;
    //存放边的信息
    private int[][] edges;
    //从文件中读取图的相关信息
    public AdjMartix()  

        edges = new int[][]7,7,0,1,0,2,1,3,2,3,3,5,3,6,4,5;
        V=edges[0][0];  //7
        E=edges[0][1];  //7
        adj=new int[V][E];
        for(int i=1;i<=V;i++)
            int a=edges[i][0];
            int b=edges[i][1];
            adj[a][b]=1;
            adj[b][a]=1;
        

    

    //返回 V  E的方法 定义成public 上面定义成private是为了不让用户可以修改
    public int V()
        return V;
    
    public int E()
        return E;
    

    //图中是否存在某条边
    public boolean hasEdge(int v,int w)
        return adj[v][w]==1;
    

    //返回顶点v相邻的边  找到顶点v相邻的点就等于找到了相邻的边 返回和V相邻的顶点
    public ArrayList<Integer> adj(int v)
        //验证v是否合法
        validateVertex(v);
        //这里的逻辑可以对比对应的邻接矩阵
        //v是顶点 在矩阵中只要找到v那一行对应的哪一列是1 就代表有连线是相邻的边 adj[v][j]
        ArrayList<Integer> array = new ArrayList<>();
            for(int j=0;j<V;j++)
                if(adj[v][j]==1)
                    array.add(j);
                
            
            System.out.println(array);
            return array;
    

    // 度:顶点有多少个临边  求顶点的度
    public int degree(int v)
        //直接调用上面的方法看对应有几条边度就是多少了
        return adj(v).size();
    

    //判断参数是否合法
    //invail 无效的
    private void validateVertex(int v)
        if(v<0||v>=V)
            throw new IllegalArgumentException(v+"is invalid");
        
    

    private static void showAdj()
        System.out.printf("V=%d    E=%d \\n",V,E);
        for(int i=0;i<V;i++)
            for(int j=0;j<V;j++)
                System.out.printf("%d  ",adj[i][j]);
            
            System.out.println();
        
    


    public static void main(String[] args)  
        AdjMartix adjMartix = new AdjMartix();
        adjMartix.showAdj();
        adjMartix.adj(3);

    


运行结果:

邻接表

  • 邻接表它主要就是关心的是存在的边,不存在的边则不管,因此的话不会有空间上的浪费,邻接表=数组+链表。

public class GraphXIAOCHAN 
    //顶点
    private static int V;
    //边
    private static int E;
    //邻接表 链表数组   TreeSet低层使用的就是红黑树实现
    private static TreeSet<Integer>[] adj;
    //从文件中读取图的相关信息
    //存放边的信息
    private int[][] edges;
    public void GraphXIAOCHAN() 
        edges = new int[][]7,7,0,1,0,2,1,3,2,3,3,5,3,6,4,5;
        V=edges[0][0];  //7
        E=edges[0][1];  //7
        adj=new TreeSet[V];
        for(int i=0;i<V;i++)
            //遍历数组中的每一个元素 每个元素都开一个空间
            adj[i]=new TreeSet<Integer>();

        
        for(int i=1;i<=V;i++)
            int a=edges[i][0];
            int b=edges[i][1];
            adj[a].add(b);
            adj[b].add(a);
        

    

    //返回 V  E的方法 定义成public 上面定义成private是为了不让用户可以修改
    public int V()
        return V;
    
    public int E()
        return E;
    

    //图中是否存在某条边
    public boolean hasEdge(int v,int w)
        return adj[v].contains(w);
    

    //返回顶点v相邻的边  找到顶点v相邻的点就等于找到了相邻的边 返回和V相邻的顶点
    //这里进行修改 返回一个迭代器的方式 向用户隐藏低层的实现
    public Iterable<Integer> adj(int v)
        return adj[v];
    

    // 度:顶点有多少个临边  求顶点的度
    public int degree(int v)
        //直接调用上面的方法看对应有几条边度就是多少了
        return adj[v].size();
    

    //判断参数是否合法
    //invail 无效的
    private void validateVertex(int v)
        if(v<0||v>=V)
            throw new IllegalArgumentException(v+"is invalid");
        
    

    private static void showAdj()
        System.out.printf("V=%d    E=%d \\n",V,E);
        for(int i=0;i<V;i++)
            System.out.printf("顶点%d: ",i);
            for(int w:adj[i])
                System.out.printf("%d  ",(w));
            
            System.out.println();

        
    

    public static void main(String[] args) throws FileNotFoundException 
        GraphXIAOCHAN adjset = new GraphXIAOCHAN();
        adjset.showAdj();
    


运行结果

以上是关于数据结构与算法图的基本结构介绍 | 邻接表与邻接矩阵编码实战的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法图 ( 图的存储形式 | 图的基本概念 | 图的表示方式 | 邻接矩阵 | 邻接表 | 图的创建 | 代码示例 )

数据结构与算法学习笔记 图

数据结构与算法学习笔记 图

数据结构 图的基本操作要C语言的完整代码!!

数据结构—图邻接表存储基本运算算法图的遍历

数据结构与算法-图结构