一步一步寫演算法(之克魯斯卡爾演算法 下)

2021-09-06 20:10:45 字數 1142 閱讀 8455

原文:

一步一步寫演算法(之克魯斯卡爾演算法 下)

前面在討論克魯斯卡爾的演算法的時候,我們分析了演算法的基本過程、基本資料結構和演算法中需要解決的三個問題(排序、判斷、合併)。今天,我們繼續完成剩下部分的內容。合併函式中,我們呼叫了兩個基本函式,find_tree_by_index和delete_mini_tree_from_group,下面給出詳細的計算過程。

mini_generate_tree* find_tree_by_index(mini_generate_tree* ptree, int length, int point)

} return null;

}void delete_mini_tree_from_group(mini_generate_tree* ptree, int length, mini_generate_tree* pindex)

memmove(&ptree[index +1], &ptree[index], sizeof(mini_generate_tree*) * (length -1 - index));

return;

}

下面就可以開始編寫克魯斯卡爾最小生成樹了,**如下所示,

mini_generate_tree* _kruskal(mini_generate_tree* ptree, int length, dir_line* pline, int number)

return (1 != length) ? null : ptree[0];

}

要進行上面的計算,我們還需要算出頂點的個數,線段的個數,所以函式還需要進一步完善和補充,

mini_generate_tree* kruskal(graph* pgraph)

這樣,克魯斯卡爾演算法大體上算結束了,其中get_total_line_number、get_tree_from_graph、get_line_from_graph函式都比較簡單,朋友們可以自己繼續完成,但是要好好測試。

總結:(1)**中沒有考慮記憶體的釋放問題,需要改進和提高

(2)部分**可以復用prim演算法中的內容,資料結構也一樣

(3)演算法的編寫貴在理解,只要步驟對了,再加上測試,一般問題都不大

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法(之 A 演算法)

在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的路徑有n條,這條路徑都可以達到目的地,然而我們在挑選...

一步一步寫演算法 之 A 演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的...