數據結構-深度優先搜索Java實現

目錄

  • 一、引言
  • 二、算法步驟
  • 三、原理演示
    • 遞歸實現
    • 非遞歸實現(使用堆棧)
  • 四、代碼實戰
  • 五、結論

一、引言

????深度優先搜索(DFS)是一種在圖或樹中進行搜索的算法,它沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。當節點v的所有邊都已探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中一個作為源節點并重復以上過程,整個進程反復進行直到所有節點都被訪問為止。
????DFS是一種盲目搜索,即它并不需要知道目標的位置,只是盡可能地遍歷所有可能的路徑。因此,它的搜索效率并不高,特別是在面對大規模數據時。然而,DFS可以找到目標值或解決目標問題,對于解決NP問題作用很大。
????此外,DFS如同數據結構中的棧結構,是一種后進先出的結構,導致了所有的點進入棧時有一個順序,我們稱之為 “DFS序”。

二、算法步驟

深度優先搜索算法的步驟如下:

  1. 選取圖中某一頂點Vi為出發點,訪問并標記該頂點。
  2. 以Vi為當前頂點,依次搜索Vi的每個鄰接點Vj,若Vj未被訪問過,則訪問和標記鄰接點Vj,若Vj已被訪問過,則搜索Vi的下一個鄰接點。
  3. 以Vj為當前頂點,重復步驟2),直到圖中和Vi有路徑相通的頂點都被訪問為止。
  4. 若圖中尚有頂點未被訪問過(非連通的情況下),則可任取圖中的一個未被訪問的頂點作為出發點,重復上述過程,直至圖中所有頂點都被訪問。

三、原理演示

遞歸實現

  1. 選擇起始節點:從圖中的一個起始節點開始,將該節點標記為已訪問。
  2. 遞歸探索鄰居節點:對于當前節點,遍歷它的鄰居節點。如果鄰居節點尚未被訪問,就遞歸地調用深度優先搜索函數,以此鄰居節點為新的起始節點,重復步驟1。
  3. 回溯:當當前節點的所有鄰居節點都被訪問后,回溯到上一個節點,并繼續遍歷其未被訪問的鄰居節點。
  4. 重復步驟2和3,直到圖中的所有節點都被訪問。

下面是遞歸實現深度優先搜索的示例代碼:

public void dfsRecursive(Node node, Set<Node> visited) {visited.add(node);System.out.print(node.value + " ");for (Node neighbor : node.neighbors) {if (!visited.contains(neighbor)) {dfsRecursive(neighbor, visited);}}
}

非遞歸實現(使用堆棧)

  1. 選擇起始節點:從圖中的一個起始節點開始,將該節點標記為已訪問,并將它入棧。
  2. 迭代遍歷:使用一個循環,不斷從棧中彈出節點,然后遍歷它的鄰居節點。
  3. 探索鄰居節點:對于當前彈出的節點,遍歷其鄰居節點。如果鄰居節點尚未被訪問,就將其標記為已訪問并將其入棧。
  4. 重復步驟2和3,直到棧為空。

下面是非遞歸實現深度優先搜索的示例代碼:

public void dfsIterative(Node start) {Stack<Node> stack = new Stack<>();Set<Node> visited = new HashSet<>();stack.push(start);visited.add(start);while (!stack.isEmpty()) {Node current = stack.pop();System.out.print(current.value + " ");for (Node neighbor : current.neighbors) {if (!visited.contains(neighbor)) {stack.push(neighbor);visited.add(neighbor);}}}
}

無論采用遞歸還是非遞歸方式,深度優先搜索的關鍵思想是深入到盡可能深的層級,直到無法再深入為止,然后回溯到上一個節點,繼續探索。這一過程不斷重復,直到遍歷整個圖。深度優先搜索對于解決路徑查找、拓撲排序、連通性檢測等問題都非常有用。

四、代碼實戰

以下是深度優先搜索算法的Java代碼實現:

import java.util.*;public class DFS {private int V; // 頂點數量private LinkedList<Integer> adj[]; // 鄰接表// 構造函數DFS(int v) {V = v;adj = new LinkedList[v];for (int i = 0; i < v; ++i) {adj[i] = new LinkedList();}}// 添加邊void addEdge(int v, int w) {adj[v].add(w);}// DFS函數void DFSUtil(int v, boolean visited[]) {// 標記當前節點為已訪問并輸出該節點visited[v] = true;System.out.print(v + " ");// 遞歸訪問與v節點相鄰的未訪問節點Iterator<Integer> i = adj[v].listIterator();while (i.hasNext()) {int n = i.next();if (!visited[n])DFSUtil(n, visited);}}// DFS函數void DFS(int v) {// 標記所有頂點為未訪問狀態boolean visited[] = new boolean[V];// 調用遞歸函數DFSUtil開始從頂點v進行DFS遍歷DFSUtil(v, visited);}
}

五、結論

我們一起來總結一下:
深度優先搜索在計算機科學中有著廣泛的應用,例如用于遍歷樹或圖的結構、查找路徑、解決優化問題等。它的優點在于空間復雜度相對較小,可以處理大規模的數據,同時可以避免搜索冗余的節點。然而,深度優先搜索也有其局限性,例如可能會陷入死循環或無法找到最優解,因此需要根據具體問題選擇合適的算法進行優化。
點贊收藏,富婆包養??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164991.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用C++從0到1實現人工智能神經網絡及實戰案例

引言 既然是要用C++來實現,那么我們自然而然的想到設計一個神經網絡類來表示神經網絡,這里我稱之為Net類。由于這個類名太過普遍,很有可能跟其他人寫的程序沖突,所以我的所有程序都包含在namespace liu中,由此不難想到我姓劉。在之前的博客反向傳播算法資源整理中,我列舉…

CTF-PWN-QEMU-前置知識

文章目錄 QEMU 內存管理(QEMU 如何管理某個特定 VM 的內存)MemoryRegion gpa->hpaFlatView&#xff1a;表示MR 樹對應的地址空間FlatRange&#xff1a;存儲不同MR對應的地址信息AddressSpace&#xff1a;不同類型的 MemoryRegion樹RAMBlock總體簡化圖 QEMU 設備模擬 &#x…

【Java進階開發實戰】用Java中的Base64數據加密與解密處理

簡介 ? Base64編碼,是我們程序開發中經常使用到的編碼方法。它是一種基于用64個可打印字符來表示二進制數據的表示方法。它通常用作存儲、傳輸一些二進制數據編碼方法, 也是MIME(多用途互聯網郵件擴展,主要用作電子郵件標準)中一種可打印字符表示二進制數據的常見編碼方法…

Proteus下仿真AT89C51報“串行口通信失敗,請檢查電平適配是否正確。”解決辦法

在Proteus下進行AT89C51串行口仿真時&#xff0c;如果遇到“串行口通信失敗&#xff0c;請檢查電平適配是否正確”的錯誤提示&#xff0c;以下是一些解決辦法&#xff1a; 1. 了解AT89C51和外部設備的電平要求&#xff1a; 首先&#xff0c;了解AT89C51和外部設備之間的電平…

【華為OD機試python】分班【2023 B卷|100分】

【華為OD機試】-真題 !!點這里!! 【華為OD機試】真題考點分類 !!點這里 !! 題目描述 幼兒園兩個班的小朋友在排隊時混在了一起,每位小朋友都知道自己是否與前面一位小朋友是否同班,請你幫忙把同班的小朋友找出來。 小朋友的編號為整數,與前一位小朋友同班用Y表示,不同班…

C語言——文件操作

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd; 我輩皆凡人&#xff0c;用一生鋪就的…

C++的new / delete 與 C語言的malloc/realloc/calloc / free 的講解

在C語言中我們通常會使用malloc/realloc/calloc來動態開辟的空間&#xff0c;malloc是只會開辟你提供的空間大小&#xff0c;并不會初始化內容&#xff1b;calloc不但會開辟空間&#xff0c;還會初始化&#xff1b;realloc是專門來擴容的&#xff0c;當你第一次開辟的空間不夠用…

目標檢測YOLO實戰應用案例100講-基于YOLO的小目標檢測改進算法(續)

目錄 3.3基于混合注意力的多尺度特征融合改進方法 3.3.1整體網絡架構 3.3.2特征金字塔的構建

Vue 2.0源碼分析-實例掛載的實現

Vue 中我們是通過 $mount 實例方法去掛載 vm 的&#xff0c;$mount 方法在多個文件中都有定義&#xff0c;如 src/platform/web/entry-runtime-with-compiler.js、src/platform/web/runtime/index.js、src/platform/weex/runtime/index.js。因為 $mount 這個方法的實現是和平臺…

