这周讲初级的greedy alorithm,greedy algorithm是一种算法思想,思路是每一步都做在当时看上去是最优的事情,那么很多步下来,最后得到的方案可能也是个比较不错的方案(虽然可能不是最优)。之前接触过的knapsack problem和dijkstra‘s algorithm都是greedy algorithm的体现。
先讲的一个问题是scheduling application,就是说有一系列事务需要处理,每件事物有各自的优先级和处理时间,那么如何得到一个最优的schdule方案,使得每件事物的(优先级*完成时间)之和为最小。显而易见,这个问题很有实际意义啊:以前去主楼报账或者去学校打印店打印的时候就饱受不合理的schedule之苦,妈的明明我只是打印一两页纸,为什么要等前面那么多人打印完毕业论文才能轮到我?有了greedy algorithm这个问题就可以解决了,我们对每件事物按照(优先级/处理时间)降序排列就可以了。
然后是最小生成树的问题(MST),讲了Prim的MST算法,其实这个算法学图论的时候就学过,因为方法太直观了所以印象还挺深的。这个算法是处理无向有权图的最小生成树,过程就是先找一个最小权的边,然后以这个边为基地向外延伸,每一步寻找一遍所有不在本方基地的vertex,如果某个vertex连到在本方基地的某一vertex的edge的权重如果是当前能找到的最小值,那么就把这个点和这个边拉入本方。重复进行这一步骤,直到所有点都被拉入本方为止。这个算法是O(MN)的,不过和dijkstra一样,如果用heap来完成extract min的动作的话,可以优化到O(m*lg(n))。
作业就是实现scheduling和Prim,不难。
原文地址:https://www.cnblogs.com/dynasty919/p/8479946.html