【算法】最小生成樹—Prim算法與Kruskal算法

Prim算法和Kruskal算法都是解決最小生成樹問題的經典算法。最小生成樹是原圖的最小連通子圖,它包含原圖的全部結點,且保持圖連通的所有邊代價和最小。一個連通圖可能有多個最小生成樹。

一、Prim算法

含義

Prim算法,也被稱為普里姆算法,是圖論中的一種算法,主要用于在加權連通圖中搜索最小生成樹。這意味著通過Prim算法搜索到的邊子集所構成的樹中,不但包括了連通圖里的所有頂點,且其所有邊的權值之和亦為最小。
主要思想:從某個頂點開始,不斷選擇與當前生成樹相連的最小權值的邊,將其對應的頂點加入到生成樹中,直到所有頂點都加入到生成樹中為止

算法步驟

(1)初始狀態:U={u0},TE={}。其中,u0是頂點集合 V中的某一個頂點。
(2)在所有u屬于U,U屬于V-U的邊(u,v)屬于E中找一條權值最小的邊(u0,v0),將這條邊加進集合TE中,同時將此邊的另一頂點v0并入U。
這一步驟的作用是在邊集E里找一條兩個頂點分別在集合 U和V-U中且權值最小的邊,把這條邊添加到邊集 TE 中,并把這條邊上不在U中的那個頂點加入到U中。
13
(3)如果U=V,則算法結束;否則重復步驟(2)。

圖解

在這里插入圖片描述

一、Kruskal算法

含義

Kruskal算法是一種用來查找最小生成樹的算法,它使用的貪心準則是從剩下的邊中選擇不會產生環路且具有最小權值的邊加入到生成樹的邊集中。
主要思想:先對圖中的所有邊按照權值進行從小到大的排序,然后從小到大依次選取邊,若這條邊連接的兩個頂點不在同一個連通分量中,則將其加入生成樹中,否則舍棄,直到生成樹中包含所有頂點或者所有邊都已遍歷完

算法步驟

1、將圖中的所有邊按照權值從小到大進行排序。
2、初始化一個空的最小生成樹。
3、依次遍歷排序后的邊,判斷當前邊的兩個頂點是否在同一個連通分量中。如果不在同一個連通分量中,則將該邊加入最小生成樹中,并將這兩個頂點合并到同一個連通分量中。如果已經在同一個連通分量中,則跳過該邊,繼續遍歷下一條邊。
4、重復步驟3,直到最小生成樹中包含了所有的頂點,或者所有的邊都已經遍歷完畢。

圖解

在這里插入圖片描述

三、Prim算法和Kruskal算法的區別

1、時間復雜度
Prim算法的時間復雜度為O(V^2),其中V為頂點的個數;
而Kruskal算法的時間復雜度為O(ElogE),其中E為邊的個數。在E遠大于V的情況下,Kruskal算法更加高效。

2、實現方式
Prim算法可以使用鄰接矩陣或鄰接表來表示圖,并且需要使用堆來維護當前生成樹與剩余頂點之間的邊的權重。
Kruskal算法可以使用并查集來判斷加入的邊是否形成回路。

3、適用場景
Prim算法適用于稠密圖,即邊的數量接近于頂點數量的平方;
而Kruskal算法適用于稀疏圖,即邊的數量接近于頂點數量的線性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711366.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711366.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711366.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于移動端的食堂助餐在線點餐配送系統 uniapp微信小程序

本文從管理員、老人、配送員、食堂商家的功能要求出發,養老助餐管理系統小程序中的功能模塊主要是實現老人、配送員、食堂商家、食堂大廳、預約選座、餐號信息、美食信息、美食訂單、訂單信息、訂單配送、訂單評價、老人食堂、下單信息、飲食分析。經過認真細致的研…

C語言可以干些什么?C語言主要涉及哪些IT領域?

C語言可以干些什么?C語言主要涉及哪些IT領域? 在開始前我有一些資料,是我根據網友給的問題精心整理了一份「C語言的資料從專業入門到高級教程」, 點個關注在評論區回復“888”之后私信回復“888”,全部無償共享給大家…

我在爭什么?

本來想寫一下2024項目部人員該怎么干,還沒有寫出來,大家內部就先動起來。針對現有情況做了分析: 作為項目人員(實施,運維) 需要有一定自我認識 認識清楚公司要什么? 認識清楚我自己要什么&…

內網安裝redis+部署redis-cluster集群

一、安裝redis redis安裝包下載地址: https://download.redis.io/releases/ 1.1 解壓編譯并創建數據目錄 tar xzvf redis-6.2.10.tar.gz -C /usr/local/ cd /usr/local/ mv redis-6.2.10/ redis cd /usr/local/redis/ make #編譯 …

Springboot整合SSE實現實時消息推送

SSE詳細介紹傳送門:SSE實時消息推送 簡單描述一下SSE推送在實際項目中應用的常見場景 1,項目頁面中有消息通知板塊,當信息有變化時,只有手動刷新頁面,才會看到最新的數據,這里可以采用SSE技術實時推送最新…

Docker技術概論(1):Docker與虛擬化技術比較

Docker技術概論(1) Docker與虛擬化技術比較 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https:…

