趣学算法系列-贪心算法

声明:本系列为趣学算法一书学习总结内容,在此推荐大家看这本算法书籍作为算法入门,
原作者博客链接,本书暂无免费电子版资源,请大家支持正版,更多的案例分析请查看原书内容。

第二章 贪心算法

一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择
从而得到全局最优的解决方案。
—《算法导论》
- 贪心算法求解两个重要的特性
(1)贪心选择 每一步都作出当前的最佳(何为最佳,策略不同,情况不同)选择 仅依赖于之前作出的选择
(2)最优子结构 问题的最优解包含其子问题的最优解
- 贪心算法秘籍
(1)贪心策略 选择当前看上去最好的一个方案 如最大的 最值钱的 最重的
(2)局部最优解 根据贪心策略,一步一步地得到局部最优解
(3)全局最优解 所有的局部最优解合成为原来问题的一个最优解
- 如何定义最优子结构
        分解问题模型 缩小问题的规模
        最优解子问题的分解结构和堆叠方式
        分解结构:每一步都在前一步的基础上选择当前最好的解(钱币找零问题)
        堆叠结构:分解成相对独立的几个子问题,最后进行合并(某种公式计算法则)
- 贪心算法的缺陷
         贪婪法每一步选择完之后,局部最优解就确定
        不再进行回溯,之前选择不再修改,直到算法结束
        贪心只有极少情况可以得到最优解
         通常得到的是近似最优解,但是简单高效
        省去了为找最优解可能需要的穷举操作
- 贪心算法的典型应用
        最优装载问题
        背包问题

  • 实际案例分析-最优装载问题

  • 问题描述

    有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它
    的价值。虽然海盗船足够大,但载重量为 C,每件古董的重量为 wi,海盗们该如何把尽可能多数量的宝贝
    装上海盗船呢?

  • 问题分析

    要求装载的物品的数量尽可能多, 而船的容量是固定的, 那么优先把重量小的物品放进去, 在容量固定的情况下,
    装的物品最多。采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解。

  • 算法设计

    (1)当载重量为定值 c 时, wi 越小时,可装载的古董数量 n 越大。只要依次选择最小重量古董,直到不能再装为止。
    (2)把 n 个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前 i 个古董,直到不能继续装为止,此时达到最优。

  • 完美图解

    每个古董的重量如表 2-1所示,海盗船的载重量 c 为 30,那么在不能打碎古董又不超过载重的情况下,怎么装入最多的古董?

    (1)因为贪心策略是每次选择重量最小的古董装入海盗船,因此可以按照古董重量非递减排序,排序后如表 2-2 所示。

    ( 2)按照贪心策略,每次选择重量最小的古董放入( tmp 代表古董的重量, ans 代表已装裁的古董个数)。
    i=0,选择排序后的第 1 个,装入重量 tmp=2,不超过载重量 30, ans =1。
    i=1,选择排序后的第 2 个,装入重量 tmp=2+3=5,不超过载重量 30, ans =2。
    i=2,选择排序后的第 3 个,装入重量 tmp=5+4=9,不超过载重量 30, ans =3。
    i=3,选择排序后的第 4 个,装入重量 tmp=9+5=14,不超过载重量 30, ans =4。
    i=4,选择排序后的第 5 个,装入重量 tmp=14+7=21,不超过载重量 30, ans =5。
    i=5,选择排序后的第 6 个,装入重量 tmp=21+10=31,超过载重量 30,算法结束。
    即放入古董的个数为 ans=5 个。

  • 伪代码详解

    (1)数据结构定义
             double w[N]; //一维数组存储古董的重量
    (2)按重量排序
             sort(w, w+n); //按古董重量升序排序
    (3)按照贪心策略找最优解
            首先用变量 ans 记录已经装载的古董个数, tmp 代表装载到船上的古董的重量,两个变
        量都初始化为 0。然后按照重量从小到大排序,依次检查每个古董, tmp 加上该古董的重量,
        如果小于等于载重量 c,则令 ans ++;否则,退出。

  • 实战演练

    //program 2-1#include <iostream>#include <algorithm>const int N = 1000005;
    using namespace std;
    double w[N]; //古董的重量数组
    int main()
    {
    double c;
    int n;
    cout<<"请输入载重量 c 及古董个数 n: "<<endl;
    cin>>c>>n;
    cout<<"请输入每个古董的重量,用空格分开: "<<endl;
    for(int i=0;i<n;i++)
    {
    cin>>w[i]; //输入每个物品重量
    }
    sort(w,w+n); //按古董重量升序排序
    double temp=0.0;
    int ans=0; // tmp 为已装载到船上的古董重量, ans 为已装载的古董个数
    for(int i=0;i<n;i++)
    {
    tmp+=w[i];
    if(tmp<=c)
    ans ++;
    else
    break;
    }
    cout<<"能装入的古董最大数量为 Ans=";
    cout<<ans<<endl;
    return 0;
    }
  • 算法时间复杂度分析

    (1)时间复杂度:首先需要按古董重量排序,调用 sort 函数,其平均时间复杂度为 O(nlogn),
    输入和贪心策略求解的两个 for 语句时间复杂度均为 O(n),因此时间复杂度为 O(n + nlog(n))。
    (2)空间复杂度:程序中变量 tmp、 ans 等占用了一些辅助空间,这些辅助空间都是常
    数阶的,因此空间复杂度为 O(1)。

