第 7 章 贪心算法 了解贪心算法的概念与贪心算法设计要领 掌握应用贪心算法设计求解删数字问题、可拆背包问题与数列操作问题等最优化典型案例

Slides:



Advertisements
Similar presentations
我们首先引入的计算概率的数学模型, 是在概率论的发展过程中最早出现的研究 对象,通常称为 古典概型.
Advertisements

一、模型与计算公式 二、基本的组合分析公式 三、概率直接计算的例子 第 1.3 节 古典概率 四、抽签与顺序无关 五、二项分布与超几何分布 六、概率的基本性质.
夯实教师教育 办好非师范教育 ---- 以外语专业为例 河北师范大学 李正栓. 1. 坚定不移地实施教师教育 A. 关键词:师范院校 师范院校是以培育师资为目的的教育机构,多属于高等教育 层级。 含 “ 师范大学 ” 或 “ 师范学院 ” 。另外,由师专升为本科的院校 多数更名为 “XX 学院 ”
中医内科 陈良金. 目的要求: 熟悉虚劳的证候特征。 了解虚劳的发病与气血阴阳及五脏的关系。 掌握虚劳和肺痨及一般虚证的区别与联系。 掌握虚劳的治疗要点。 熟悉虚劳各个证型的辨证论治。 了解虚劳的预后及调摄护理。
写作中的几点小技巧 金乡县羊山中学 张秀玲. 一、写外貌不用 “ 有 ” 作文如何来写外貌?同学们的作文里总会出现类 似这样的句子: “ XX 可漂亮了,她有一头卷卷的黄头 发,有一双乌黑的葡萄般的大眼睛,有高高的鼻子, 还有一张樱桃小嘴。 ” 如果试着去掉文中的 “ 有 ” ,把文字重新修改一遍,
十大写作技巧. 一、写外貌不用 “ 有 ” 作文如何写外貌?孩子的作文里总会看到类似这样的名 子: “XX 可漂亮了,她有一头卷卷的黄头发,有一双乌黑的 葡萄般的大眼睛,有一个高高的鼻子,还有一张樱桃小嘴。 ” 如果你试着让他们去掉文中的 “ 有 ” ,把文字重新串联一遍, 会发现作文顺了很多。 写上段文字的同学经蒋老师指导后修改如下:
招商谈判技巧 芝麻官营销. 技巧原则 孙子兵法云: “ 兵无常势,水无常形,能 因敌之变化而取胜者,谓之神。 ” “ 内功心法 ” 只有在真正实践中才能体会、 掌握。 谈判有没有具体的套路?有没有 “ 一招制 敌 ” 的擒拿手?
“ 十二五 ” 广东省科技计划项目 经费监管培训 广东省科技厅 一、专项经费管理法规 一、专项经费管理法规 二、经费监督检查 二、经费监督检查 三、项目预算调整管理 三、项目预算调整管理 四、课题经费预算执行管理 四、课题经费预算执行管理 五、项目(课题)财务验收 五、项目(课题)财务验收 2.
教育研究课题的实施 北京教育科学研究院 陶文中 第一节 如何制定课题研究计划 (开题论证报告) 一般结构(框架) 1 、课题名称 2 、研究目的和意义 3 、研究的基本内容 ( 1 )理论研究(细分为若干子项目) ( 2 )实践研究( 细分为若干子项目)
1 語音下單代表號 請輸入分公司代碼 2 位結束請按#字鍵 統一證券您好 ﹗ 請輸入分公司代碼結束請按#字鍵,如不知分公司代碼請按*號。 請輸入您的帳號後 7 位 結束請按#字鍵 請在聽到干擾音時輸入您的密碼結束請按#字鍵 主選單一覽表 委託下單請按 1 ; 取消下單請按 2 成交回報請按.
人權教育融入教學與 法治教育 彭巧綾 蔡永棠 閱讀理解 六頂思考帽 以概念圖整理閱讀理解 指導學生運用關鍵詞,繪製概 念圖,並分享修正。
XX啤酒营销及广告策略.
义务教育课程标准实验教材 四年级下册 语文园地六 词语盘点 习作 口语交际 我的发现 日积月累 展示台.
被 江 泽 民 残 酷 迫 害 致 死 的 法 轮 功 学 员 李竟春,女,1954年3月16日出生,江西省九江市人。于2000年12月18日到北京证实大法,关押在北京市门头沟看守所遭受非人的迫害。在狱中李竟春绝食抗争被管教骗喝一瓶“可疑的豆浆”后一直咳嗽不断,发烧呕吐,吐出白色有强烈异味液体,于2000年1月4日死亡。
第四章:长期股权投资 长期股权投资效果 1、控制:50%以上 有权决定对方财务和经营.
1 修辞手法 2 表现手法 3 表达方式 4 结构技巧 表达技巧.
回归教材、梳理知识、突出能力 ——2015年历史二轮复习思考 李树全 西安市第八十九中学.
窦娥冤 关汉卿 感天动地 元·关汉卿.
第八章 互换的运用.
事业单位法人年度报告制度改革 业 务 培 训.
報告書名:父母會傷人 班級:二技幼四甲 姓名:吳婉如 學號:1A2I0034 指導老師:高家斌
《C语言程序设计》复习
二次函数图象特点的应用 结题报告 K-11 班研究性学习小组 李浚滨制作.
大綱 一、設立科別 二、課程規劃原則 三、科目與學分數表 四、新課綱課程架構 五、新課綱課程規劃 (1)一般科目 (2)專業科目
媽,我們真的不一樣 青少年期與中年期 老師: 趙品淳老師 組員: 胡珮玟4A1I0006 馬菀謙4A1I0040
公文及公文处理 学校办公室 姚利民.
知其不可而为之.
(某同学作文选段) 这就是我 大家好,我的名字叫XX,我家在XX,但是小学的时候我在XX学校读书,我现在读书在永固中学,我现在说学校变化,但是我回校读书坐单车,还有学校很大,初中学习练几课,老师有很多,学校学生有很多,但是现在很重要学习,但是我家有很多工叫做,没有那么多时间学习。
苟利国家生死以, 岂因祸福避趋之。 ----禁毒英雄,一生为公 --林则徐.
中国画家协会理事、安徽省美术家协会会员、 工艺美术师、黄山市邮协常务理事余承平主讲
计算机三级考试C语言上机试题专题.
德育导师制基本经验介绍.
湖南师大附中高三政治第二次月考 试题讲评 试题讲评.
班級:二幼三甲 姓名:郭小瑄 、 詹淑評 學號:1A2I0029 、1A2I0025
初中语文总复习 说明文 阅读专题 西安市第六十七中学 潘敏.
指導老師:陳韻如 姓名:吳宜珊 學號:4A0I0911 班級:幼保二乙
员工保险 雇主责任险 概要 员工发生工伤事故后产生的一系列赔偿责任
汉字的构造.
诵读欣赏 古代诗词三首.
第四章:社交礼仪 一、社交礼仪的原则 二、社交礼仪的特点 三、社交礼仪的常识 四、工作面试中的个人礼仪 五、考研复试中的礼仪.
关于学生户口迁移的有关说明 保卫处户籍室.
武汉大学总裁46班 舞动青春 有你精彩 化妆舞会活动策划案.
企业秘书写作 主讲教师:黄巨龙.
1.1.2 四 种 命 题.
傳統童玩遊戲創新 組別:第八組 班級:幼保二甲 組員: 4A0I0005柯舒涵 4A0I0011謝孟真
第四章 时间序列的分析 本章教学目的:①了解从数量方面研究社会经济现象发展变化过程和发展趋势是统计分析的一种重要方法;②掌握时间数列编制的基本要求;③理解和掌握水平速度两方面指标的计算及运用④理解和掌握长期趋势分析和预测的方法。 本章教学重点:现象发展的水平指标和速度指标。 本章教学难点:现象变动的趋势分析。
统计从业资格考试培训 主讲:张良.
第五章 定积分及其应用.
把握命题趋势 ★ 科学应考 实现最后阶段的有效增分
第十二章 生产与费用循环审计.
国有高校下属后勤服务机构的人力资源困境 上海复旦后勤服务发展有限公司 张 珣.
用字母表示数 A=X+Y+Z 执教:建阳市西门小学 雷正明.
北师大版七年级数学 5.5 应用一元一次方程 ——“希望工程”义演 枣庄市第三十四中学 曹馨.
贴近教学 服务师生 方便老师.
2015年政法干警考试真题讲解 主讲:邓颖莉.
六年级 语文 下册 第四单元 指尖的世界.
海洋存亡 匹夫有责 ——让我们都来做环保小卫士 XX小学三(3)班.
(浙教版)四年级品德与社会下册 共同生活的世界 第四单元 世界之窗 第二课时.
《林黛玉形象分析》 一、视频《枉凝眉》导入。 二、复习高考考点——概括人物形象。 三、分析林黛玉形象特征。
選擇排序法 通訊一甲 B 楊穎穆.
第二部分 免疫系统与免疫活性分子 第二章 免疫系统 第三章 免疫球蛋白 第二 部分 第五章 细胞因子 第四章 补体系统.
李杰臣 韩永平 主编 占建民 乔 陆 胡 令 熊 璐 副主编
导数的应用 ——函数的单调性与极值.
第七章  事业单位支出的核算      §第一节  支出概述     §第二节  拨出款项     §第三节  各项支出     §第四节  成本费用.
中国大学生保险责任行2018年暑期社会实践 全国长期照护保险调研项目 抽样方法与注意事项
定理7.13:霍夫曼算法得到的带权w1,w2,,wn的二分树是最优树。 分析:采用归纳法。 n=2,
Xián 伯 牙 绝 弦 安徽淮南市八公山区第二小学 陈燕朵.
程式設計--linear search 通訊一甲 B 楊穎穆.
恩典夠用.
4.1 概 述 4.2 组合体视图绘制方法 4.3 组合体的尺寸标注 4.4 组合体视图的读图方法
Presentation transcript:

第 7 章 贪心算法 了解贪心算法的概念与贪心算法设计要领 掌握应用贪心算法设计求解删数字问题、可拆背包问题与数列操作问题等最优化典型案例 第 7 章 贪心算法 教学要求 了解贪心算法的概念与贪心算法设计要领 掌握应用贪心算法设计求解删数字问题、可拆背包问题与数列操作问题等最优化典型案例 本章重点 根据案例的实际选择与确定贪心策略

6.1 贪心算法概述 1. 贪心算法的概念 (1) 贪心算法(Greedy Algorithm)又称贪婪算法,是一种着眼局部的简单而适应范围有限的优化策略。 (2) 当一个问题具有最优子结构性质时,贪心算法有时比动态规划法求解更为简单有效。 (3) 贪心算法在求解最优化问题时,从初始阶段开始,每一个阶段总是做一个使局部最优的贪心选择,不断把将问题转化为规模更小的子问题。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是局部最优选择。这样处理,对大多数优化问题来说能得到最优解,但也并不总是这样。

2. 贪心策略的选择 贪心算法没有固定的算法框架,算法设计的关键在于贪心策略的选择与确定。 贪心算法的基本思想是通过一系列选择步骤来构造问题的解,每一步都是对当前部分解的一个扩展,直至获得问题的完整解。 应用贪心算法所做的每一步选择都必须满足: (1)可行的:必须满足问题的约束条件。 (2)局部最优:当前所有可能的选择中选择使局部最优的决策。 (3)不可取消:选择一旦做出,在后面的步骤中无法改变。 贪心算法是通过做一系列的选择来求出某一问题的最优解,对算法的每一个决策点,做一个当时(看起来)是最佳的选择,这种启发式策略并不总能产生出最优解。

