廣度優先和深度優先是兩種常見的基本算法。在Java程序設計中,二者均有重要應用。
廣度優先算法
廣度優先算法,也稱為“寬度優先搜索”,是通過搜索算法遍歷查找樹或圖的一種方式,它從根節點開始,依次訪問每個相鄰節點,并逐層地向下搜索。廣度優先算法的實現可以采用隊列數據結構。
/** * 廣度優先搜索 * @param graph 圖 * @param start 起點 * @param end 終點 */ public void bfs(int[][] graph, int start, int end) { Queuequeue = new LinkedList<>(); //隊列保存當前層節點 boolean[] visited = new boolean[graph.length]; //記錄已訪問節點 queue.offer(start); visited[start] = true; int level = 0; //層數 while (!queue.isEmpty()) { int size = queue.size(); level++; for (int i = 0; i< size; i++) { int curr = queue.poll(); for (int j = 0; j< graph.length; j++) { if (graph[curr][j] != 0 && !visited[j]) { if (j == end) { System.out.println("找到終點,距離為:" + level); return; } queue.offer(j); visited[j] = true; } } } } System.out.println("未找到終點"); }
深度優先算法
深度優先算法,也稱為“深度優先搜索”,是從一個子節點開始,不斷向下遍歷每一個分支,直到遇到沒有未被訪問的分支,此時回溯到上一個節點,重復以上操作,直至遍歷完整個樹或圖。深度優先算法的實現可以采用遞歸、棧等數據結構。
/** * 深度優先搜索 * @param graph 圖 * @param start 起點 * @param end 終點 */ public void dfs(int[][] graph, int start, int end) { boolean[] visited = new boolean[graph.length]; //記錄已訪問節點 dfsHelper(graph, start, end, visited, 0); } /** * 深度優先搜索的輔助方法 */ private void dfsHelper(int[][] graph, int curr, int end, boolean[] visited, int depth) { visited[curr] = true; if (curr == end) { System.out.println("找到終點,距離為:" + depth); return; } for (int i = 0; i< graph.length; i++) { if (graph[curr][i] != 0 && !visited[i]) { dfsHelper(graph, i, end, visited, depth + 1); } } }
在實際應用中,廣度優先算法通常適用于搜索最短路徑,如迷宮問題、網頁抓取等。而深度優先算法通常適用于搜索全部路徑或狀態,如八皇后問題、數獨問題等。