精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

算法系列之搜索算法-深度優(yōu)先搜索DFS

人工智能
DFS 是一種非常重要的圖遍歷算法,適用于許多場景。遞歸實(shí)現(xiàn)簡單直觀,但可能會(huì)受到棧深度的限制;迭代實(shí)現(xiàn)則避免了這個(gè)問題,但代碼稍復(fù)雜一些。根據(jù)具體需求選擇合適的實(shí)現(xiàn)方式。

隨著每年"金三銀四"招聘季的到來,許多求職者開始積極備戰(zhàn)面試。在眾多面試環(huán)節(jié)中,機(jī)試往往是不可或缺的一環(huán),而算法能力更是機(jī)試考核的重點(diǎn)。為此,我們特別推出算法系列文章,幫助大家系統(tǒng)復(fù)習(xí)算法知識(shí)。今天,我們將首先探討搜索算法中的重要內(nèi)容——深度度優(yōu)先搜索(DFS)。

圖的介紹

圖(Graph)是一種非線性的數(shù)據(jù)結(jié)構(gòu),由頂點(diǎn)(Vertex)和邊(Edge)組成。如下圖所示

_20250219193211.jpg分類如下:

  • 無向圖(Undirected Graph):邊沒有方向,表示雙向關(guān)系。
  • 有向圖(Directed Graph):邊有方向,表示單向關(guān)系。
  • 加權(quán)圖(Weighted Graph):邊帶有權(quán)重。
  • 無權(quán)圖(Unweighted Graph):邊沒有權(quán)重。

深度優(yōu)先搜索(DFS, Depth-First Search)

深度優(yōu)先搜索和廣度優(yōu)先搜索一樣,都是對圖進(jìn)行搜索的算法,目的也都是從起點(diǎn)開始搜索,直到到達(dá)頂點(diǎn)。深度優(yōu)先搜索會(huì)沿著一條路徑不斷的往下搜索,直到不能夠在繼續(xù)為止,然后在折返,開始搜索下一條候補(bǔ)路徑。

DFS 可以借助于棧或者來實(shí)現(xiàn)。棧具有”后進(jìn)先出(LIFO)”特性,可以是有棧或者遞歸來實(shí)現(xiàn)遍歷。其實(shí)現(xiàn)步驟如下:

  1. 訪問節(jié)點(diǎn):從起始節(jié)點(diǎn)開始,訪問當(dāng)前節(jié)點(diǎn)。
  2. 遞歸
  • 遞歸訪問鄰居:對于當(dāng)前節(jié)點(diǎn)的每一個(gè)未訪問過的鄰居節(jié)點(diǎn),遞歸地調(diào)用 DFS。
  • 回溯:當(dāng)沒有未訪問的鄰居時(shí),回溯到上一個(gè)節(jié)點(diǎn),繼續(xù)搜索其他路徑。
  • 使用 Stack 來模擬遞歸過程,每次從棧中彈出一個(gè)節(jié)點(diǎn)并訪問它,然后將未訪問的鄰居節(jié)點(diǎn)壓入棧中。

示例代碼如下:

/**
 * 深度優(yōu)先搜索示例
 */
public class DFSExample {
    // 定義圖的節(jié)點(diǎn)類
    static class Node {
        int value;
        List< Node> neighbors;

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

        // 添加鄰接節(jié)點(diǎn)
        public void addNeighbor( Node neighbor) {
            this.neighbors.add(neighbor);
        }
    }

    /**
     * 方式一 :棧實(shí)現(xiàn)
     * dfs 函數(shù)
     * @param startNode
     */
    public static void dfs( Node startNode) {

        if(startNode == null ) return;
        // 使用隊(duì)列存儲(chǔ)待訪問的節(jié)點(diǎn)
        Stack<Node> stack = new Stack<>();

        // 使用HashSet記錄已訪問的節(jié)點(diǎn)
        Set<Node> visited = new HashSet<>();
        // 將起點(diǎn)加入棧并標(biāo)記為已訪問
        stack.push(startNode);
        visited.add(startNode);
        // 遍歷棧
        while (!stack.isEmpty()){
             Node currentNode = stack.pop();
            System.out.println(currentNode.value);
            // 遍歷當(dāng)前節(jié)點(diǎn)的所有鄰接節(jié)點(diǎn)
            for (Node neighbor : currentNode.neighbors) {
                // 如果鄰接節(jié)點(diǎn)未被訪問,則加入棧并標(biāo)記為已訪問
                if (!visited.contains(neighbor)) {
                    stack.add(neighbor);
                    visited.add(neighbor);
                }
            }
        }

    }
    //方式二:遞歸實(shí)現(xiàn)
    public static void sec( Node currentNode,Set<Node> visited) {

        // 標(biāo)記當(dāng)前節(jié)點(diǎn)為已訪問
        visited.add(currentNode);
        System.out.println(currentNode.value);
        // 遞歸訪問所有未訪問的鄰居節(jié)點(diǎn)
        for (Node neighbor : currentNode.neighbors) {
            if (!visited.contains(neighbor))
                sec(neighbor, visited);
        }
    }