3. 贪心算法的理论基础 贪心算法的理论基础为拟阵,是组合优化与图论的重要内容。 若M是无向图G的拟阵,则S为图的边集,I是所有构成森林的一组边的子集。 如果对S的每一个元素X(X∈S)赋予一个正的权值W(X),则称拟阵M=(S,I)为一个加权拟阵。 适宜于用贪心算法来求解的许多问题都可以归结为在加权拟阵中找一个具有最大权值的独立子集的问题,即给定一个加权拟阵M=(S,I),若能找出一个独立且具有最大可能权值的子集A,且A不被M中比它更大的独立子集所包含,那么A为最优子集,也是一个最大的独立子集。 拟阵理论是一种能够确定贪心算法何时能够产生最优解的理论,虽然这套理论还很不完善,但在求解最优化问题时发挥着越来越重要的作用。

7.2 删数字问题 案例提出: 在给定的n个数字的数字串中,删除其中k(k<n)个数字后,剩下的数字按原次序组成一个新的正整数。请确定删除方案,使得剩下的数字组成的新正整数最大。 例如在整数762191754639820463中删除6个数字后,所得最大整数为多大?

1. 贪心算法设计要点 操作对象是一个可以超过有效数字位数的n位高精度数,存储在数组a中。 1. 贪心算法设计要点 操作对象是一个可以超过有效数字位数的n位高精度数,存储在数组a中。 在整数的位数固定的前提下,让高位的数字尽量大,整数的值就大。这就是所要选取的贪心策略。 每次删除一个数字,选择一个使剩下的数最大的数字作为删除对象。选择这样“贪心”操作,是因为删k个数字的全局最优解包含了删一个数字的子问题的最优解。 当k=1时,在n位整数中删除哪一个数字能达到最大?从左到右每相邻的两个数字比较:若出现增,即左边数字小于右边数字,则删除左边的小数字。若不出现增,即所有数字全部降序或相等,则删除最右边的小数字。

