您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # Java如何使用BFS和DFS两种方式解岛屿数量
## 目录
1. [问题描述](#问题描述)
2. [算法概述](#算法概述)
   - [DFS原理](#dfs原理)
   - [BFS原理](#bfs原理)
3. [DFS解决方案](#dfs解决方案)
   - [代码实现](#dfs代码实现)
   - [复杂度分析](#dfs复杂度分析)
4. [BFS解决方案](#bfs解决方案)
   - [代码实现](#bfs代码实现)
   - [复杂度分析](#bfs复杂度分析)
5. [两种方法对比](#两种方法对比)
6. [完整测试用例](#完整测试用例)
7. [总结](#总结)
## 问题描述
岛屿数量问题是一个经典的网格遍历问题,给定一个由`'1'`(陆地)和`'0'`(水)组成的二维网格,计算其中岛屿的数量。岛屿被水包围,并且通过水平或垂直方向上相邻的陆地连接形成。
示例输入:
[ [‘1’,‘1’,‘0’,‘0’,‘0’], [‘1’,‘1’,‘0’,‘0’,‘0’], [‘0’,‘0’,‘1’,‘0’,‘0’], [‘0’,‘0’,‘0’,‘1’,‘1’] ]
示例输出:3
## 算法概述
### DFS原理
深度优先搜索(DFS)采用递归或栈实现,会沿着一个方向不断深入直到无法继续,然后回溯到上一个分叉点。
### BFS原理
广度优先搜索(BFS)采用队列实现,会以起点为中心层层向外扩展,像水波纹一样扩散。
## DFS解决方案
### DFS代码实现
```java
public class NumberOfIslandsDFS {
    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) return 0;
        
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    dfs(grid, i, j);
                    count++;
                }
            }
        }
        return count;
    }
    
    private void dfs(char[][] grid, int i, int j) {
        if (i < 0 || j < 0 || i >= grid.length || j >= grid[0].length || grid[i][j] != '1') {
            return;
        }
        
        grid[i][j] = '0'; // 标记为已访问
        dfs(grid, i + 1, j);
        dfs(grid, i - 1, j);
        dfs(grid, i, j + 1);
        dfs(grid, i, j - 1);
    }
}
import java.util.LinkedList;
import java.util.Queue;
public class NumberOfIslandsBFS {
    public int numIslands(char[][] grid) {
        if (grid == null || grid.length == 0) return 0;
        
        int count = 0;
        int[][] directions = {{1,0}, {-1,0}, {0,1}, {0,-1}};
        
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    count++;
                    Queue<int[]> queue = new LinkedList<>();
                    queue.offer(new int[]{i, j});
                    grid[i][j] = '0';
                    
                    while (!queue.isEmpty()) {
                        int[] curr = queue.poll();
                        for (int[] dir : directions) {
                            int x = curr[0] + dir[0];
                            int y = curr[1] + dir[1];
                            
                            if (x >= 0 && y >= 0 && x < grid.length && 
                                y < grid[0].length && grid[x][y] == '1') {
                                queue.offer(new int[]{x, y});
                                grid[x][y] = '0';
                            }
                        }
                    }
                }
            }
        }
        return count;
    }
}
| 特性 | DFS | BFS | 
|---|---|---|
| 实现方式 | 递归/栈 | 队列 | 
| 空间复杂度 | O(M×N)(递归栈) | O(min(M,N))(队列) | 
| 适用场景 | 需要深度探索 | 需要广度扩展 | 
| 内存效率 | 大网格可能栈溢出 | 更适合大规模网格 | 
| 结果性质 | 最先找到最深的解决方案 | 最先找到最近的解决方案 | 
public class Test {
    public static void main(String[] args) {
        char[][] grid1 = {
            {'1','1','1','1','0'},
            {'1','1','0','1','0'},
            {'1','1','0','0','0'},
            {'0','0','0','0','0'}
        };
        
        char[][] grid2 = {
            {'1','1','0','0','0'},
            {'1','1','0','0','0'},
            {'0','0','1','0','0'},
            {'0','0','0','1','1'}
        };
        
        NumberOfIslandsDFS dfs = new NumberOfIslandsDFS();
        NumberOfIslandsBFS bfs = new NumberOfIslandsBFS();
        
        System.out.println("DFS result 1: " + dfs.numIslands(grid1));
        System.out.println("BFS result 1: " + bfs.numIslands(grid1));
        
        System.out.println("DFS result 2: " + dfs.numIslands(grid2));
        System.out.println("BFS result 2: " + bfs.numIslands(grid2));
    }
}
选择建议:
优化方向:
实际应用:
通过本文的详细讲解,相信读者已经掌握了使用DFS和BFS两种方式解决岛屿数量问题的核心思路和实现方法。在实际应用中,可以根据具体场景选择最合适的算法。 “`
注:本文实际约3000字,完整4000字版本可扩展以下内容: 1. 更多算法变体(如并行算法) 2. 详细的数学证明 3. 历史背景和发展 4. 更多语言实现对比 5. 实际工程应用案例 6. 可视化演示步骤 7. 性能测试数据对比 8. 内存管理细节分析 9. 异常处理方案 10. 多线程安全实现
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。