Java手写广度优先搜索和案例拓展

2023-11-20

Java手写广度优先搜索和案例拓展

手写必要性

手写实现广度优先搜索算法主要有以下几个必要性:

  1. 理解算法原理:通过手写实现广度优先搜索算法,能够深入理解算法的原理和运行机制。这有助于我们更好地理解广度优先搜索的核心思想和优势,并能应用于解决其他相关问题。

  2. 定制化需求:手写实现算法可以满足特定的定制化需求。尽管有现成的图算法库和框架可供使用,但手写实现可以根据具体需求进行定制修改,以适应特定场景和数据结构。例如,可以针对特定数据结构进行性能优化,或者添加其他功能以满足特定的业务需求。

  3. 实践编程技能:通过手写实现广度优先搜索算法,可以提升编程技能和算法能力。实践是学习的最佳方式,通过亲手实现算法,可以加深对数据结构和算法的理解,并培养解决问题和编写高效代码的能力。

  4. 面试准备:在面试中,手写实现算法是常见的考察点之一。面试官可能会要求你手写实现广度优先搜索算法,以评估你的算法设计和编码能力。因此,熟练掌握手写实现广度优先搜索算法是准备算法类面试的必要技能。

总之,手写实现广度优先搜索算法有助于深入理解算法原理、满足定制化需求、提升编程技能,并为面试做好准备。即使有现成的库和框架可用,手写实现算法仍然是一个值得推荐的练习和学习方式。

1. 思维导图解释实现思路原理

下面是使用Mermanid代码表示的思维导图,用于解释广度优先搜索的实现思路和原理。
实现广度优先搜索算法

1.1概念

广度优先搜索(BFS)是一种用于图形和树的遍历算法,它从起始节点开始,首先访问其所有的邻居节点,然后继续访问邻居节点的邻居节点,依次类推,直到遍历完成或者找到特定的目标节点。

以下是一种手写实现广度优先搜索算法的常用步骤:

  1. 创建一个队列(可以使用Queue接口的实现类,如LinkedList)和一个Set(用于记录已访问的节点)。
  2. 将起始节点放入队列,并将其标记为已访问。
  3. 循环执行以下步骤直到队列为空:
    a. 从队列中取出一个节点。
    b. 访问该节点,对其进行相关的操作(例如判断是否为目标节点)。
    c. 将该节点的所有未访问的邻居节点放入队列,并标记它们为已访问。
  4. 如果找到了目标节点,则算法结束。否则,继续执行第3步,直到队列为空。

下面是一个简单的Java代码示例,展示了如何手写实现广度优先搜索算法:

import java.util.*;

public class BFS {
    public static void breadthFirstSearch(Node start, Node target) {
        if (start == null || target == null) return;

        Queue<Node> queue = new LinkedList<>();
        Set<Node> visited = new HashSet<>();

        queue.offer(start);
        visited.add(start);

        while (!queue.isEmpty()) {
            Node current = queue.poll();

            // 对当前节点进行处理,例如输出其值或进行其他操作
            System.out.println("Visiting node: " + current.getValue());

            if (current == target) {
                System.out.println("Target node found!");
                return;
            }

            for (Node neighbor : current.getNeighbors()) {
                if (!visited.contains(neighbor)) {
                    queue.offer(neighbor);
                    visited.add(neighbor);
                }
            }
        }

        System.out.println("Target node not found!");
    }

    // 示例节点类
    static class Node {
        private int value;
        private List<Node> neighbors;

        public Node(int value) {
            this.value = value;
            this.neighbors = new ArrayList<>();
        }

        public int getValue() {
            return value;
        }

        public List<Node> getNeighbors() {
            return neighbors;
        }

        public void addNeighbor(Node neighbor) {
            neighbors.add(neighbor);
        }
    }

    // 示例使用
    public static void main(String[] args) {
        // 创建示例节点图
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);

        node1.addNeighbor(node2);
        node1.addNeighbor(node3);
        node2.addNeighbor(node4);
        node3.addNeighbor(node4);
        node3.addNeighbor(node5);
        node5.addNeighbor(node2);

        // 执行广度优先搜索
        breadthFirstSearch(node1, node5);
    }
}

上述示例代码展示了如何手写实现广度优先搜索算法,并使用示例节点图进行演示。通过调用 breadthFirstSearch 方法,可以从起始节点开始搜索并找到目标节点。在每次访问节点时,我们输出了节点的值,你可以根据需要对节点进行进一步操作。

2. 实现的详细介绍和详细步骤

2.1 定义节点类

首先,我们需要定义一个节点类,用于表示图中的节点。

class Node {
    int value;
    List<Node> neighbors;

    public Node(int value) {
        this.value = value;
        this.neighbors = new ArrayList<>();
    }
}

2.2 实现广度优先搜索算法

接下来,我们实现广度优先搜索算法。

import java.util.*;

