贪婪算法+小应用(调度问题)

来源:互联网 发布:java短信发送代码 编辑:程序博客网 时间:2024/05/29 15:52

【0】README

0.1) 本文总结于 数据结构与算法分析, 旨在 理解 “DFS应用——贪婪算法” 的idea;


【1】贪婪算法

1.1)已经看到的三个贪婪算法: Dijkstra算、Prim算法 和 Kruskal 算法;(Dijkstra 寻找一个顶点到其他顶点的最短路径, Prim算法是选取顶点以找出最小生成树, Kruskal算法是一次选取权值最小的边 建立最小生成树)
1.2)贪婪算法是分阶段工作的 : 在每个阶段,可以认为所做的决定是最好的, 而不考虑将来的后果。一般来说, 这意味着选择的是某个局部的最优。
1.3)贪婪算法荔枝(使用最少数目的纸币找零钱):
说找零钱, 大部分人首先数出面值1元的纸币,然后是面值5角的纸币、2角的纸币、1角的纸币等等;这种贪婪算法使用最少数目的纸币找零钱;
贪婪算法的主要问题(添加1元2角的纸币): 该算法不能总是成功,为了找还15角的零钱,如添加面值1元2角的纸币(这仅仅是举例说明)可破坏这种找零钱算法, 因为此时它给出的答案(一个面值1元2角的纸币+1个面值2角的纸币+一个面值1角的纸币==3个)不是最优的(1个面值1元的纸币+1个面值5角的纸币==2个);


【2】一个简单的调度问题

2.1)问题说明: 有作业 j1, j2, ……, jN, 已知对应的运行时间为 t1, t2, …, tN, 而处理器只有一个, 为了把作用平均完成的时间最小化,调度这些作业最好的方式是什么?

对上图的分析(Analysis):

  • A1)我们看到, 2号调度是按照最短的作业最先进行来安排的, 这将总会产生一个最优调度;
  • A2)这个结果也指出了 为什么 os 调度程序一般吧优先权赋予给那些更短的作业的原因;
    2.2)多处理器的情况
  • 2.2.1)我们还是有作业 j1, j2, ……, jN,对应的运行时间为 t1, t2, …, tN,另外处理器的个数为P。不失一般性地, 我们将假设作业是有序的,最短的最先运行。
  • 2.2.2)看个实际荔枝:

2.3)将最后完成时间最小化(即越早结束越好)

  • 2.3.1)假设我们只关注最后作业的结束时间;
  • 2.3.2)看个荔枝(下图中的最小的最后完成时间是 34):
  • 2.3.3)这个问题是NPC类问题, 因此将最后完成时间最小化显然要比把 平均完成时间最小化困难得多;
0 0