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

Java算法之BFS,DFS,動態(tài)規(guī)劃和貪心算法的實(shí)現(xiàn)

 更新時間:2023年04月07日 08:29:05   作者:亮點(diǎn)菌  
廣度優(yōu)先搜索(BFS)和深度優(yōu)先搜索(DFS)是圖遍歷算法中最常見的兩種算法,主要用于解決搜索和遍歷問題。動態(tài)規(guī)劃和貪心算法則用來解決優(yōu)化問題。本文就來看看這些算法的具體實(shí)現(xiàn)吧

前言

廣度優(yōu)先搜索(BFS)和深度優(yōu)先搜索(DFS)是圖遍歷算法中最常見的兩種算法,主要用于解決搜索和遍歷問題。動態(tài)規(guī)劃和貪心算法則用來解決優(yōu)化問題。

廣度優(yōu)先搜索

廣度優(yōu)先搜索算法是一種遍歷或搜索樹或圖的算法,它從根節(jié)點(diǎn)開始搜索并逐層向下擴(kuò)展,直到找到目標(biāo)狀態(tài)或所有節(jié)點(diǎn)都被遍歷。BFS通常使用隊列來實(shí)現(xiàn),它每次將下一個節(jié)點(diǎn)放入隊列中,直到所有的節(jié)點(diǎn)都被訪問。

下面是一個Java實(shí)現(xiàn):

public void bfs(Node start) {
    Queue<Node> queue = new LinkedList<>();
    Set<Node> visited = new HashSet<>();

    queue.offer(start);
    visited.add(start);

    while (!queue.isEmpty()) {
        Node node = queue.poll();
        System.out.print(node.val + " ");

        for (Node neighbor : node.neighbors) {
            if (!visited.contains(neighbor)) {
                visited.add(neighbor);
                queue.offer(neighbor);
            }
        }
    }
}

深度優(yōu)先搜索

深度優(yōu)先搜索算法是一種遍歷或搜索樹或圖的算法,它從根節(jié)點(diǎn)開始遞歸地遍歷所有子樹,直到找到目標(biāo)狀態(tài)或所有節(jié)點(diǎn)都被遍歷。DFS通常使用棧來實(shí)現(xiàn),它每次將下一個節(jié)點(diǎn)壓入棧中,直到所有的節(jié)點(diǎn)都被訪問。

下面是一個Java實(shí)現(xiàn):

public void dfs(Node node, Set<Node> visited) {
    System.out.print(node.val + " ");
    visited.add(node);

    for (Node neighbor : node.neighbors) {
        if (!visited.contains(neighbor)) {
            dfs(neighbor, visited);
        }
    }
}

動態(tài)規(guī)劃

動態(tài)規(guī)劃算法(DP)是一種解決問題的方法,它用來解決重疊子問題和最優(yōu)子結(jié)構(gòu)問題。DP通常用來解決優(yōu)化問題,例如最短路徑問題、背包問題等。

下面是一個Java實(shí)現(xiàn):

public int knapsack(int[] weights, int[] values, int capacity) {
    int n = weights.length;
    int[][] dp = new int[n + 1][capacity + 1];

    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= capacity; j++) {
            if (weights[i - 1] <= j) {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1]);
            } else {
                dp[i][j] = dp[i - 1][j];
            }
        }
    }

    return dp[n][capacity];
}

貪心

貪心算法是一種解決優(yōu)化問題的方法,它總是選擇當(dāng)前最優(yōu)解。與動態(tài)規(guī)劃不同,貪心算法并沒有考慮所有的子問題,而是只看當(dāng)前的最優(yōu)解。

下面是一個Java實(shí)現(xiàn):

public int knapsack(int[] weights, int[] values, int capacity) {
    int n = weights.length;
    Item[] items = new Item[n];

    for (int i = 0; i < n; i++) {
        items[i] = new Item(weights[i], values[i]);
    }

    Arrays.sort(items, (a, b) -> b.valuePerWeight - a.valuePerWeight);

    int totalValue = 0;
    int remainingCapacity = capacity;

    for (Item item : items) {
        if (remainingCapacity >= item.weight) {
            totalValue += item.value;
            remainingCapacity -= item.weight;
        } else {
            totalValue += item.valuePerWeight * remainingCapacity;
            break;
        }
    }

    return totalValue;
}

class Item {
    int weight;
    int value;
    int valuePerWeight;

    public Item(int weight, int value) {
        this.weight = weight;
        this.value = value;
        this.valuePerWeight = value / weight;
    }
}

