Java算法之BFS,DFS,動態(tài)規(guī)劃和貪心算法的實現(xiàn)
前言
廣度優(yōu)先搜索(BFS)和深度優(yōu)先搜索(DFS)是圖遍歷算法中最常見的兩種算法,主要用于解決搜索和遍歷問題。動態(tài)規(guī)劃和貪心算法則用來解決優(yōu)化問題。
廣度優(yōu)先搜索
廣度優(yōu)先搜索算法是一種遍歷或搜索樹或圖的算法,它從根節(jié)點開始搜索并逐層向下擴展,直到找到目標狀態(tài)或所有節(jié)點都被遍歷。BFS通常使用隊列來實現(xiàn),它每次將下一個節(jié)點放入隊列中,直到所有的節(jié)點都被訪問。
下面是一個Java實現(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é)點開始遞歸地遍歷所有子樹,直到找到目標狀態(tài)或所有節(jié)點都被遍歷。DFS通常使用棧來實現(xiàn),它每次將下一個節(jié)點壓入棧中,直到所有的節(jié)點都被訪問。
下面是一個Java實現(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)子結構問題。DP通常用來解決優(yōu)化問題,例如最短路徑問題、背包問題等。
下面是一個Java實現(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)化問題的方法,它總是選擇當前最優(yōu)解。與動態(tài)規(guī)劃不同,貪心算法并沒有考慮所有的子問題,而是只看當前的最優(yōu)解。
下面是一個Java實現(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; } }
總結
在實際編程中,我們需要根據(jù)具體問題來選擇不同的算法,例如搜索問題可以使用BFS或DFS,優(yōu)化問題可以使用動態(tài)規(guī)劃或貪心算法。需要注意的是,貪心算法往往只適用于一些特定的情況,有時會得到次優(yōu)解或者錯誤解。因此,在使用貪心算法時需要仔細考慮問題和分析可能的情況。
到此這篇關于Java算法之BFS,DFS,動態(tài)規(guī)劃和貪心算法的實現(xiàn)的文章就介紹到這了,更多相關Java算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring之InitializingBean接口和DisposableBean接口的使用
這篇文章主要介紹了Spring之InitializingBean接口和DisposableBean接口的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01java實現(xiàn)漢字轉unicode與漢字轉16進制實例
這篇文章主要介紹了java實現(xiàn)漢字轉unicode與漢字轉16進制的實現(xiàn)方法,是Java操作漢字編碼轉換的一個典型應用,非常具有實用價值,需要的朋友可以參考下2014-10-10Spring Boot 集成 ElasticSearch應用小結
這篇文章主要介紹了Spring Boot 集成 ElasticSearch應用小結,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11Java中的動態(tài)數(shù)組和棧Vector Stack使用區(qū)別介紹
這篇文章主要為大家介紹了Java中的動態(tài)數(shù)組和棧Vector Stack使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10Mybatis工具類JdbcTypeInterceptor運行時自動添加jdbcType屬性
今天小編就為大家分享一篇關于Mybatis工具類JdbcTypeInterceptor運行時自動添加jdbcType屬性,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12