    /**
     *
     * @param args
     */
    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);
        Node node6 = new  Node(6);


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

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

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

        node4.addNeighbor(node3);
        node4.addNeighbor(node6);

        node5.addNeighbor(node2);
        node5.addNeighbor(node6);

        node6.addNeighbor(node3);
        node6.addNeighbor(node4);
        node6.addNeighbor(node5);
        //棧實(shí)現(xiàn)
        dfs(node1);
        System.out.println("+++++++++遞歸實(shí)現(xiàn)++++++++++++");
        //遞歸實(shí)現(xiàn)
        Set< Node> visited = new HashSet<>();
        sec(node1,visited);
    }
}

DFS的特點(diǎn)

  • 時(shí)間復(fù)雜度:O(V+E)
  • 空間復(fù)雜度:O(V)
  • 適用場景:連通性檢測、路徑查找、迷宮求解

DFS 示例題

以下列舉了一些機(jī)試題

廣播服務(wù)器

題目描述:給定一個(gè)大小為 N×N 的二維矩陣 matrix,表示 N 個(gè)服務(wù)器之間的連接情況。matrix[i][j] = 1 表示服務(wù)器i 和 j 直接連接,matrix[i][j] = 0 表示不直接連接。計(jì)算初始需要給幾臺(tái)服務(wù)器廣播,才能使每個(gè)服務(wù)器都收到廣播。 輸入:N 行,每行 N 個(gè)數(shù)字(0 或 1),表示 N×N 的二維矩陣。 輸出:需要廣播的服務(wù)器的數(shù)量。

示例一: 輸入: 

1 0 0 

0 1 0

 0 0 1 

輸出:3

示例二: 輸入: 

1 1 

1 1 

輸出:1

public class DFSServer {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] firstLine = scanner.nextLine().split(" ");
        int n = firstLine.length;
        //初始化二維數(shù)組
        int[][] matrix = new int[n][n];
        for (int i = 0; i < n; i++) {
            String[] line = i==0 ? firstLine:scanner.nextLine().split(" ");
            for (int j = 0; j < n; j++) {
                matrix[i][j] = Integer.parseInt(line[j]);
            }
        }
        //初始化標(biāo)記數(shù)組
        int[] check = new int[n];
        //需要廣播的服務(wù)器的數(shù)量
        int ans = 0;
        Stack<Integer> stack = new Stack<>();
        // 遍歷每個(gè)服務(wù)器
        for (int i = 0; i < n; i++) {
            // 如果服務(wù)器 i 沒有被訪問過,就以它為起點(diǎn)進(jìn)行 DFS
            if (check[i] == 0) {
                ans++; // 新的連通分量,計(jì)數(shù)器加 1
                stack.add(i); // 將當(dāng)前服務(wù)器加入棧
                check[i] = 1; // 標(biāo)記為已訪問

                // 開始 DFS
                while (!stack.isEmpty()) {
                    // 彈出當(dāng)前服務(wù)器
                    int cur = stack.pop();
                    // 遍歷所有服務(wù)器,找到與 cur 相連且未訪問的服務(wù)器
                    for (int j = 0; j < n; j++) {
                        if (j != cur && matrix[cur][j] == 1 && check[j] == 0) {
                            // 將未訪問的服務(wù)器加入棧
                            stack.push(j);
                            // 將未訪問的服務(wù)器加入棧
                            check[j] = 1;
                        }
                    }
                }
            }
        }

        System.out.println(ans);

    }
}

總結(jié)

DFS 是一種非常重要的圖遍歷算法,適用于許多場景。遞歸實(shí)現(xiàn)簡單直觀,但可能會(huì)受到棧深度的限制;迭代實(shí)現(xiàn)則避免了這個(gè)問題,但代碼稍復(fù)雜一些。根據(jù)具體需求選擇合適的實(shí)現(xiàn)方式。

責(zé)任編輯:武曉燕 來源: 修己xj
相關(guān)推薦

2021-04-28 07:59:21

深度優(yōu)先搜索

2020-10-17 11:14:19

