原文:
一步一步寫演算法(之克魯斯卡爾演算法 下)
前面在討論克魯斯卡爾的演算法的時候,我們分析了演算法的基本過程、基本資料結構和演算法中需要解決的三個問題(排序、判斷、合併)。今天,我們繼續完成剩下部分的內容。合併函式中,我們呼叫了兩個基本函式,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 演算法
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!在前面的部落格當中,其實我們已經討論過尋路的演算法。不過,當時的示例圖中,可選的路徑是唯一的。我們挑選乙個演算法,就是說要把這個唯一的路徑選出來,怎麼選呢?當時我們就是採用窮盡遞迴的演算法。然而,今天的情形有點不太一樣了。在什麼地方呢?那就是今天的...