使用 Java Stream API 實現最小生成樹的 Kruskal克魯斯卡爾 演算法
Kruskal 演算法是一種流行的方法,用於查詢連通無向圖的最小生成樹 (MST)。該演算法的工作原理是按權重升序選擇邊,同時確保將邊新增到 MST 不會建立迴圈。在這篇博文中,我們將探討如何使用 Java Stream API 實現 Kruskal 演算法。
什麼是克魯斯卡爾Kruskal 演算法
在深入實現之前,我們先簡要討論一下 Kruskal 演算法所涉及的步驟:
- 1. 對邊進行排序:將圖中的所有邊按照其權重非降序進行排序。
- 2.初始化MST:建立一個空集來儲存MST的邊。
- 3. 迭代邊:按排序順序迭代所有邊。對於每條邊:
- - 如果將邊新增到 MST 不會建立環路,則將其新增到 MST。
- - 否則,丟棄邊緣。
- 4.輸出MST:新增到MST的邊集合形成最小生成樹。
使用Java Stream API實現
要使用Java Stream API實現Kruskal演算法,我們需要遵循以下步驟:
- 1. 定義一個類來表示圖中的一條邊,包括源、目的地和權重。
- 2. 建立一種根據權重對邊進行排序的方法。
- 3. 實現一種方法來查詢不相交集合中頂點的父級。
- 4. 使用Java Stream API 實現主要演算法。
讓我們從定義 Edge 類開始:
class Edge { |
接下來,我們建立一個方法來根據邊的權重對邊進行排序:
private static List<Edge> sortEdges(List<Edge> edges) { |
現在,我們需要實現一種方法來查詢不相交集合中頂點的父級。此方法對於檢測圖中的迴圈至關重要:
private static int findParent(int[] parent, int vertex) { |
最後,我們可以使用Java Stream API來實現主要演算法:
public static List<Edge> kruskalMST(List<Edge> edges, int vertices) { |
使用示例
以下是如何使用 kruskalMST 方法查詢圖的最小生成樹的示例:
public static void main(String[] args) { |
結論
在這篇博文中,我們討論瞭如何使用 Java Stream API 實現 Kruskal 演算法來查詢圖的最小生成樹。 Java Stream API 提供了一種簡潔且可讀的方式來處理集合,使其成為實現 Kruskal 演算法等演算法的合適選擇。