數(shù)據(jù)結(jié)構(gòu)與算法系列

2012-02-29 13:32:28

Java

2023-05-30 07:58:01

谷歌搜索算法

2017-03-20 13:09:33

Swift廣度優(yōu)先搜索手游開發(fā)

2018-10-12 15:15:45

電商搜索算法

2019-03-29 09:40:38

數(shù)據(jù)結(jié)構(gòu)算法前端

2012-08-24 09:16:53

App Store

2023-04-14 08:07:20

數(shù)據(jù)結(jié)構(gòu)算法搜索

2013-04-23 09:31:52

SQL Server

2023-02-09 07:39:01

2021-11-10 09:17:18

程序員排序算法搜索算法

2023-11-30 10:02:45

2022-09-24 09:03:55

前端單元測試冒泡排序

2021-09-04 23:40:53

算法程序員前端

2019-10-29 15:22:24

Google算法搜索

2022-11-22 08:00:00

開源工具數(shù)據(jù)集

2012-06-27 10:05:55

App Store搜索算法

2021-11-03 15:01:50

算法開源技術(shù)

2024-05-29 13:29:47

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲免费在线观看av| 国产黄色一区二区三区| av中文字幕在线| 国模少妇一区二区三区| 久久久免费精品视频| 国产网站无遮挡| 日韩经典一区| 亚洲一二三区不卡| 日韩电影大全在线观看| 亚洲成a人片77777精品| 玖玖精品视频| 久久99国产精品久久久久久久久| 中文字幕日韩三级片| 国产伊人久久| 天天色综合成人网| 一个色的综合| 久草视频视频在线播放| 国产福利一区二区三区视频在线| 日韩av高清不卡| 九九视频免费看| 狠狠做六月爱婷婷综合aⅴ| 精品国产污污免费网站入口| 日本三级黄色网址| 在线视频cao| 亚洲永久精品大片| 亚洲成人午夜在线| 亚洲三区在线播放| 成人免费视频视频在线观看免费 | 亚洲国产精品电影在线观看| 一起操在线视频| 久久人体大尺度| 亚洲午夜久久久| 一本一本久久a久久精品综合妖精| 天堂网av在线播放| 国产精品18久久久久| 91精品国产综合久久香蕉最新版 | 日本免费网站视频| 国产精品美女久久久久久不卡| 精品国精品国产| aaaaaaaa毛片| 91麻豆精品| 欧美日韩在线观看一区二区 | 国产中文一区二区三区| 国产精品久久国产精品99gif| 青青操免费在线视频| 在线看片一区| 97色在线观看免费视频| 日本一二三区视频| 在线欧美福利| 97色在线观看| 国产精品国产三级国产专区52 | 99视频在线免费| 亚洲深夜视频| 黄色成人av在线| 少妇av一区二区三区无码| 男男gaygays亚洲| 一区二区三区在线视频观看| 久久国产精品免费观看| 综合久久2019| 亚洲永久免费视频| 男女私大尺度视频| 黄色视屏在线免费观看| 精品电影在线观看| 黄www在线观看| 不卡福利视频| 精品视频在线免费观看| 日日躁夜夜躁aaaabbbb| 亚洲精品aaa| 欧美一区日韩一区| 男人添女人荫蒂国产| 日韩成人在线看| 亚洲国产中文字幕久久网| 99久久人妻精品免费二区| 久久99国内| 丝袜美腿亚洲一区二区| 黄色a级片在线观看| 国产综合精品一区| 91精品国产91| 中文人妻熟女乱又乱精品| 卡一卡二国产精品| 成人91视频| 日本成人一区二区三区| 国产亚洲精品福利| 手机看片日韩国产| av资源网在线播放| 欧美三级电影精品| 老熟女高潮一区二区三区| 蜜桃久久久久| 日韩中文字幕亚洲| 日韩男人的天堂| 欧美aaaaaa午夜精品| 亚洲bt天天射| 日本电影一区二区在线观看| 国产精品三级视频| 成人免费在线网| www.com.cn成人| 欧美一级黄色大片| 黄瓜视频污在线观看| 我不卡神马影院| 欧美在线一区二区三区四| 在线观看色网站| eeuss国产一区二区三区| 日韩欧美亚洲日产国| 久草成色在线| 欧美群妇大交群中文字幕| 亚洲啪av永久无码精品放毛片| 狠狠操综合网| 91国产在线精品| 国产女人18毛片水真多| 91丝袜高跟美女视频| 国产又粗又大又爽的视频| 国产高清不卡| 亚洲精品一线二线三线无人区| 国产综合精品久久久久成人av | 国产野外作爱视频播放| 成人香蕉社区| 久热精品在线视频| 国产亚洲欧美日韩高清| 成人黄页毛片网站| 一级黄色免费在线观看| 日韩欧美2区| 亚洲精品国产综合久久| 91精品国产高清一区二区三蜜臀| 日韩在线a电影| 久久99欧美| 超碰中文在线| 日韩欧美成人一区二区| 国产又粗又长又黄的视频| 男女精品网站| 久久久久久亚洲精品不卡4k岛国| 18+视频在线观看| 欧美日本一区二区三区| 国产综合精品久久久久成人av| 亚洲欧美久久| 久久精品ww人人做人人爽| 成人高潮aa毛片免费| 日韩欧美视频在线| 2018天天弄| 国产美女主播视频一区| 亚洲永久激情精品| 中韩乱幕日产无线码一区| 亚洲午夜色婷婷在线| 日本一本在线观看| 国产喂奶挤奶一区二区三区| 国产精品69页| 日韩理论电影大全| 国产精品久久久亚洲| 国产高清免费在线播放| 91久久久免费一区二区| 无码人妻丰满熟妇啪啪欧美| 日本亚洲一区二区| 亚洲免费久久| 在线高清欧美| 欧美国产在线视频| 六月婷婷综合网| 亚洲成人激情av| 成年人网站免费看| 丝袜美腿亚洲色图| 中日韩在线视频| www.成人| 久久男人资源视频| 天天操天天舔天天干| 欧美性高跟鞋xxxxhd| 免费看黄色的视频| 另类中文字幕网| 日韩视频 中文字幕| av自拍一区| 青青久久aⅴ北条麻妃| 国产女主播在线直播| 3d成人动漫网站| 久久久精品视频在线| 2017欧美狠狠色| 亚洲一级片网站| 中文字幕一区二区三区乱码图片| 成人欧美一区二区三区在线观看| 都市激情国产精品| 中文字幕免费精品一区| 国产chinasex对白videos麻豆| 亚洲线精品一区二区三区 | 亚洲乱码精品久久久久..| 天天免费综合色| 亚洲a∨无码无在线观看| 国产精品一区二区三区网站| 青青草成人免费在线视频| 精品视频99| 99久久99久久| 欧美中文字幕精在线不卡| 久久精品免费电影| 性猛交xxxx| 91精品国产综合久久久久| 亚洲欧美综合另类| 日韩一区欧美一区| 人妻无码一区二区三区| 久久99热这里只有精品| 日韩少妇内射免费播放| 亚洲精品网址| 蜜桃麻豆www久久国产精品| 99国内精品久久久久| 91精品国产91久久久久久不卡| 91高清在线视频| 亚洲国产精品久久久久秋霞蜜臀| 中文字幕一区二区免费| 午夜私人影院久久久久| 国产美女久久久久久| 久久久久久综合| 日本久久久久久久久久| 免费久久精品视频| 99精品在线免费视频| 最新精品国产| 亚洲欧美国产不卡| 秋霞蜜臀av久久电影网免费| 96pao国产成视频永久免费| 黑人巨大亚洲一区二区久| 久久久久久久久久国产| 日本成人在线播放| 亚洲一区第一页| 三级理论午夜在线观看| 日韩精品自拍偷拍| 国产精品视频久久久久久| 91国产精品成人| 91video| 亚洲尤物在线视频观看| www深夜成人a√在线| 久久久国际精品| 亚洲av人人澡人人爽人人夜夜| 国产在线观看免费一区| 视频在线观看免费高清| 美国三级日本三级久久99| 欧美激情国产精品日韩| 亚洲国内自拍| 给我免费播放片在线观看| 综合激情婷婷| 日本一二三区视频在线| 国产大片一区| 中文字幕在线亚洲三区| 久久理论电影| 亚洲人成网站在线播放2019| 国产亚洲一区| 日韩av电影免费播放| 欧美挤奶吃奶水xxxxx| 国产一区二区免费在线观看| 国产精品久久久久av蜜臀| 成人三级视频在线观看一区二区| 国产精品1区在线| 91黄色国产视频| 清纯唯美激情亚洲| 亚洲一区二区在线播放| 日本在线成人| 国产 高清 精品 在线 a| 国产精品极品在线观看| 久久99精品久久久久久水蜜桃| 亚洲电影男人天堂| 欧美性大战久久久久| 精品美女久久| 一区二区三区国产福利| 欧美日韩国产精品一区二区亚洲| 日韩精品福利片午夜免费观看| 欧美日韩国产免费观看| 国产资源在线免费观看| 99国产精品久久久久久久成人热 | 国产精久久久久久| 精品国产户外野外| 日本黄色中文字幕| 欧美挠脚心视频网站| www.好吊色| 日韩av在线一区| 国产人成在线观看| 久久亚洲精品国产亚洲老地址| 日韩少妇视频| 欧美一性一乱一交一视频| 高清欧美日韩| 91丝袜脚交足在线播放| 日韩精品免费一区二区三区竹菊| 日韩精彩视频| 欧美三级小说| 久久久久狠狠高潮亚洲精品| 美女尤物国产一区| 黄页网站在线看| 国产清纯在线一区二区www| 久久国产波多野结衣| 五月综合激情日本mⅴ| 国产精品传媒在线观看| 欧美一级xxx| 久久免费看视频| 美女少妇精品视频| 伊人网在线播放| 国产精品视频免费在线观看| 中文字幕一区二区三区四区久久 | 色黄视频免费看| 91蜜桃在线免费视频| 日韩在线不卡av| 婷婷综合在线观看| 91九色蝌蚪91por成人| 亚洲成人网av| 免费在线视频欧美| 欧洲精品在线视频| 日本免费一区二区视频| 欧美综合激情| 国产字幕视频一区二区| 99sesese| 久久综合给合久久狠狠狠97色69| 欧美一级特黄高清视频| 日本道色综合久久| 四虎永久在线观看| 欧美成人四级hd版| av在线日韩| 精品一区日韩成人| 欧美日韩国产探花| 亚洲成人天堂网| 99精品国产热久久91蜜凸| 一级黄色录像视频| 欧美日韩精品是欧美日韩精品| 五月天激情婷婷| 欧美黑人性生活视频| 久久久久伊人| 品久久久久久久久久96高清| 国内精品美女在线观看| 思思久久精品视频| 国产精品久久毛片| 成人a v视频| 亚洲欧美国产制服动漫| 国模精品视频| 国产精品一区二区三区不卡| 国产精品99视频| 男人搞女人网站| 久久久.com| 毛片基地在线观看| 日韩精品高清在线观看| 7777kkk亚洲综合欧美网站| 亚洲一区中文字幕在线观看| 欧美超碰在线| 黄色在线视频网| 中文字幕二三区不卡| 无码人妻丰满熟妇区五十路 | 亚洲av无码一区二区二三区| 亚洲线精品一区二区三区八戒| 性猛交xxxx乱大交孕妇印度| 久久天天躁狠狠躁夜夜躁2014| 国产精品99久久久久久董美香| 日日噜噜噜噜夜夜爽亚洲精品| 亚洲深夜激情| 亚洲天堂网一区二区| 懂色aⅴ精品一区二区三区蜜月 | 精品国产一区二区三区久久久| 成人在线不卡| 色中文字幕在线观看| 激情综合色综合久久综合| 久久福利免费视频| 欧美一级高清大全免费观看| 超碰最新在线| 成人91免费视频| 夜夜嗨网站十八久久 | 国内黄色精品| 婷婷激情四射五月天| 成人免费在线播放视频| av免费观看网址| 久久人91精品久久久久久不卡| 理论片一区二区在线| 午夜精品久久久内射近拍高清 | 国产v综合v亚洲欧| 日本三级中文字幕| 亚洲视频在线播放| 欧美激情不卡| 日本天堂免费a| 99在线精品观看| 国内av在线播放| 久久成人亚洲精品| 噜噜噜狠狠夜夜躁精品仙踪林| heyzo国产| 国产精品久久久久久久久免费桃花| 91成人在线免费| 久久久久久999| 精品国产91久久久久久浪潮蜜月| 在线观看亚洲色图| 亚洲一区二区欧美日韩| 欧美xxx.com| 91免费人成网站在线观看18| 影院欧美亚洲| 先锋影音av在线| 日韩精品一区国产麻豆| 日本免费久久| 无码人妻精品一区二区三区99v| av在线综合网| 91女人18毛片水多国产| 午夜免费在线观看精品视频| av一区二区在线观看| 无码人妻丰满熟妇啪啪网站| 色欧美片视频在线观看在线视频| 好了av在线| 欧美中日韩一区二区三区| 国产成人午夜视频| 高潮毛片又色又爽免费 | 高端美女服务在线视频播放| 性欧美videosex高清少妇| 高清国产午夜精品久久久久久| 日本免费精品视频| 久久免费视频在线观看| 欧美3p视频| xxx在线播放| 亚洲二区在线播放视频|