例如,在18位整数762191754639820463中,删除1个数字,使剩下的17位数最大,如何删? 要使删除1个数字后的17位数最大,须首位数字最大。首先,首位数字“7”大于第2位数字“6”比较,首位数字“7”不能删! 往后推,“6”与“2”比较,因6>2,为减,“6”不能删; 再往后推,“2”与“1”比较,因2>1,为减,“2”不能删 ; 继续往后推,“1”与“9”比较,因1<9,出现增,则删除左边的小数字“1”。 当k>1(当然小于n),按上述操作,每一次操作从串首开始,每相邻的两个数字比较,出现“增”时,删除左边的小数字。每次操作删除一个数字后,后面的数字向前移位。 因此,只要从左至右每两相邻数字比较,出现“增”,即删除首数字。直到不出现“增”时,此时如果还不到删除指定的k位,打印剩下串的左边n−k个数字即可(相当于删除了余下的最右边若干个小数字)。

2. 贪心算法描述 printf(" 删除数字个数: ");scanf("%d",&k); i=0;m=0;x=0; 2. 贪心算法描述 printf(" 删除数字个数: ");scanf("%d",&k); i=0;m=0;x=0; while(k>x && m==0) {i=i+1; if(a[i-1]<a[i]) // 两位比较出现递增,删除首数字 {printf("%d, ",a[i-1]); for(j=i-1;j<=n-x-2;j++) a[j]=a[j+1]; x=x+1; i=0; // 从头开始查递增区间 } if(i==n-x-1) m=1; // 已无递增区间,m=1脱离循环 if(x<k) printf("及右边的%d个数字。\n",k-x); printf("\n 删除后所得最大数 ");

3. 贪心算法改进 1)以上贪心删数字算法每删除一个数字a[i-1],赋值i=0,即必须从头开始查找递增区间。其实此时只需从a[i-2]开始查找递增区间即可,因为先前的操作能够保证a[i-2]及之前的数字不是递增区间。 2)以上贪心删数字算法每删除一个数字a[i-1],必须逐一把其后的数字往前移动一位,如果n及k相当大,移动过程花费较大。其实每删除数字后,并不一定需要移动数字的位置,只对所删除数位赋标记值-1即可,代表该位置的数字已经删除。同时,查找递增区间时跳过该数位。

7.3 埃及分数式 案例提出: “埃及分数”为分子为1的分数。 7.3 埃及分数式 案例提出: “埃及分数”为分子为1的分数。 人们研究较多且颇感兴趣的问题是:把一个给定的分数转化为若干个不相同的埃及分数之和,约定埃及分数的分母不能与给定分数的分母相同。常把分解式中埃及分数的个数最少,或在个数相同时埃及分数中最大分母为最小的分解式称为最优分解式。 对把给定分数分解为埃及分数之和,或对已有的埃及分数式进行优化,往往是一个繁琐艰辛的过程。 例如,对3/11,可分解为: 3/11=1/5+1/15+1/165 试寻求分数3/11新的埃及分数式。

