对prime算法的深入理解


我知道字多很难有人认真读,所以我认真加了颜色,用我的认真换你们的认真吧。

---------------------------------------------------------------------------------------------------------

对这个算法的探讨源于做百度之星的一道题目,这道题目需要用到prime算法的堆优化,自从选择了参数计算的方

向,对这些算法真的是没有再看过了,我个人比较喜欢琢磨,所以决定自己重新实现一下prime算法,凭着记忆,我

用了贪心的方法实现了这个算法,但是有问题,我忘记了为什么要有一个dist数组来记录路过的权值了,所以我没有

这个数组,当时觉得可以不用这个数组,贪心找就好了,结果会出现只找了部分的节点,有些节点贪心不到(一直

沿着这个点最小的边走,加红后面还要说)。

----------------------------------------------------------

然后,我就在想怎么退回去,用递归回溯,不太好弄,然后我就开始思考这个数组的作用,从代码上看,这个dist数

据用来记录在我们走过的节点里 ,从已走过的到没走过的距离最小的值(贪心是顺着最小的走的),我这才明

白,prime算法边走边对图进行划分,划分为两个集合,一个是走过的集合,一个是没有走过的集合,我们如果想把

这两个集合连起来,需要一条边,这条边必须是最小边(ToT),而这条边我们能够从访问点的这个过程获得,就

是dist数组里的某条边,它保存了到未访问集合的某些点的最短边(到不了某些点,因为不存在从已知节点到某些未

知节点直接的边,不过我们需要的是到集合的最短边,这就够了)。

-------------------------------------------------------------------------

非常有趣,可能从这个集合到其他某些集合也不存在最短边,这就需要依靠我们能够连接到的集合来与他们建立联系


最后想说,贪心是错的,因为取边不能只考虑某个点的最小边,而应该从这个点所在的集合考虑,每一步取的是集合

最小的外展边,个体最优不能代表整体最优。


贪心能处理局部最优是整体最优的问题,也必须在整体和个体正确划分前提下的,引发遐想有没有


你可能感兴趣的:(研究生)