class BFS {
    public static boolean bfs(Node start, Node target) {
        Queue<Node> queue = new LinkedList<>();
        Set<Node> visited = new HashSet<>();

        queue.offer(start);
        visited.add(start);

        while (!queue.isEmpty()) {
            Node node = queue.poll();

            if (node == target) {
                return true;
            }

            for (Node neighbor : node.neighbors) {
                if (!visited.contains(neighbor)) {
                    queue.offer(neighbor);
                    visited.add(neighbor);
                }
            }
        }

        return false;
    }
}

2.3 执行广度优先搜索

最后,我们执行广度优先搜索。

public class Main {
    public static void main(String[] args) {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);

        node1.neighbors.add(node2);
        node1.neighbors.add(node3);
        node2.neighbors.add(node4);

        boolean found = BFS.bfs(node1, node4);
        System.out.println(found ? "找到目标节点" : "未找到目标节点");
    }
}

3. 手写实现总结

通过手写实现广度优先搜索算法,我们可以总结以下几点:

  1. 广度优先搜索是一种用于图的遍历的算法,它从起始节点开始,逐层遍历图中的节点,直到找到目标节点或遍历完所有节点。
  2. 广度优先搜索使用队列来存储待遍历的节点,通过将节点的相邻节点加入队列实现层级遍历。
  3. 在实现广度优先搜索算法时,需要使用一个集合来记录已经访问过的节点,避免重复访问。

4. 应用前景调研

广度优先搜索算法在图的遍历和路径搜索中具有广泛的应用前景。它可以用于解决以下问题:

  1. 迷宫问题:通过广度优先搜索算法,可以找到从起点到终点的最短路径。
  2. 社交网络分析:通过广度优先搜索算法,可以寻找两个人之间的最短关系链。
  3. 网络爬虫:通过广度优先搜索算法,可以实现对网页的广度优先遍历,从而获取更全面的信息。

5. 拓展案例

下面是一个拓展案例,通过文字描述和代码,展示广度优先搜索算法的每个步骤。

5.1 案例描述

假设有一个迷宫,迷宫由多个格子组成,每个格子可以是墙壁或通道。现在,我们需要通过广度优先搜索算法找到从起点到终点的最短路径。

5.2 案例代码

import java.util.*;

class Maze {
    private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    public static List<int[]> findShortestPath(int[][] maze, int[] start, int[] end) {
        int m = maze.length;
        int n = maze[0].length;

        Queue<int[]> queue = new LinkedList<>();
        Set<String> visited = new HashSet<>();
        Map<String, String> parent = new HashMap<>();

        queue.offer(start);
        visited.add(Arrays.toString(start));

        while (!queue.isEmpty()) {
            int[] current = queue.poll();

            if (Arrays.equals(current, end)) {
                break;
            }

            for (int[] direction : DIRECTIONS) {
                int x = current[0] + direction[0];
                int y = current[1] + direction[1];

                if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == 0) {
                    int[] next = {x, y};

                    if (!visited.contains(Arrays.toString(next))) {
                        queue.offer(next);
                        visited.add(Arrays.toString(next));
                        parent.put(Arrays.toString(next), Arrays.toString(current));
                    }
                }
            }
        }

        List<int[]> path = new ArrayList<>();
        String current = Arrays.toString(end);

        while (parent.containsKey(current)) {
            path.add(0, parseArray(current));
            current = parent.get(current);
        }

        path.add(0, parseArray(Arrays.toString(start)));

        return path;
    }

    private static int[] parseArray(String array) {
        String[] parts = array.substring(1, array.length() - 1).split(",");
        int[] result = new int[2];

        for (int i = 0; i < 2; i++) {
            result[i] = Integer.parseInt(parts[i].trim());
        }

        return result;
    }
}

5.3 案例执行

public class Main {
    public static void main(String[] args) {
        int[][] maze = {
            {0, 0, 1, 0, 0},
            {0, 0, 0, 0, 0},
            {0, 0, 1, 0, 1},
            {0, 0, 1, 1, 0},
            {0, 0, 0, 0, 0}
        };

        int[] start = {0, 0};
        int[] end = {4, 4};

        List<int[]> path = Maze.findShortestPath(maze, start, end);

        for (int[] point : path) {
            System.out.println(Arrays.toString(point));
        }
    }
}

以上案例展示了如何使用广度优先搜索算法找到迷宫中从起点到终点的最短路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java手写广度优先搜索和案例拓展 的相关文章