1.贪心算法设计要点

2.贪心算法设计步骤

3.贪心选择范围的扩展 以上贪心选择时,每一步都选比本分数小的最大埃及分数。这样尽管快速,但因为太严格可能会失去一些构建时机,或者可能根本找不到埃及分数式。 试把埃及分数贪心选择的环境适当放宽,选择范围适当扩大,即埃及分数的分母由以上贪心选择最小分母c=int(b/a)+1,扩展至c=int(b/a)+d,这里d为放宽尺度1,…,5等。必要时可把该尺度作扩大或缩小调整。

7.4 可拆背包问题

3. 贪心算法描述 // 已对n件物品按单位重量的效益降序排序 cw=c;s=0; // cw为背包还可装的重量 3. 贪心算法描述 // 已对n件物品按单位重量的效益降序排序 cw=c;s=0; // cw为背包还可装的重量 for(i=1;i<=n;i++) {if(w[i]>cw) break; x[i]=1.0; // 若w(i)<=cw,整体装入 cw=cw−w[i]; s=s+p[i]; } x[i]=(float)(cw/w[i]); // 若w(i)>cw,装入一部分) s=s+p[i]*x[i];

7.5 数列操作与极差 7.5.1 数列操作 案例提出: 给定一个由n个正整数组成的数列,对数列进行一次操作:去除其中两项a、b,然后添加一项a×b+1。每操作一次数列减少一项,经n−1次操作后该数列只剩一个数。 试求在n-1次操作后最后得数的最大值。

1. 贪心算法设计 要点 设数列有3项x,y,z (x≤y≤z),由 (x×y+1)×z+1 ≥ (x×z+1)×y+1 ≥ (y×z+1)×x+1 可知选取数列中最小的2项操作,可使积最大。 采用贪心算法,当数列中有3项以上时,为使最后所得数最大,每次选择去掉最小的2项操作。 设置a数组存储数列各项,同时对n项进行升序排列。

为了得到最大值,设置控制n-1次操作的k(1——n-1)循环。每次操作对最小的前2 项a[k]、a[k+1]实施操作: x=a[k];y=a[k+1];a[k+1]=x*y+1; 操作后,应用逐项比较对a[k+1],…,a[n]进行升序排列,为下一次操作做准备。 最后所得a[n]即为所求的数列操作的最大值。 因应用逐项比较进行排列,其时间复杂度为O(n^2),因而数列操作的贪心设计的时间复杂度为O(n^3)。

2. 贪心算法设计 描述 // 先行对原始数据a数组升序排序 for(k=1;k<=n-1;k++) // 共操作n-1次 2. 贪心算法设计 描述 // 先行对原始数据a数组升序排序 for(k=1;k<=n-1;k++) // 共操作n-1次 { x=a[k];y=a[k+1];a[k+1]=x*y+1; // 实施一次操作 for(i=k+1;i<=n-1;i++) // 操作后升序排列 for(j=i+1;j<=n;j++) if(a[i]>a[j]) { h=a[i];a[i]=a[j];a[j]=h;} } printf("\n 最大值为:%ld \n",a[n]);

3. 贪心算法设计 优化 按贪心算法,每次操作只对最小的两项进行操作,因而无须对整个数列排序。我们只要把实施排序的2重循环 3. 贪心算法设计 优化 按贪心算法,每次操作只对最小的两项进行操作,因而无须对整个数列排序。我们只要把实施排序的2重循环 for(i=k+1;i<=n-1;i++) for(j=i+1;j<=n;j++) 改进为: for(i=k+1;i<=k+2;i++) 这样,把原排序的时间复杂度O(n^2)降低为O(n),于是整个数列操作的时间复杂度降低至O(n^2)。

7.6 哈夫曼树及其应用 7.6.1 哈夫曼树 设二叉树共有n个端点,从二叉树第k个端点到树的根结点的路径长度l(k)为该端结点(或叶子)的祖先数,即该叶子的层数减1。同时,每一个结点都带一个权(实数),第k个端点所带权为w(k)。定义各个端结点的路径长l(k)与该点的权w(k)的乘积之和为该二叉树的带权路径长,即 对n个权值w(1),w(2),…,w(n),构造出所有由n个分别带这些权值的叶结点组成的二叉树,其中带权路径长wpl最小的二叉树称为哈夫曼树。

