最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java圖搜索算法之DFS與BFS詳解

 更新時間:2021年11月09日 08:56:40   作者:愛敲代碼的小黃  
這篇文章主要為大家介紹了java數(shù)據(jù)結(jié)構(gòu)中可以秒殺一切圖算法的DFS與BFS作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助

你好,我是小黃,一名獨(dú)角獸企業(yè)的Java開發(fā)工程師。
感謝茫茫人海中我們能夠相遇,
俗話說:當(dāng)你的才華和能力,不足以支撐你的夢想的時候,請靜下心來學(xué)習(xí),
希望優(yōu)秀的你可以和我一起學(xué)習(xí),一起努力,實(shí)現(xiàn)屬于自己的夢想。

一、前言

上一篇文章我們提到了關(guān)于圖的形象化描述方法,不知道大家還有沒有印象。沒有印象的話,可以去看一下上期的內(nèi)容

對于圖來說,搜索的方法無外乎兩種,深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)

兩種搜索算法也不太相同,今天我們就來看一下這兩個搜索算法

二、深度優(yōu)先搜索

我們一提到深度優(yōu)先搜索,腦子里第一時間想到的就是遞歸

沒錯,深搜就是依靠遞歸的方法來進(jìn)行的搜索,我們來看一個例題:

在這里插入圖片描述

對于上圖來說,使用深度優(yōu)先搜索的路線為:0 -> 3 - > 2 -> 4 -> 5 -> 1

這里不懂深搜的小伙伴可以看下這篇:深度優(yōu)先搜索

遞歸版本:

	/**
     * 深度優(yōu)先搜索
     * 
     * @param node
     * @param set
     */
	public void DFS(Node node, Set<Node> set) {
        if (node == null) {
            return;
        }
        if (!set.contains(node)) {
            set.add(node);
            System.out.print(node.value + " ");
            for (Node node1 : node.nexts) {
                DFS(node1, set);
            }
        }
    }

迭代版本:

	/**
     * 深度優(yōu)先搜索
     *
     * @param node
     */
	public void DFS(Node node) {
        Stack<Node> stack = new Stack<>();
        Set<Node> set = new HashSet<>();
        stack.add(node);
        set.add(node);
        System.out.print(node.value + " ");
        while (!stack.isEmpty()) {
            Node cur = stack.pop();
            for (Node next : cur.nexts) {
                if (!set.contains(next)) {
                    stack.add(cur); // 用來做記憶化的
                    stack.add(next);
                    System.out.print(next.value + " ");
                    set.add(next);
                    break;
                }
            }
        }
    }

測試結(jié)果:

迭代版本:
0 3 2 4 5 1
遞歸版本:
0 3 2 4 5 1

三、廣度優(yōu)先搜索

對于廣度優(yōu)先搜索的話,簡單的來說,像走地圖一樣,一圈一圈的擴(kuò)展開來

我們來看一個例題:

在這里插入圖片描述

對于上圖來說,使用深度優(yōu)先搜索的路線為:0 -> 3 -> 1 -> 2 -> 4 -> 5

這里不懂廣搜的小伙伴可以看下這篇:廣度優(yōu)先搜索

	/**
     * 廣度優(yōu)先搜索
     *
     * @param node
     */
    public static void BFS(Node node) {
        if (node == null) {
            return;
        }
        Queue<Node> queue = new LinkedList<>();
        // 代表是否被使用
        Set<Node> set = new HashSet<>();
        queue.add(node);
        set.add(node);
        while (!queue.isEmpty()) {
            Node cur = queue.poll();
            System.out.print(cur.value + " ");
            for (Node next : cur.nexts) {
                if (!set.contains(next)) {
                    queue.add(next);
                    set.add(next);
                }
            }
        }
    }

四、結(jié)語

這期的深度優(yōu)先搜索和廣度優(yōu)先搜索比較簡單

讓你對圖的搜索大概有個了解,下幾期將會講解一些真實(shí)的算法

