精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

91国内精品白嫩初高生| 国产精品影院在线| 99国产精品99久久久久久粉嫩| 亚洲国产高清高潮精品美女| 日本免费一级视频| 精品176二区| www.在线欧美| 国产一区二区丝袜高跟鞋图片| 久久黄色小视频| 欧美激情在线精品一区二区三区| 69堂国产成人免费视频| 激情综合在线观看| 成人日日夜夜| 国产午夜一区二区三区| 国产精品v欧美精品∨日韩| √资源天堂中文在线| 午夜精品一区二区三区国产 | 2023国产一二三区日本精品2022| 国产精品自拍偷拍视频| 日韩手机在线观看| 中文字幕乱码亚洲无线精品一区| 亚洲老头老太hd| 中文字幕第10页| 精品免费av一区二区三区| 亚洲图片欧美视频| 婷婷视频在线播放| 粉嫩一区二区三区国产精品| 9久草视频在线视频精品| 91在线免费看网站| 中文字幕av网站| 久久福利一区| 97精品伊人久久久大香线蕉| 国产波霸爆乳一区二区| 成人在线电影在线观看视频| 日韩成人在线网站| 国产午夜在线一区二区三区| 国产人与zoxxxx另类91| 精品视频色一区| 久久精品网站视频| 九色porny丨入口在线| 亚洲免费视频中文字幕| 亚洲最大色综合成人av| 国产高清一级毛片在线不卡| 97久久久精品综合88久久| 波多野结衣久草一区| 国产精品一级二级| 狠狠色狠狠色综合| 成人免费观看网址| 91精品国产乱码久久久久| 老司机午夜精品视频在线观看| 97超级碰碰碰| 久久免费激情视频| 99热免费精品在线观看| 久久免费少妇高潮久久精品99| 最新一区二区三区| 亚洲色图88| 久久久精品影院| 性色av无码久久一区二区三区| 99久精品视频在线观看视频| 综合网日日天干夜夜久久| 欧美做受高潮6| 奇米亚洲欧美| 伊人久久久久久久久久| 精品无码人妻一区二区免费蜜桃| 国产精品一区二区99| 一区二区三区无码高清视频| 波多野结衣一二三四区| 91亚洲一区| 久热在线中文字幕色999舞| 国产一二三区精品| 极品av少妇一区二区| 97免费中文视频在线观看| 人妻 日韩精品 中文字幕| 视频一区二区不卡| 国产在线拍偷自揄拍精品| 99久久精品国产一区色| 国产69精品久久久久777| 激情五月综合色婷婷一区二区| 亚洲欧美色视频| 久久久99久久| 黄频视频在线观看| 国产美女高潮在线观看| 日韩欧美第一页| 手机视频在线观看| 亚洲电影一区| 亚洲美女av网站| 亚洲 欧美 国产 另类| 自拍偷拍欧美专区| 91大神在线播放精品| 自拍偷拍色综合| 国产成人在线影院| 欧美日韩一区二区三区免费| 天堂а√在线资源在线| 亚洲动漫第一页| 九热视频在线观看| 99香蕉久久| 国产亚洲人成网站在线观看| 欧美成人综合色| 老司机久久99久久精品播放免费 | 亚洲天堂中文字幕在线观看| 亚洲免费伊人电影在线观看av| 日本女人性生活视频| 雨宫琴音一区二区在线| 国产精品久久久久7777婷婷| 国产成人a人亚洲精品无码| 久久青草欧美一区二区三区| 欧美a级黄色大片| 666av成人影院在线观看| 91精品国产乱码| 99久久久久久久久久| 午夜精品久久| 国产精品丝袜高跟| 国产又爽又黄网站亚洲视频123| 中文字幕在线观看不卡视频| 91专区在线观看| 日韩在线观看中文字幕| 在线成人中文字幕| www.国产成人| 成人自拍视频在线观看| 亚洲午夜在线观看| 欧美7777| 亚洲激情在线视频| 中文字幕亚洲欧美日韩| 日韩国产精品91| 久久精品国产99精品国产亚洲性色| 黄色网页在线播放| 欧美午夜免费电影| 男人操女人动态图| 国产毛片一区| 国产自产在线视频一区| 中国av在线播放| 69堂国产成人免费视频| 久久日免费视频| 麻豆成人精品| 精品免费视频123区| 四虎影视国产在线视频| 欧美一级午夜免费电影| 国产jizz18女人高潮| 视频一区免费在线观看| 麻豆91av| 在线天堂新版最新版在线8| 精品99久久久久久| 久久久久亚洲av成人片| 国产a精品视频| 欧美黄色免费网址| 亚洲一区网址| 欧美激情国产日韩精品一区18| 99久久婷婷国产一区二区三区| 国产精品乱码妇女bbbb| 亚洲精品成人在线播放| 香蕉国产精品| 91免费看蜜桃| 性欧美1819sex性高清大胸| 在线不卡欧美精品一区二区三区| 蜜桃av免费观看| 久久精品国产秦先生| 一区二区三区四区国产| 99久久这里有精品| 免费91麻豆精品国产自产在线观看| 一级片在线观看视频| 国产精品的网站| av噜噜在线观看| 图片小说视频色综合| 亚洲一区二区三区久久| 日本色护士高潮视频在线观看| 日韩欧美精品三级| 一级aaa毛片| 久久你懂得1024| 日本xxxxxxx免费视频| 成人综合一区| 97免费资源站| 新版的欧美在线视频| 亚洲天堂av在线播放| 乱子伦一区二区三区| 国产精品久久久久aaaa| 日批视频在线看| 宅男噜噜噜66国产日韩在线观看| 人偷久久久久久久偷女厕| 国产91精品在线| 久久99国产精品自在自在app| 丰满大乳国产精品| 色综合天天综合网天天看片| 国产wwwwxxxx| 国产91高潮流白浆在线麻豆| 黄www在线观看| 99视频精品全部免费在线视频| 91在线看网站| 88xx成人永久免费观看| 欧美精品在线播放| 青青久草在线| 91精品国产福利| 日日噜噜噜噜人人爽亚洲精品| 国产精品三级av| fc2成人免费视频| 美女国产一区二区三区| 国产xxxx振车| 第一sis亚洲原创| 国产色综合一区二区三区| 成人国产精品入口免费视频| 欧美激情a在线| 18视频免费网址在线观看| 精品99一区二区| 国产一区二区三区在线观看| 精品久久久久久久久久久久久久| 中文字幕第69页| 91影院在线免费观看| 99中文字幕在线| 日韩激情在线观看| 日本人体一区二区| 天天综合网91| 日本午夜精品电影| 风间由美中文字幕在线看视频国产欧美| 国产精品日韩欧美| 亚洲美女炮图| 欧美激情女人20p| 麻豆传媒视频在线观看| 亚洲色图偷窥自拍| 熟妇人妻一区二区三区四区 | 亚洲天堂a在线| 中文字幕av网址| 成人午夜碰碰视频| 黄色aaaaaa| 久久电影网站中文字幕| 日韩视频在线免费看| 一区二区毛片| 人人妻人人做人人爽| 欧美大片专区| 公共露出暴露狂另类av| 成人精品久久| 日本午夜一区二区三区| 啄木系列成人av电影| 精品一卡二卡三卡四卡日本乱码| 136福利精品导航| 91在线观看免费观看| 欧美亚洲二区| 国产欧美日韩高清| 国产精品xxx| 国产精品久久久久久久久免费看 | 91精品国产视频| 中文字幕一区二区三区精彩视频| 精品国产欧美日韩| 日韩国产在线一区| 成人6969www免费视频| 日韩精品不卡| 欧美一级精品片在线看| 日韩色妇久久av| 欧美日韩激情| 亚洲精品一区二| 日韩成人激情| 一区二区三区视频在线播放| 99精品视频精品精品视频| 亚洲视频电影| 亚洲色图欧美| 99热久久这里只有精品| 亚洲精品女人| 国产午夜福利视频在线观看| 久久久蜜桃一区二区人| 国产成人精品无码播放| 日本91福利区| 99九九99九九九99九他书对| 国产在线精品一区在线观看麻豆| 在线一区二区不卡| 粉嫩久久99精品久久久久久夜| 国内精品免费视频| 久久久一区二区| 精品一区二区三孕妇视频| 亚洲三级久久久| 国产性生活网站| 欧美日韩在线免费| 日韩xxx视频| 日韩一级精品视频在线观看| 黄色av网站免费在线观看| 亚洲免费高清视频| 精品麻豆一区二区三区| 欧美黑人巨大xxx极品| 成人福利av| 国产主播欧美精品| 成人另类视频| 日韩av不卡播放| 久久精品亚洲人成影院| 亚洲熟妇无码一区二区三区导航| 麻豆成人在线| 国内精品国产三级国产aⅴ久| 不卡av电影在线播放| 亚洲人成人无码网www国产| 国产精品久久久久久妇女6080| 加勒比av在线播放| 色哟哟国产精品| 国产a级免费视频| 日韩精品在线看| a视频在线观看免费| 5566成人精品视频免费| 国产午夜亚洲精品一级在线| 久久99精品国产99久久| 色天天久久综合婷婷女18| 久操网在线观看| 久久精品72免费观看| 日本一卡二卡在线| 亚洲欧洲一区二区在线播放| 欧美福利视频一区二区| 51久久夜色精品国产麻豆| 涩涩视频在线观看免费| 欧美成年人网站| 性欧美18一19sex性欧美| 91麻豆蜜桃| 国产精品久久天天影视| 久久无码高潮喷水| 国产a级毛片一区| 亚洲熟女少妇一区二区| 黄色精品一区二区| 成 人片 黄 色 大 片| 中文字幕在线看视频国产欧美| 蜜桃麻豆影像在线观看| 99re在线视频观看| 91欧美大片| 99热手机在线| 久久综合久久综合久久综合| 久久久美女视频| 在线播放视频一区| av在线电影网| 国产91在线高潮白浆在线观看| 国产精品白丝av嫩草影院| 看一级黄色录像| 六月丁香综合在线视频| 国产精品一二三区在线观看| 精品日本高清在线播放| 亚洲爱情岛论坛永久| 大胆欧美人体视频| 91麻豆精品| 正在播放一区| 另类专区欧美蜜桃臀第一页| 一级片手机在线观看| 欧美日韩精品国产| 天天爱天天干天天操| 久久久久久久久久亚洲| 日本少妇精品亚洲第一区| www亚洲国产| 国产综合色视频| 精品人妻伦九区久久aaa片| 欧美狂野另类xxxxoooo| 日本三级视频在线播放| 国产在线精品一区免费香蕉| 97精品国产福利一区二区三区| 日本新janpanese乱熟| 国产亚洲1区2区3区| 国产成人精品亚洲| 日韩亚洲综合在线| 99精品美女视频在线观看热舞| 亚洲亚洲精品三区日韩精品在线视频| 免费成人av资源网| 亚洲天堂网av在线| 日韩情涩欧美日韩视频| 欧美性video| 狠狠色噜噜狠狠色综合久| 香蕉亚洲视频| 人妻少妇无码精品视频区| 欧美视频在线一区二区三区| 日本在线免费网| 99电影网电视剧在线观看| 怡红院精品视频在线观看极品| 精品视频站长推荐| 欧美特黄级在线| 黄色毛片在线看| 国产欧美精品日韩| 午夜欧美精品久久久久久久| 中国免费黄色片| 精品久久中文字幕久久av| 国产中文字幕在线视频| 国产欧美日韩亚洲精品| 欧美日韩18| 在线观看日韩精品视频| 欧美丝袜丝交足nylons| 羞羞视频在线观看免费| 精品一区二区三区自拍图片区| 欧美一区=区| 欧美性生交大片| 亚洲国产欧美一区二区丝袜黑人| 天天免费亚洲黑人免费| 欧美日韩一级在线| 成人毛片老司机大片| 手机av免费观看| 久99九色视频在线观看| 亚洲欧美校园春色| 超碰成人在线播放| 亚洲成a人片在线观看中文| 精品视频一二三| 97超碰人人看人人| 亚久久调教视频| 日韩精品一区二区亚洲av性色| 亚洲精品一区二区三区福利| 国产成人精选| 国产人妻777人伦精品hd| 欧美国产欧美综合| 好吊色一区二区| 国产欧美欧洲在线观看| 一区二区久久| 深夜福利影院在线观看| 一区二区三区www| 久久久久观看| 中文 日韩 欧美|