Python 使用tkinter復刻Windows記事本UI和菜單功能(三)

上一篇&#xff1a;Python 使用tkinter復刻Windows記事本UI和菜單功能&#xff08;二&#xff09;-CSDN博客 下一篇&#xff1a;敬請耐心等待&#xff0c;如發現BUG以及建議&#xff0c;請在評論區發表&#xff0c;謝謝&#xff01; 本文章完成了記事本的新建、保存、另存、打…

【技巧】前端開發技巧 增加前端的請求緩存 提高開發效率

定義變量 /*** 開發緩存 開關* 說明* 方便開發使用 提升開發效率* true 打開緩存* false 關閉緩存 這里上線的時候必須改為* type {boolean}*/ const cacheFlag true/*** 排除某個url 方便開發時的數據實時生效* 這里根據開發到哪個功能 實時變更&#xff0c; 比如開…

京東數據分析(京東大數據):2023年10月京東手機行業品牌銷售排行榜

鯨參謀監測的京東平臺10月份手機市場銷售數據已出爐&#xff01; 根據鯨參謀平臺的數據顯示&#xff0c;今年10月份&#xff0c;京東平臺手機行業的銷量約340萬&#xff0c;環比增長約11%&#xff0c;同比則下滑約2%&#xff1b;銷售額為108億&#xff0c;環比增長約17%&#x…

請你說一下Vue中v-if和v-for的優先級誰更高

v-if 與 v-for簡介 v-ifv-forv-if & v-for使用 v-if 與 v-for優先級比較 vue2 中&#xff0c;v-for的優先級高于v-if 例子進行分析 vue3 v-if 具有比 v-for 更高的優先級 例子進行分析 總結 在vue2中&#xff0c;v-for的優先級高于v-if在vue3中&#xff0c;v-if的優先級高…

RubyMine 2023:提升Rails/Ruby開發效率的強大利器

在Rails/Ruby開發領域&#xff0c;JetBrains RubyMine一直以其強大的功能和優秀的性能而備受開發者的青睞。現如今&#xff0c;我們迎來了全新的RubyMine 2023版本&#xff0c;它將為開發者們帶來更高效的開發體驗和無可比擬的工具支持。 首先&#xff0c;RubyMine 2023提供了…

Java-使用poi-tl根據word模板動態生成word

作者wangsz&#xff0c;想寫一些關于word的工具&#xff0c;所以就寫了這篇文章 1.首先&#xff0c;先導入所需要的依賴&#xff08;poi相關依賴即可&#xff09; <!-- POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi&l…

【libGDX】使用Mesh繪制立方體

1 前言 本文主要介紹使用 Mesh 繪制立方體&#xff0c;讀者如果對 Mesh 不太熟悉&#xff0c;請回顧以下內容&#xff1a; 使用Mesh繪制三角形使用Mesh繪制矩形使用Mesh繪制圓形 在繪制立方體的過程中&#xff0c;主要用到了 MVP &#xff08;Model View Projection&#xff0…

目標檢測YOLO系列從入門到精通技術詳解100篇-【目標檢測】計算機視覺(最終篇)

目錄 知識儲備 KITTI數據集 1.KITTI數據集概述 2.數據采集平臺 3.Dataset詳述 算法原理

GIT無效的源路徑/URL

ssh-add /Users/haijunyan/.ssh/id_rsa ssh-add -K /Users/haijunyan/.ssh/id_rsa

windows11上enable WSL

Windows電腦上要配置linux&#xff08;這里指ubuntu&#xff09;開發環境&#xff0c;主要有三種方式&#xff1a; 1&#xff09;在windows上裝個虛擬機&#xff08;比如vmware&#xff09;。缺點是vmware加載ubuntu后系統會變慢很多&#xff0c;而且需要通過samba來實現window…

git clone -mirror 和 git clone 的區別

目錄 前言兩則區別git clone --mirrorgit clone 獲取到的文件有什么不同瘦身倉庫如何選擇結語開源項目 前言 Git是一款強大的版本控制系統&#xff0c;通過Git可以方便地管理代碼的版本和協作開發。在使用Git時&#xff0c;常見的操作之一就是通過git clone命令將遠程倉庫克隆…