(Day 26) 最小生成樹 (Minimum Spanning Tree)
在前幾天,我們學習了最短路徑問題 (Shortest Path),例如 Dijkstra、Bellman-Ford、Floyd-Warshall、A*,今天要介紹的則是圖論中的另一個核心問題 —— 最小生成樹 (Minimum Spanning Tree, MST)
動態規劃 (Dynamic Programming; DP) 是一種將複雜問題分解為較小子問題,並儲存子問題解以避免重複計算的演算法設計方法。它常用於具有「重疊子問題」和「最優子結構」性質的問題
動態規劃的核心思想是: 將原問題拆解成多個子問題,先解決並記錄子問題的解,當需要時直接查詢,從而提升效率。這種方法通常用於遞迴解法會產生大量重複計算的情況
無使用動態規劃 (單純 Divide and Conquer)
package io.twcch;
import java.util.Scanner;
public class Demo {
public static long fibonacci(int index) {
if (index == 0) {return 0;}
if (index == 1) {return 1;}
return fibonacci(index - 1) + fibonacci(index - 2);
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter an index for a Fibonacci number: ");
int index = input.nextInt();
System.out.print("The Fibonacci number at index " + index + " is " + fibonacci(index));
}
}
使用動態規劃
package io.twcch;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Demo {
private static Map<Integer, Long> map = new HashMap<>();
public static long fibonacci(int index) {
if (map.containsKey(index)) {return map.get(index);}
if (index == 0) {return 0;}
if (index == 1) {return 1;}
long result = fibonacci(index - 1) + fibonacci(index - 2);
map.put(index, result);
return result;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("Enter an index for a Fibonacci number: ");
int index = input.nextInt();
System.out.print("The Fibonacci number at index " + index + " is " + fibonacci(index));
}
}
動態規劃是一種高效解決具有重疊子問題和最優子結構問題的強大工具。掌握動態規劃的思想和技巧,對於解決各類複雜演算法問題非常重要