總結(jié)

在實(shí)際編程中,我們需要根據(jù)具體問題來選擇不同的算法,例如搜索問題可以使用BFS或DFS,優(yōu)化問題可以使用動態(tài)規(guī)劃或貪心算法。需要注意的是,貪心算法往往只適用于一些特定的情況,有時會得到次優(yōu)解或者錯誤解。因此,在使用貪心算法時需要仔細(xì)考慮問題和分析可能的情況。

到此這篇關(guān)于Java算法之BFS,DFS,動態(tài)規(guī)劃和貪心算法的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java中的JDK、JRE、JVM

    詳解Java中的JDK、JRE、JVM

    本文主要介紹了Java中的JDK、JRE、JVM的相關(guān)知識。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Java實(shí)現(xiàn)簡單掃雷程序

    Java實(shí)現(xiàn)簡單掃雷程序

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡單掃雷程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)

    Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn)

    這篇文章主要介紹了Java基礎(chǔ)之面向?qū)ο髾C(jī)制(多態(tài)、繼承)底層實(shí)現(xiàn),文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • java多線程編程之向線程傳遞數(shù)據(jù)的三種方法

    java多線程編程之向線程傳遞數(shù)據(jù)的三種方法

    在多線程的異步開發(fā)模式下,數(shù)據(jù)的傳遞和返回和同步開發(fā)模式有很大的區(qū)別。由于線程的運(yùn)行和結(jié)束是不可預(yù)料的,因此,在傳遞和返回數(shù)據(jù)時就無法象函數(shù)一樣通過函數(shù)參數(shù)和return語句來返回數(shù)據(jù)
    2014-01-01
  • Java中BigDecimal精度和相等比較的坑

    Java中BigDecimal精度和相等比較的坑

    BigDecimal是一種精確的數(shù)字類,一般用于高精度的開發(fā)領(lǐng)域中,例如銀行。下面這篇文章主要給大家介紹了關(guān)于Java中BigDecimal精度和相等比較的坑的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • SpringSecurity?用戶帳號已被鎖定的問題及解決方法

    SpringSecurity?用戶帳號已被鎖定的問題及解決方法

    這篇文章主要介紹了SpringSecurity?用戶帳號已被鎖定,本文給大家分享問題原因及解決方式,需要的朋友可以參考下
    2023-12-12
  • 關(guān)于@Bean的使用方式

    關(guān)于@Bean的使用方式

    這篇文章主要介紹了關(guān)于@Bean的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Java并發(fā)編程之性能、擴(kuò)展性和響應(yīng)

    Java并發(fā)編程之性能、擴(kuò)展性和響應(yīng)

    這篇文章主要介紹了Java并發(fā)編程之性能、擴(kuò)展性和響應(yīng),重點(diǎn)在于多線程應(yīng)用程序的性能問題,給性能和擴(kuò)展性下一個定義,然后再仔細(xì)學(xué)習(xí)一下Amdahl法則,感興趣的小伙伴們可以參考一下
    2016-02-02
  • java結(jié)束當(dāng)前循環(huán)常用代碼

    java結(jié)束當(dāng)前循環(huán)常用代碼

    在?Java中,當(dāng)我們要結(jié)束一個循環(huán)時,通常會使用循環(huán)變量的實(shí)現(xiàn)類來結(jié)束,但在實(shí)際開發(fā)中,我們經(jīng)常會遇到某個循環(huán)結(jié)束后需要進(jìn)行其他的操作的情況,在本文中給大家分享java結(jié)束當(dāng)前循環(huán)常用代碼,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記

    Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記

    這篇文章主要介紹了Java的web開發(fā)中SSH框架的協(xié)作處理應(yīng)用筆記,SSH是指Struts和Spring以及Hibernate的框架搭配,需要的朋友可以參考下
    2015-12-12

最新評論

舟曲县| 太谷县| 遵义市| 于都县| 股票| 马鞍山市| 柯坪县| 焉耆| 永仁县| 广平县| 清水县| 怀柔区| 神木县| 宝应县| 禹州市| 西华县| 南乐县| 黑龙江省| 余姚市| 文化| 北川| 古交市| 双流县| 集贤县| 大英县| 罗山县| 综艺| 昌邑市| 北宁市| 保靖县| 阿尔山市| 华蓥市| 手机| 含山县| 德阳市| 建平县| 东明县| 晋宁县| 多伦县| 德昌县| 尉犁县|