Java教程

贪心算法

本文主要是介绍贪心算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、概述

1.设计思想

贪心算法通过一系列选择来得到问题的解,所做的每个选择都是当前状态下局部最好选择,即贪心选择。

贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部选择,在一些情况下,即使贪心算法不能得到整体最优解,但其最终结果确实最优解的很好的近似解。

2.基本要素

(1)贪心选择性质

贪心算法所做的选择可以依赖以往所做过的选择,但绝不依赖将来所做的选择,也不依赖子问题的解。

(2)最优子结构性质

当一个问题的最优解中包含了子问题的最优解时,则称该问题具有最优子结构特性。

3.存在的问题

(1)不能保证求得的最后解是最佳的;
(2)不能用来求最大或最小解问题;
(3)只能求满足某些约束条件的可行解的范围。

4.算法比较

  名称                   同               异
贪心算法 都要求问题具有最优子结构性质

不依赖将来和子问题的解

自顶向下进行求解

具有贪心选择性质

动态规划算法

往往依赖相关子问题的解

自底向上进行求解

具有重叠子问题性质

 

 

 

 

 

二、例题总结

1.活动安排问题

【问题描述】 设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源(如演讲会场等),而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和结束时间fi,如果选择了活动i,则它在半开区间[si,fi)与区间[sj,fj)内占用资源。若区间[si,fi)与区间[sj,fj)不相交,则称活动i和j是相容的,也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。

【算法设计】由于活动占用资源的时间没有限制,因此,选择最早结束时间作为贪心策略更加合理,目的是使剩余时间段最大化,以便安排尽可能多相容的活动。

【算法实现】

数组f中元素按结束时间非降序排列,若未按此序排列,可以用O(nlogn)做时间重排。

 

2.背包问题

【问题描述】 设背包容量为C,n个物品,物品价值和重量为v[i],w[i]。物品可以只装一部分。

【算法设计】不存在0-1要求,先装单价最贵的,再装单价次贵的,依此贪心策略一直进行下去,直到背包装满。

【算法实现】 O(nlogn)

3.最优装载问题

【问题描述】设有一轮船能装载的货物重量为C,有n个集装箱,重量为w[i],问怎样可以装尽可能多的集装箱。

【算法设计】先装最轻的,再装次轻的,依此贪心策略一直进行下去,直到轮船装满。

【算法实现】 O(nlogn)

这篇关于贪心算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!