Java数据结构与算法(无向图)

前言

图是一种用于表示对象及其相互关系的数据结构。图由顶点(也称为节点)和边组成,边连接顶点,表示顶点之间的关系。根据边的方向性,图可以分为有向图和无向图。根据边的权重,图可以分为加权图和非加权图。

实现原理

邻接表(Adjacency List)

  • 用一个数组或链表表示每个顶点的邻接顶点。
  • 每个顶点都有一个链表(或列表),存储其所有邻接顶点。
  • 优点:适合表示稀疏图,空间复杂度低,为 O(V+E)O(V + E)O(V+E),其中 VVV 是顶点数,EEE 是边数。
  • 缺点:查找两个顶点之间是否存在边的时间复杂度为 O(V)O(V)O(V)(链表实现)或 O(log⁡V)O(\log V)O(logV)(平衡树或哈希表实现)。

有一个简单的无向图

html 复制代码
A - B - C
|   |
D - E - F

动画过程

Depth-First Search Visualization

具体代码实现

java 复制代码
import java.util.*;

class Graph {
    private Map<String, List<String>> adjList;

    public Graph() {
        adjList = new HashMap<>();
    }

    // 添加边的方法
    public void addEdge(String v, String w) {
        adjList.putIfAbsent(v, new ArrayList<>());
        adjList.putIfAbsent(w, new ArrayList<>());
        adjList.get(v).add(w);
        adjList.get(w).add(v); // 无向图,双向添加
    }

    // 打印图的方法(可选,用于调试)
    public void printGraph() {
        for (String v : adjList.keySet()) {
            System.out.print(v + ": ");
            for (String w : adjList.get(v)) {
                System.out.print(w + " ");
            }
            System.out.println();
        }
    }

    // 递归实现深度优先搜索
    public void DFSRecursive(String start) {
        Set<String> visited = new HashSet<>();
        DFSUtil(start, visited);
    }

    private void DFSUtil(String v, Set<String> visited) {
        visited.add(v);
        System.out.print(v + " ");

        for (String neighbor : adjList.get(v)) {
            if (!visited.contains(neighbor)) {
                DFSUtil(neighbor, visited);
            }
        }
    }

    // 迭代实现深度优先搜索
    public void DFSIterative(String start) {
        Set<String> visited = new HashSet<>();
        Stack<String> stack = new Stack<>();
        stack.push(start);

        while (!stack.isEmpty()) {
            String v = stack.pop();
            if (!visited.contains(v)) {
                visited.add(v);
                System.out.print(v + " ");

                // 为了与递归实现顺序一致,反转邻接节点的顺序
                List<String> neighbors = adjList.get(v);
                Collections.reverse(neighbors);
                for (String neighbor : neighbors) {
                    if (!visited.contains(neighbor)) {
                        stack.push(neighbor);
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        Graph g = new Graph();

        g.addEdge("A", "B");
        g.addEdge("A", "D");
        g.addEdge("B", "C");
        g.addEdge("B", "E");
        g.addEdge("D", "E");
        g.addEdge("E", "F");

        System.out.println("Graph representation:");
        g.printGraph();

        System.out.println("Depth First Traversal (Recursive) starting from node A:");
        g.DFSRecursive("A");
        System.out.println();

        System.out.println("Depth First Traversal (Iterative) starting from node A:");
        g.DFSIterative("A");
    }
}

QA:待定

相关推荐
snow@li几秒前
Java:理解 Gradle / 后端项目的管家 / 打包SpringBoot 应用 / 完成编译、下载依赖、运行测试、打包 JAR/WAR / 速查表
java
Cloud_Shy6188 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
云烟成雨TD13 分钟前
Spring AI 1.x 系列【57】动态工具发现:Tool Search Tool
java·人工智能·spring
zfoo-framework30 分钟前
[修改代码使用]codex官方app中使用中转(不需要cc-switch) 1.config.toml 2.sk方式登录
java
天佑木枫34 分钟前
15天Python入门系列 · 序
开发语言·python
逍遥德1 小时前
MQTT教程详解-05.SpringBoot集成mqtt client 性能分析
java·spring boot·spring·mt
云烟成雨TD1 小时前
Spring AI 1.x 系列【54】Retry 机制分析
java·人工智能·spring
weixin_523185321 小时前
Collections.unmodifiableMap详解:真的不可修改吗?
java·linux·前端
点燃大海1 小时前
SpringAI构建智能体
java·spring boot·spring·springai智能体
xier_ran1 小时前
【infra之路】02_RadixAttention与KV_Cache管理
java·spring boot·spring