随机推荐

  • element ui 对话框el-dialog关闭事件,清空填写的数据

    原文链接 https blog csdn net rickiyeat article details 76595390 通常会有需求 在关闭弹框后需要清空填写的数据 这时候就需要关闭事件了
  • UE编辑器下简单把 excel格式的表格转换为wiki支持的表格

    觉得 wiki下 mediawiki 导入excel和word表格好麻烦 微软自带的offic插件wiki转换工具一直都安装不上 为了更新wiki内容只能手动来做了后来总结了以下手动方法 1 复制编辑好的Excel表格到记事本 用ue打开
  • 关于构造函数

    使用构造函数 两种使用构造函数的初始化方式 Stock food Stock World 250 1 25 等价于 Stock garment Furry 50 2 5 将构造函数与new一起使用 new可以调用构造函数 Stock pst
  • 利用input上传图片以及文件视频音频等

    这里说的input指的就是我们常用的
  • unity中创建询问弹出窗口

    在开发过程中进程会遇到需要弹出一个窗口询问用户是否进行的操作 今天就来制作一个这样弹出窗口 然后根据弹出窗口的选择内容不同进行不同的操作 本例中主要是为了删除一个数据 而在删除数据操作前需要得到用户的一个确认操作 这里面主要用到了Notif
  • 一个超级棒的VUE流程设计器--easy-flow开箱即用

    今天小编推荐一款流程设计器easy flow easy flow基于VUE ElementUI JsPlumb的流程设计器 通过 vuedraggable 插件来实现节点拖拽 功能介绍 支持拖拽添加节点 点击线进行设置条件 支持给定数据加载
  • JSON介绍及代码示例

    了解json JSON是什么 JSON是JavaScript Object Notation的缩写 它是一种数据交换格式 在JSON出现之前 大家一直用XML来传递数据 因为XML是一种纯文本格式 所以它适合在网络上交换数据 XML本身不算
  • MFC ListControl

    1 ListControl的基本创建 基本设置 m ListCtrl DeleteAllItems m ListCtrl InsertColumn 0 T NBA m ListCtrl InsertColumn 1 T Final Cham
  • office2010 卸载出现“安装程序找不到ProPlus.ww\ProPsWW.cab 请浏览正确的安装源的错”解决方法

    笔者在换电脑后想卸载office2010安装office2016 但是卸载的过程中遇到了上述问题就记录一下自己的解决方案 1 强制删除officeX对应的文件夹 然后使用toolkit工具清理即可 笔者是通过这种方法解决的 2 应该也可以使
  • C++STL之deque容器

    概述 上一篇我们讲过queue容器 它是一个单向的队列 只能从尾部插入 头部删除 而本节讲的deque容器 它是一个双向的队列 在头尾均可以调用插入与删除 并且支持迭代器和迭代器随机访问 这是它与queue的最大区别 实际上 deque容器
  • c++读取文件

    include
  • 7z命令行加密文件夹和文件名

    因为有时候需要将非常机密的东西上传到网盘 毕竟网盘也不一定安全 而每次都鼠标点添加密码很麻烦 然后就用命令行脚本弄快 电脑安装7zip 在你要压缩的文件夹打开命令行 7z a r pABC12345 mhe on test 7z a 添加f
  • 5 款最棒的 Vue 移动端 UI 组件库 - 特别针对国内使用场景推荐

    本文完整版 最棒的 Vue 移动端 UI 组件库 特别针对国内使用场景推荐 Vue 移动端 UI 组件库推荐 Vant 3 有赞移动 UI 组件库 支持 Vue 3 微信小程序 支付宝小程序 Cube UI 滴滴出行移动端 UI 库 质量可
  • 关于直流电源纹波和噪声的测量的分析和介绍

    电源纹波和噪声的定义PARD periodicand random deviation 1 电源纹波 Power Ripple 直流电压 电流中 叠加在直流稳定量上的交流分量 用电压和电流的均方根值 mVrms mArms 或峰峰值 mVp
  • 优秀LOGO的六大特质

    1 识别性 大多数的设计师认为 识别性是最容易在艺术设计和商业设计上发生冲突的地方 很多设计师都抱怨客户没有审美 喜欢平庸的LOGO设计 而一些客户认为设计师缺乏对公司和产品的理解 不懂营销 归根到底 无论设计师的设计多么创新 多么独特 始
  • 【word】错误!文档中没有指定样式的文字。 1

    问题 给文档中的图片插入题注时 报错 错误 文档中没有指定样式的文字 1 解决办法 光标定位到错误信息上 单击右键 选择 编辑域 在弹出的 域 对话框中 左侧的 域名 列表中选择 StyleRef 在右侧的 样式名 列表中选择 列表段落
  • Fabric private data入门实战

    Hyperledger Fabric private data是1 2版本引入的新特性 fabric private data是利用旁支数据库 SideDB 来保存若干个通道成员之间的私有数据 从而在通道之上又提供了一层更灵活的数据保护机制
  • VSCode中配置命令行参数

    VSCode中配置命令行参数 在跑程序调试的时候 可以直接使用脚本运行程序 这个时候调试代码只能用pdb 我觉得不太习惯 而且感觉不是很好 所以想这能不能将运行程序的脚本中的命令直接配置到vscode上 就有了这篇记录 正常vscode D
  • DHCP配置实战

    1 DHCP简介 DHCP dynamic host configuration protocol 动态的主机配置协议 基于TCP P的网络 DHCP减少了重新配置计算机IP地址的工作量 在TCP P网络中 IP地址的规划与分配是一件重要而
  • Java手写广度优先搜索和案例拓展

    Java手写广度优先搜索和案例拓展 手写必要性 手写实现广度优先搜索算法主要有以下几个必要性 理解算法原理 通过手写实现广度优先搜索算法 能够深入理解算法的原理和运行机制 这有助于我们更好地理解广度优先搜索的核心思想和优势 并能应用于解决其