趣学算法系列-贪心算法相关推荐

  1. python贪心算法最短路径_dijkstra算法(贪心算法)——解决最短路径问题

    最短路径 给定一张带权图和其中的一个点(作为源点),求源点到其余顶点的最短路径 基本思想 1)源点u,所有顶点的集合V,集合S(S中存有的顶点,他们到源点的最短路径已经确定,源点u默认在S中),集合V ...

  2. 3.Python算法之贪心算法思想

    贪心算法 1.什么是贪心算法 2.贪心算法的特点和思路 3.贪心算法的缺点 4.贪心算法的基本思路 5.贪心算法的基本过程 6.贪心算法解决"找零"问题 6.贪心算法解决" ...

  3. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)

    我的上一篇文章向大家介绍了排序算法中的冒泡排序.插入排序和选择排序.它们都是平均时间复杂度为 O(n^2) 的排序算法,同时还为大家讲解了什么是原地排序和什么是排序的稳定性.下图是这三种算法的比较,不 ...

  4. 回溯算法和贪心算法_回溯算法介绍

    回溯算法和贪心算法 回溯算法 (Backtracking Algorithms) Backtracking is a general algorithm for finding all (or som ...

  5. 五大算法之三--贪心算法

    一.基本概念:        所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解.      贪心算法没有固定的 ...

  6. java调度问题的贪心算法_贪心算法——换酒问题

    知识回顾 贪心算法 (greedy algorithm),又称贪婪算法. 是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法. 贪心算法在 有最优子 ...

  7. 任务分配算法c语言程序,程序员算法基础——贪心算法

    原标题:程序员算法基础--贪心算法 前言 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. 比如一道常见的算法笔试题跳一跳: 有n个盒子排成一行,每个盒子上面有一个数字a[i],表示最 ...

  8. 信号处理趣学D0——系列专栏的说明与目录

    信号处理趣学专栏是小虎同学在学习测试技术的时候做的一系列笔记和心得的集合,定位是利用仿真软件(主要是MATLAB)带大家领略信号处理的一些基本概念. 目录 信号处理趣学D0--系列专栏的说明与目录 信 ...

  9. 数据结构与算法之美(十四)算法思想——贪心算法

    目录 贪心算法介绍 贪心算法例子 1. 背包 2. 分糖果 3. 钱币找零 4. 区间覆盖 5. 区间覆盖的延伸:任务调度.教师排课 贪心算法经典应用 1. 霍夫曼编码 2. 最小生成树算法 3. 最 ...

最新文章

  1. 《权力的游戏》最终季上线!谁是你最喜爱的演员?这里有一份Python教程 | 附源码...
  2. java资料——线性表(转)
  3. 出现Failed to get convolution algorithm的解决方法
  4. Elasticsearch中如何进行日期(数值)范围查询
  5. 最全的C#图片处理类ImageHelper.cs
  6. 允许网站使用相机和麦克风_手机使用应用时总是需要获取权限,这3个权限不能随意给,望周知...
  7. linux的tcpdump命令详解,tcpdump命令
  8. java char 空_2020重新出发,JAVA入门,数据类型
  9. 春招平均薪酬最高的职业TOP10
  10. 3306端口的入侵【转】
  11. C# 使用PictureBox控件--点击切换图片
  12. topcoder srm 661 div1
  13. Focal Loss for Dense Object Detection解读
  14. iso硬盘安装 凤凰os_Phoenix OS硬盘版|凤凰系统x86硬盘版下载 v2.5.0正式版 附安装教程 - 121下载站...
  15. 国寿鸿寿年金保险(分红型)
  16. 计算机txt公式,完整word版本积分公式
  17. keil中下载按钮和调试按钮灰掉了
  18. 环境规制指数,两种测算方法,整理好的面板数据
  19. 2022年电梯考试电梯检验员模拟题及答案
  20. 关于PhpStorm设置点击编辑文件自动定位源文件

热门文章

  1. JMeter 5.4下载、安装、使用教程
  2. 解决电脑连接正常,但浏览器无法打开网页的问题
  3. 520CSS制作爱心学习记录
  4. thinkPHP5.1框架简介
  5. 教你如何将中国知网下载的caj文献转成pdf文献
  6. java计算机毕业设计高校医务管理系统源程序+mysql+系统+lw文档+远程调试
  7. [FATAL] [DBT-10317] Specified SID Name (orcl) already exists.dbca建库报错
  8. 攻防世界 web新手练习区WP(超新新手!)
  9. Windows10 安装 Vue3
  10. Java接入支付宝支付超级详细教程——从入门到精通