004-算法-贪心发法

一、概念:贪心法(Greedy algorithm),是在每一步选择中都采用在当期状态下最好或最有的选择,从而希望导致结果是最好或者最优的算法。 比如在旅行推销员问题中,如果履行原每次都选择最近的城市,这就是一种贪心算法。

贪心算法在有最优子结构的问题中,尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单讲,问题能够分解成子问题来解决,子问题的最优解能递推最终问题的最优解。

贪心法可以解决一些最优化问题,如:求中的最小生成树、求哈夫曼编码……对于其他问题,贪心法一般不能得到我们所要求的答案。一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。

二、思路:

1:建立数学模型来描述问题

2:把求解的问题分成若干个子问题

3:对每一个子问题求解,得到子问题的局部最优解。

4:把子问题的解局部最优解合成原来解问题的一个解。

实现该算法的过程:

从问题的某一初始解出发;while 能朝给定总目标前一步 do,求出可行解的一个解元素;最后,由所有解元素组合成问题的一个可行解。

贪心法的应用

  • 哈夫曼编码
  • 0-1背包问题
  • 磁盘文件的存储
  • 生产调度问题
  • 信息查询

004-算法-贪心发法

时间: 2024-10-09 20:08:22

004-算法-贪心发法的相关文章

HDU 4004 The Frog's Games(基本算法-贪心,搜索-二分)

The Frog's Games Problem Description The annual Games in frogs' kingdom started again. The most famous game is the Ironfrog Triathlon. One test in the Ironfrog Triathlon is jumping. This project requires the frog athletes to jump over the river. The

排序算法之冒泡法

package chap02_Basic_Algorithms; import static org.junit.Assert.*; import java.util.Arrays; import org.junit.Test; public class SortAlgorithms { /** * 冒泡法排序 * * @param n */ static void bubbleSort(int[] n) { int j = n.length - 1; int i; int tmp; while

HDU Hotaru's problem(Manacher算法+贪心)

manacher算法详见 http://blog.csdn.net/u014664226/article/details/47428293 题意:给一个序列,让求其最大子序列,这个子序列由三段组成,第一段和第二段对称,第一段和第三段一样. 思路:首先利用Manacher算法求出以任意两个相邻元素为中心的回文串长度,用a[i]表示i-1,i为中心的回文串长度的一半, 那么问题就转化成了求最大的x,使得a[i]>=x,a[i+x]>=x,这一步可以贪心来做. 将a[i]从大到小排序(间接排序保留

五大算法—贪心算法

贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择.必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关. 所以对所采用的贪心策略一定要仔细分析其是否满足无后效性. 二.贪心算法的基本思路: 1.建立数学模型来描述问题. 2.把求解

Dijkstra最短路径算法[贪心]

Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是以不同的方式计算的:Dijkstra算法比较路径的长度,因此必须把边的权重相加,而prim算法则直接比较给定的权重. 源最短路径问题给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数.另外,还给定 V 中的一个顶点,称为源.现在我们要计算从源到所有其他各顶点的最短路径长度.这里的长度

HDU 4864 Task(基本算法-贪心)

Task Problem Description Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this task has a difficulty level yi. The machine whose level below this task's level yi cannot complete this task. If the company

聚类算法之层次法

首先介绍聚类中的层次聚类算法.层次法又分为凝聚的层次聚类和分裂的层次聚类. 凝聚的方法:也称自底向上的方法,首先将每个对象作为单独的一个聚类,然后根据性质和规则相继地合并相近的类,直到所有的对象都合并为一个聚类中,或者满足一定的终止条件.经典的层次凝聚算法以AGNES算法为代表,改进的层次凝聚算法主要以BIRCH,CURE,ROCK,CHAMELEON为代表.(后面详细介绍) 分裂的方法:也称自顶向下的方法,正好与凝聚法相反,首先将所有的对象都看作是一个聚类,然后在每一步中,上层类被分裂为下层更

基础算法之三——递归法

基础算法之三--递归法"汉诺塔问题" 题目描述 古代有一座汉诺塔,塔内有三个座A.B.C,A座上有n个盘子,盘子大小不等,大的在下,小的在上,如图所示.有一个和尚想把这n个盘子从A座移到C座,但每次只能移动一个盘子,并且在移动过程中,3个座上的盘子始终要保持大盘在下,小盘在上.在移动过程中可以利用B座来放盘子.要求输出移动的步骤. 输入数据 汉诺塔内的盘子个数n.(1<n<64) 输出要求 输出移动的步骤,每行一步,如从A座移动到C座,输出"A->C&quo

图处理算法-Kosaraju&#39;s-算法

1.写了算法课关于有向图的作业. 用c++开辟大数组容易出segment fault,后来改用堆开辟.图的邻接表用了链表表示. long int numVertexes = 875714; long int numEdges; VertexNode* adjList = new VertexNode[875714]; 2.关于图的存储,用了邻接链表存储(用链表比vector数组存储速度快多了). 2.1 边表 /********边表***********/ class EdgeNode { pu