在算法題中,題目不會單純的讓你求深搜和廣搜,經(jīng)常會和別的一起出現(xiàn),比如最小生成樹等

以上就是java數(shù)據(jù)結(jié)構(gòu)圖算法之DFS與BFS詳解的詳細(xì)內(nèi)容,更多關(guān)于java數(shù)據(jù)結(jié)構(gòu)圖算法DFS與BFS的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java集合Stack源碼詳解

    Java集合Stack源碼詳解

    java工具包中的Stack是繼承于Vector(矢量隊(duì)列)的,由于Vector是通過數(shù)組實(shí)現(xiàn)的,這就意味著,Stack也是通過數(shù)組實(shí)現(xiàn)的,而非鏈表。當(dāng)然,我們也可以將LinkedList當(dāng)作棧來使用!
    2018-05-05
  • Java線程池ForkJoinPool(工作竊取算法)的使用

    Java線程池ForkJoinPool(工作竊取算法)的使用

    Fork就是把一個大任務(wù)切分為若干個子任務(wù)并行地執(zhí)行,Join就是合并這些子任務(wù)的執(zhí)行結(jié)果,最后得到這個大任務(wù)的結(jié)果。Fork/Join?框架使用的是工作竊取算法。本文主要介紹了ForkJoinPool的使用,需要的可以參考一下
    2022-11-11
  • SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁示例

    SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁示例

    本文介紹了SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Mybatis使用大于等于或小于等于進(jìn)行比較

    Mybatis使用大于等于或小于等于進(jìn)行比較

    本文主要介紹了Mybatis使用大于等于或小于等于進(jìn)行比較,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • springboot項(xiàng)目啟動自動跳轉(zhuǎn)到瀏覽器的操作代碼

    springboot項(xiàng)目啟動自動跳轉(zhuǎn)到瀏覽器的操作代碼

    這篇文章主要介紹了springboot項(xiàng)目啟動自動跳轉(zhuǎn)到瀏覽器的操作代碼,本文圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • spring redis 如何實(shí)現(xiàn)模糊查找key

    spring redis 如何實(shí)現(xiàn)模糊查找key

    這篇文章主要介紹了spring redis 如何實(shí)現(xiàn)模糊查找key的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring配置動態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法

    Spring配置動態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法

    這篇文章主要介紹了利用Spring配置動態(tài)數(shù)據(jù)源實(shí)現(xiàn)讀寫分離的方法,文中通過示例代碼介紹的很詳細(xì),相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,藕需要的朋友可以一起學(xué)習(xí)學(xué)習(xí)。
    2017-01-01
  • java Socket無法完全接收返回內(nèi)容的解決方案

    java Socket無法完全接收返回內(nèi)容的解決方案

    這篇文章主要介紹了java Socket無法完全接收返回內(nèi)容的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • spring?boot項(xiàng)目使用@Async注解的坑

    spring?boot項(xiàng)目使用@Async注解的坑

    這篇文章主要為大家介紹了spring?boot項(xiàng)目中使用@Async注解遇到的坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java黑科技:replace首個替換一秒搞定

    Java黑科技:replace首個替換一秒搞定

    要實(shí)現(xiàn)只替換第一個匹配項(xiàng),可以使用Java中的String類的replaceFirst方法,該方法接受兩個參數(shù),第一個參數(shù)是要替換的字符串或正則表達(dá)式,第二個參數(shù)是替換后的字符串,需要的朋友可以參考下
    2023-10-10

最新評論

通许县| 黄龙县| 凯里市| 和林格尔县| 广丰县| 花垣县| 永川市| 天等县| 西畴县| 霍州市| 涟水县| 铁力市| 保定市| 大余县| 滨州市| 颍上县| 高邮市| 昌黎县| 屯门区| 城固县| 淅川县| 镇江市| 嘉义市| 石棉县| 东乡县| 江安县| 邵武市| 昌江| 武鸣县| 邓州市| 碌曲县| 修文县| 分宜县| 民丰县| 安远县| 渭南市| 霍邱县| 从化市| 玛曲县| 鸡泽县| 平和县|