例如,给出5个权值{5,4,7,2,8},可生成多棵二叉树,下图所示为其中的3棵: 它们的带权路径长wpl分别为 (a) wpl=7×3+2×3+4×2+5×2+8×2=61 (b) wpl=5×3+2×3+8×2+4×2+7×2=59 (c) wpl=2×3+4×3+5×2+7×2+8×2=58 比较所有的二叉树,其中图(c)的wpl最小,即为对应权{5,4,7,2,8}的哈夫曼树。

1. 哈夫曼算法 哈夫曼给出一个贪心策略的算法,称为哈夫曼算法。 1. 哈夫曼算法 哈夫曼给出一个贪心策略的算法,称为哈夫曼算法。 1) 根据给定的n个权值{w(1),w(2),…,w(n)}构成n棵二叉树的森林F=(T1,…,Tn)。其中每棵二叉树中只有一个带权为w(k)的根结点,其左右子树为空。 2) 在F中选取两棵结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上结点权值之和。 3) 在F中删除这两棵树,并把新得的二叉树加入F中。 4) 重复以上 2),3),直到F只含一棵树为止。这棵树即为哈夫曼树。

1. 哈夫曼算法要点 1) 首先,对给定的n个权值作升序排列。 1. 哈夫曼算法要点 1) 首先,对给定的n个权值作升序排列。 2) 设置n-1次操作的k(1——n-1)循环,在第k次操作中,由两个最小权值叶结点生成一个新结点: x=w[2*k-1]; y=w[2*k]; w[n+k]=x+y; lc[n+k]=x; rc[n+k]=y; 3) 新结点参与排序,为下一次操作做准备。 考虑到每一次排序可能改变w数组元素顺序,设置u数组,每次所得新结点,其数据传送给u数组,最后输出时不是按已改变次序的w数组,而是按u数组输出。 4) 为具体画出哈夫曼树提供方便,输出展示每一个结点的左右子结点的表。

2. 哈夫曼算法描述 for(k=1;k<=n-1;k++) // 实施操作n-1次 {x=w[2*k-1]; y=w[2*k]; 2. 哈夫曼算法描述 for(k=1;k<=n-1;k++) // 实施操作n-1次 {x=w[2*k-1]; y=w[2*k]; w[n+k]=x+y; s=s+w[n+k]; z=w[n+k]; u[n+k]=w[n+k]; printf("\n 第%d次操作后为:",k); for(i=2*k+1;i<=2*k+2;i++) // 操作后找出最小的2项 for(j=i+1;j<=n+k;j++) if(w[i]>w[j]) {h=w[i];w[i]=w[j];w[j]=h;} for(j=2*k+1;j<=n+k;j++) // 输出第k次操作结果 { printf(" %d",w[j]); if(w[j]==z) printf("(%d+%d)",x,y); }} printf("\n 最小带权路径长为:%d ",s);

7.7 贪心算法应用小结 比较动态规划与贪心算法都是求解最优化问题: 1. 着眼点不同 动态规划算法着眼全局,而贪心算法着眼局部。 7.7 贪心算法应用小结 比较动态规划与贪心算法都是求解最优化问题: 1. 着眼点不同 动态规划算法着眼全局,而贪心算法着眼局部。 2. 求解的结果可能不同 动态规划算法求解结果总是最优的,贪心算法对大多数优化问题能得到最优解,但有时并不能求得最优解。 3. 求解效率上的差异 从求解效率来说,贪心算法比动态规划更高,且一般不存在空间限制的影响。 4. 求解范围上的差异 应用贪心算法有时可简化一些构造性问题。

第7章 作业 第7章上机 习题7: 1, 2, 3, 4, 5 (1) 上机通过本章删数字、埃及分数式、可拆背包与数列操作问题等典型案例; 第7章 作业 习题7: 1, 2, 3, 4, 5 第7章上机 (1) 上机通过本章删数字、埃及分数式、可拆背包与数列操作问题等典型案例; (2) 上机通过习题7-4,7-5; (3) 分组讨论并上机通过哈夫曼树与哈夫曼编码等案例。

欢迎大家提出教学建议 返回