深入解析Android-AutoLayout,2024安卓開發面試題及答案

前言 如果你也學習Android,那么你大概率會看過我的文章。經常有讀者給我留言:“該怎么學習Android?”、“日常學習Android的方法是什么”。 所以,今天,我將獻上一份《Android知識圖譜》,以自身的經驗 &…

ABAP 發送帶EXCEL郵件

前言 沒啥特殊需求,就是有個庫齡報表用戶想整郵件發送 實現 用的最簡單的XLS文件作為excel附件發送出去 觀察XLS文件的純文本格式,每列之間用TAB制表符分隔,每行之間用回車符分隔 思路也比較明確,在SAP中實現這種格式&#xf…

.Net利用Microsoft.Extensions.DependencyInjection配置依賴注入

一、概述 為了讓接口程序更加模塊化和可測試,采用依賴注入的方式調用接口方法。 二、安裝Microsoft.Extensions.DependencyInjection 在NuGet里面搜索Microsoft.Extensions.DependencyInjection,并進行安裝。 三、代碼編寫 3.1 創建Service 實現類 /*****************…

【跨境電商須知】FP獨立站的特點和痛點有哪些?

無論是做獨立站,還是做亞馬遜,都有各自的難點。自己做獨立站若要在跨境行業長足發展,既要知道FP獨立站有什么特點,要清楚FP獨立站的痛點并一一克服。 一、FP獨立站的特點 與依賴第三方平臺相比,擁有自己的域名、服務器…

Doccano 修復 spacy.gold 的bug

引言 最初只是想把Doccano標注的數據集轉換成BIO(類似conll2003數據集)的標注格式; 摘要 可先閱讀一下教程:【已解決】關于如何將Doccano標注的文本轉換成NER模型可以直接處理的CoNLL 2003格式 裝包:pip install doccano-transformer 報錯信息 運行…

Adam優化算法

Adam算法(Adaptive Moment Estimation)是一種用于深度學習模型優化的算法,它結合了動量(Momentum)和RMSprop(Root Mean Square Propagation)的概念。Adam算法自2015年提出以來,因其高…

【前端素材】推薦優質后臺管理系統DAdmin平臺模板(附源碼)

一、需求分析 1、系統定義 后臺管理系統是一種用于管理網站、應用程序或系統的管理界面,通常由管理員和工作人員使用。它提供了訪問和控制網站或應用程序后臺功能的工具和界面,使其能夠管理用戶、內容、數據和其他各種功能。 2、功能需求 后臺管理系…

FreeCAD|讀取STEP、創建平面、相交、瓶子

FreeCAD是一個基于OpenCASCADE的開源CAD/CAE工具。OpenCASCADE是一套開源的CAD/CAM/CAE幾何模型核心,來自法國Matra Datavision公司,是著名的CAD軟件EUCLID的開發平臺。FreeCAD可運行于Windows以及Linux系統環境下,是一種通用的3D CAD建模工具…

記錄 關于navicat連接數據庫報錯1045的問題

重裝數據庫之后就連接不上了 報錯1045 而網上的解決方案大都是更改數據庫密碼,但是我在第一步就被卡住無法更改密碼,輸入指令也報錯,檢查的環境變量也沒錯,經過長時間的試錯終于找到解決了辦法 解決辦法 刪除data文件夾 如果無法…

積累:Qt 多種數據類型之間的轉換方法

前言 開發時經常涉及到數據類型的轉換,為方便溫故知新、提升開發效率,現將 Qt 開發部分常用的數據類型轉換方式形成工具文檔供查詢、參考。 1. int 轉 QString 1)函數:QString::number 2)函數原型 //將數字&#xff0…

LD: 利用Plink軟件進行連鎖不平衡計算和繪圖

輸入文件詳解 PLINK主要使用以下三種文件格式: .ped文件:文本文件,列出所有樣本的基因型數據。每行代表一個樣本,包含個體和家系信息,以及其對應的基因型數據。.map文件:文本文件,與.ped文件配合使用,列出了基因型數據中所有SNP的位置信息。每行代表一個SNP,包含染色…

Python:練習:輸出int值a占b的百分之幾。例如:輸入1和4,輸出:25%。

案例: 輸出int值a占b的百分之幾。例如:輸入1和4,輸出:25%。 思考: 所有的一步步思考,最后綜合起來。 首先,確定 輸出,那么就用input,而且是int值,所以肯定…

springboot2.6.5 下配置ForkJoinPool線程池大小

從java1.7開始,引入了parallelStream的方式使用ForkJoinPool多線程處理數據的方式,ForkJoinPool默認線程池大小是cpu內核數-1,并且可以通過以下方式配置線程池大小: System.setProperty("java.util.concurrent.ForkJoinPool…

C++設計模式_創建型模式_工廠方法模式

目錄 C設計模式_創建型模式_工廠方法模式 一、簡單工廠模式 1.1 簡單工廠模式引入 1.2 簡單工廠模式 1.3 簡單工廠模式利弊分析 1.4 簡單工廠模式的UML圖 二、工廠方法模式 2.1 工廠模式和簡單工廠模式比較 2.2 工廠模式代碼實現 2.3 工廠模式UML 三、抽象工廠模式 3.1 戰斗場景…