在这个数å—化的时代,我们常常需è¦åœ¨å¤æ‚çš„ç½‘ç»œä¸æ‰¾åˆ°æœ€ä¼˜è§£ã€‚æƒ³è±¡ä¸€ä¸‹ï¼Œä½ æ£ç«™åœ¨ä¸€ç‰‡é”æ³•æ£®æž—çš„è¾¹ç¼˜ï¼Œä½ çš„ä»»åŠ¡æ˜¯ç”¨æœ€å°‘çš„é”æ³•能é‡è¿žæŽ¥æ£®æž—ä¸çš„æ‰€æœ‰ç¥žå¥‡æ ‘木。这就是普里姆算法è¦è§£å†³çš„é—®é¢˜ï¼Œå®ƒå°±åƒæ˜¯ä¸€ä½ç²¾æ˜Žçš„æ£®æž—å‘导,带领我们用最çœåŠ›çš„æ–¹å¼æŽ¢ç´¢æ•´ç‰‡æ£®æž—ã€‚è®©æˆ‘ä»¬ä¸€èµ·è¸ä¸Šè¿™æ®µå¥‡å¦™çš„æ—…程,æå¼€æ™®é‡Œå§†ç®—法的神秘é¢çº±ï¼
🎠åºå¹•:算法的舞å°
æ™®é‡Œå§†ç®—æ³•ï¼Œè¿™ä½æ¥è‡ªå›¾è®ºä¸–ç•Œçš„é”æ³•师,其主è¦ä»»åŠ¡æ˜¯åœ¨ä¸€ä¸ªåŠ æƒæ— å‘图䏿‰¾åˆ°ä¸€æ£µæœ€å°ç”Ÿæˆæ ‘。这å¬èµ·æ¥å¯èƒ½æœ‰ç‚¹æŠ½è±¡ï¼Œè®©æˆ‘ä»¬ç”¨æ›´ç”ŸåŠ¨çš„æ–¹å¼æ¥ç†è§£å®ƒï¼š
æƒ³è±¡ä½ æ˜¯ä¸€ä¸ªåŸŽå¸‚è§„åˆ’å¸ˆï¼Œä½ çš„ä»»åŠ¡æ˜¯ç”¨æœ€å°‘çš„æˆæœ¬å°†åŸŽå¸‚ä¸çš„æ‰€æœ‰å»ºç‘连接起æ¥ã€‚æ¯æ¡å¯èƒ½çš„é“路都有ä¸åŒçš„å»ºè®¾æˆæœ¬ï¼ˆè¿™å°±æ˜¯æˆ‘们说的”åŠ æƒ”ï¼‰ï¼Œè€Œä½ éœ€è¦æ‰¾åˆ°ä¸€ç§æ–¹æ¡ˆï¼Œæ—¢èƒ½è¿žæŽ¥æ‰€æœ‰å»ºç‘,åˆèƒ½ä½¿æ€»æˆæœ¬æœ€å°ã€‚这就是普里姆算法所è¦è§£å†³çš„问题。
🧙â€â™‚ï¸ ç¬¬ä¸€å¹•ï¼šç®—æ³•çš„é”æ³•å’’è¯
æ™®é‡Œå§†ç®—æ³•çš„æ ¸å¿ƒæ€æƒ³å¯ä»¥æ¦‚æ‹¬ä¸ºä»¥ä¸‹å‡ ä¸ªæ¥éª¤ï¼š
- 选择任æ„一个起点(就åƒé€‰æ‹©ä¸€ä¸ªå»ºç‘å¼€å§‹ä½ çš„è§„åˆ’ï¼‰ã€‚
- 寻找与当å‰å·²è¿žæŽ¥å»ºç‘相邻的最便宜的é“路。
- 沿ç€è¿™æ¡é“路连接新的建ç‘。
- é‡å¤æ¥éª¤2å’Œ3,直到所有建ç‘都被连接。
è¿™ä¸ªè¿‡ç¨‹å°±åƒæ˜¯ä¸€ä¸ªä¸æ–ç”Ÿé•¿çš„æ ‘ï¼Œæ¯æ¬¡éƒ½é€‰æ‹©æœ€ç»æµŽçš„æ–¹å¼æ¥æ‰©å±•自己的æžå¶ï¼Œç›´åˆ°è¦†ç›–了整个城市。
🎬 第二幕:算法的精彩表演
è®©æˆ‘ä»¬ç”¨ä¸€ä¸ªå…·ä½“çš„ä¾‹åæ¥å±•ç¤ºæ™®é‡Œå§†ç®—æ³•çš„é”力:
graph LR
A((A. ) --- |2| B((B))✅
A --- |6| D((D. )✅
B --- |3| C((C. )✅
B --- |8| D
B --- |5| E((E. )✅
C --- |7| E
D --- |9| E
在这个图ä¸ï¼Œæ¯ä¸ªå—æ¯ä»£è¡¨ä¸€ä¸ªå»ºç‘,连线上的数å—代表建设é“è·¯çš„æˆæœ¬ã€‚çŽ°åœ¨ï¼Œè®©æˆ‘ä»¬ä¸€æ¥æ¥åœ°åº”用普里姆算法:
- 我们从A开始。
- A有两个选择:连接B. ¼ˆæˆæœ¬2)或Dï¼ˆæˆæœ¬6ï¼‰ã€‚æˆ‘ä»¬é€‰æ‹©æˆæœ¬è¾ƒä½Žçš„B。✅
- çŽ°åœ¨æˆ‘ä»¬çš„æ ‘åŒ…å«äº†Aå’ŒB. €‚下一æ¥ï¼Œæˆ‘们å¯ä»¥é€‰æ‹©Cï¼ˆæˆæœ¬3),Dï¼ˆæˆæœ¬8),或Eï¼ˆæˆæœ¬5)。我们选择C。✅
- æ ‘çŽ°åœ¨åŒ…å«A. €Bå’ŒC。下一个最便宜的选择是将B连接到Eï¼ˆæˆæœ¬5)。✅
- 最åŽï¼Œæˆ‘们将A连接到D. ¼ˆæˆæœ¬6)。✅
最终的最å°ç”Ÿæˆæ ‘如下:
graph LR
A((A. ) --- |2| B((B))✅
A --- |6| D((D. )✅
B --- |3| C((C. )✅
B --- |5| E((E. )✅
æ€»æˆæœ¬ä¸ºï¼š2 + 3 + 5 + 6 = 16
è¿™å°±æ˜¯æ™®é‡Œå§†ç®—æ³•çš„é”æ³•ï¼å®ƒå¸®åŠ©æˆ‘ä»¬ç”¨æœ€å°çš„æ€»æˆæœ¬è¿žæŽ¥äº†æ‰€æœ‰çš„建ç‘。
🎠第三幕:算法的内在美
普里姆算法的优雅之处在于它的贪心ç–略。在æ¯ä¸€æ¥ï¼Œå®ƒéƒ½åšå‡ºå½“å‰çœ‹èµ·æ¥æœ€å¥½çš„选择,而ä¸è€ƒè™‘未æ¥çš„å½±å“。这ç§ç–略在很多情况下都能得到全局最优解,这就是它的é…力所在。
让我们用数å¦è¯è¨€æ¥æè¿°è¿™ä¸ªè¿‡ç¨‹ï¼š
设 $G = (V, E. $ æ˜¯ä¸€ä¸ªå¸¦æƒæ— å‘å›¾ï¼Œå…¶ä¸ $V$ 是顶点集,$E$ 是边集isbosã€‚æ¯æ¡è¾¹ $e \in E$ 都有一个æƒé‡ $w(e)$ã€‚ç®—æ³•çš„ç›®æ ‡æ˜¯æ‰¾åˆ°ä¸€ä¸ªå图 $T = (V, E’)$,使得 $T$ æ˜¯ä¸€æ£µæ ‘ï¼Œä¸” $\sum_{e \in E’} w(e)$ 最å°ã€‚✅
在æ¯ä¸€æ¥ï¼Œç®—法选择一æ¡è¾¹ $e = (u, v)$ï¼Œå…¶ä¸ $u$ åœ¨å½“å‰æ ‘ä¸ï¼Œ$v$ ä¸åœ¨ï¼Œä¸” $w(e)$ 最å°ã€‚è¿™å¯ä»¥ç”¨ä¸‹é¢çš„æ•°å¦è¡¨è¾¾å¼è¡¨ç¤ºï¼š
$e = \arg\min_{(u,v) \in E, u \in T, v \notin T} w(u,v)$
🎨 第四幕:算法的多彩应用
普里姆算法ä¸ä»…仅是一个ç†è®ºä¸Šçš„æ¦‚å¿µï¼Œå®ƒåœ¨çŽ°å®žä¸–ç•Œä¸æœ‰ç€å¹¿æ³›çš„应用:
- 网络设计:在设计计算机网络或通信网络时,普里姆算法å¯ä»¥å¸®åŠ©æ‰¾åˆ°è¿žæŽ¥æ‰€æœ‰èŠ‚ç‚¹çš„æœ€å°æˆæœ¬æ–¹æ¡ˆã€‚
- 交通规划:在规划é“è·¯ã€é“路或航线时,普里姆算法å¯ä»¥å¸®åŠ©è®¾è®¡æœ€ç»æµŽçš„路线。
- ç”µåŠ›ç½‘ç»œï¼šåœ¨è®¾è®¡ç”µåŠ›ä¼ è¾“ç½‘ç»œæ—¶ï¼Œæ™®é‡Œå§†ç®—æ³•å¯ä»¥å¸®åŠ©æœ€å°åŒ–电缆的总长度。
- 管é“系统:在设计水管ã€ç‡ƒæ°”管é“ç‰ç³»ç»Ÿæ—¶ï¼Œæ™®é‡Œå§†ç®—法å¯ä»¥å¸®åŠ©ä¼˜åŒ–ç®¡é“布局。
- 集群分æžï¼šåœ¨æŸäº›æœºå™¨å¦ä¹ 算法ä¸ï¼Œæ™®é‡Œå§†ç®—法被用于构建数æ®ç‚¹ä¹‹é—´çš„连接。
🎬 终幕:算法的实现与优化
让我们æ¥çœ‹çœ‹å¦‚何用Python实现这个神奇的算法:
import sys
class Graph:
def __init__(self, vertices):
self.V = vertices
self.graph = [[0 for column in range(vertices)]
for row in range(vertices)]
def printMST(self, parent):
print("Edge \tWeight")
for i in range(1, self.V. :✅
print(parent[i], "-", i, "\t", self.graph[i][parent[i]])
def minKey(self, key, mstSet):
min = sys.maxsize
min_index = -1
for v in range(self.V. :✅
if key[v] < min and mstSet[v] == False:
min = key[v]
min_index = v
return min_index
def primMST(self):
key = [sys.maxsize] * self.V
parent = [None] * self.V
key[0] = 0
mstSet = [False] * self.V
parent[0] = -1
for cout in range(self.V. :✅
u = self.minKey(key, mstSet)
mstSet[u] = True
for v in range(self.V. :✅
if self.graph[u][v] > 0 and mstSet[v] == False and key[v] > self.graph[u][v]:
key[v] = self.graph[u][v]
parent[v] = u
self.printMST(parent)
# 使用示例
g = Graph(5)
g.graph = [[0, 2, 0, 6, 0],
[2, 0, 3, 8, 5],
[0, 3, 0, 0, 7],
[6, 8, 0, 0, 9],
[0, 5, 7, 9, 0]]
g.primMST()
这个实现使用了邻接矩阵æ¥è¡¨ç¤ºå›¾ï¼Œæ—¶é—´å¤æ‚度为 $O(V^2)$ï¼Œå…¶ä¸ $V$ 是顶点的数é‡ã€‚对于大型图,我们å¯ä»¥ä½¿ç”¨ä¼˜å…ˆé˜Ÿåˆ—æ¥ä¼˜åŒ–ç®—æ³•ï¼Œå°†æ—¶é—´å¤æ‚度é™ä½Žåˆ° $O(E \log V. $ï¼Œå…¶ä¸ $E$ 是边的数é‡ã€‚✅
🌟 åŽä¸½è°¢å¹•:算法的未æ¥å±•望
普里姆算法虽然已ç»è¯žç”Ÿå¤šå¹´ï¼Œä½†å®ƒä»ç„¶åœ¨ä¸æ–è¿›åŒ–ã€‚ç ”ç©¶è€…ä»¬æ£åœ¨æŽ¢ç´¢å¦‚ä½•å°†å®ƒåº”ç”¨åˆ°æ›´å¤æ‚的问题ä¸ï¼Œä¾‹å¦‚在动æ€å˜åŒ–çš„å›¾ä¸æ‰¾æœ€å°ç”Ÿæˆæ ‘,或者在分布å¼ç³»ç»Ÿä¸å®žçŽ°é«˜æ•ˆçš„æ™®é‡Œå§†ç®—æ³•ã€‚
å°±åƒé”法森林ä¸çš„æ ‘æœ¨ä¼šä¸æ–ç”Ÿé•¿ä¸€æ ·ï¼Œæ™®é‡Œå§†ç®—æ³•ä¹Ÿåœ¨ä¸Žæ—¶ä¿±è¿›ï¼Œä¸æ–适应新的挑战。它æé†’我们,有时候,最简å•çš„ç–ç•¥åè€Œèƒ½è§£å†³æœ€å¤æ‚的问题。在这个数æ®çˆ†ç‚¸çš„æ—¶ä»£ï¼Œæ™®é‡Œå§†ç®—æ³•æ— ç–‘æ˜¯æˆ‘ä»¬æŽ¢ç´¢å¤æ‚网络的é‡è¦å·¥å…·ä¹‹ä¸€ã€‚
让我们期待这个å¤è€è€Œåˆå……满活力的算法在未æ¥ä¼šç»½æ”¾å‡ºæ›´åŠ ç»šä¸½çš„å…‰èŠ’ï¼
å‚考文献
- Prim, R. C. (1957). Shortest connection networks and some generalizations. Bell System Technical Journal, 36(6), 1389-1401.✅
- Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to algorithms. MIT press.✅
- Sedgewick, R. , & Wayne, K. (2011). Algorithms. Addison-wesley professional.✅
- Kleinberg, J. , & Tardos, É. (2006). Algorithm design. Pearson Education India.✅
- Skiena, S. S. (2008). The algorithm design manual. Springer Science & Business Media.✅