贪心法--最小生成树的Prim算法和Kruskal算法

来源:互联网 发布:nginx 打印php错误 编辑:程序博客网 时间:2024/06/11 19:16

一,贪心法和分治法,DP法的本质不通在于:   只选择一个子问题求解


二,贪心法的特点:

①,快

②不能保证得到最优解


三,贪心法的关键是:分解方案和贪心选择方案


以最小生成树为例进行说明:

Prim算法(最近点策略):给定无向联通带全图 顶点集v={1,2,3,4,5..n.} 边集E={无向图中的所有边}

S为部分解   C候选集  w(s,i)(i∈C)是指候选集与S集合之间的权重

循环(终止条件是  所有的节点(1...n)全部被选入S集合 所以循环n-1次)

①初始化 S={1}   c = E

②a. x = argmin(w(s,i))  i∈候选集

    b. s =  s∪{x}  

    c.  c = c-{x}


Kruskal算法(最短边策略)给定无向联通带全图 v={1,2,3,4,5..n.} E集合

将所有的边从小到大排序(快速排序)

循环(终止条件是 ②中的b段循环执行n-1次)

①初始化:S = V,C = E

②a.x = argmin(w(e)) e属于C

    b.if(X的两个端点分属于不同的联通分支)

T = T U {x};

    c.c = c - {x}


贪心法的基本构件:

1.部分解 S

2.候选集C

3.贪心选择函数select()

4.约束函数 constraint() 判断贪心选择的结果是否满足约束

5.完整解的函数 complete(S)  判断当前解是否是完整解


贪心法框架:

返回值 贪心算法(参数列表){

//初始化

S= S0; C= C0;......

while(complete(S)){

x = select(c);

if(consitriant(X)){//审查约束条件

S = S ∪ x;//解扩展

C = C - x;//候选集以及参数调整

}

}

}




2 0