算法设计与分析 第三章-2ppt
合集下载
算法设计与分析-第3章-蛮力法
哨兵
0123456789 k 10 15 24 6 12 35 40 98 55
查找方向
i
清华大学出版社
算法设计与分析
算法3.2——改进的顺序查找
int SeqSearch2(int r[ ], int n, int k) //数组r[1] ~ r[n]存放查找集合 { r[0]=k; i=n; while (r[i]!=k)
清华大学出版社
算法设计与分析
第3章 蛮力法
3.1 蛮力法的设计思想 3.2 查找问题中的蛮力法 3.3 排序问题中的蛮力法 3.4 组合问题中的蛮力法 3.5 图问题中的蛮力法 3.6 几何问题中的蛮力法 3.7 实验项目——串匹配问题
清华大学出版社
算法设计与分析
3.1 蛮力法的设计思想
蛮力法的设计思想:直接基于问题的描述。 例:计算an
52 37 65 不可行 不可行 不可行 不可行 不可行
清华大学出版社
算法设计与分析
对于一个具有n个元素的集合,其子集 数量是2n,所以,不论生成子集的算法 效率有多高,蛮力法都会导致一个Ω(2n) 的算法。
清华大学出版社
算法设计与分析
3.4.4 任务分配问题
假设有n个任务需要分配给n个人执行, 每个任务只分配给一个人,每个人只分配一 个任务,且第j个任务分配给第i个人的成本 是C[i, j](1≤i , j≤n),任务分配问题要求 找出总成本最小的分配方案。
用蛮力法解决0/1背包问题,需要考虑给定n个 物品集合的所有子集,找出所有可能的子集(总重 量不超过背包容量的子集),计算每个子集的总价 值,然后在他们中找到价值最大的子集。
清华大学出版社
算法设计与分析
10
算法分析与设计PPT教学课件 Algorithms Chapter 2 算法效率分析基础
掌握算法中近似时间的表示、非递归、递归算法 的效率分析方法,了解算法的经验分析
3
分析框架——输入规模度量
输入规模度量
算法的时间效率和空间效率都用输入规模的函 数进行度量。 对于所有的算法,对于规模更大的输入都需要 运行更长的时间。 经常使用一个输入规模n为参数的函数来研究 算法的效率。 选择输入规模的合适量度,要受到所讨论算法 的操作细节影响。
12
利用极限比较增长次数
前两种情况意味着t(n) ∈ O(g(n)) 后两种情况意味着t(n) ∈ Ω(g(n)) 第二种情况意味着t(n) ∈ Θ(g(n))
P44例题
13
Graphs
f(n) is O(g(n)) cg(n) f(n)
f(n) is (g(n))
f(n) cg(n)
N
N c1g(n) f(n) c2g(n) Points to notice: What happens near the beginning (n < N) is not important cg(n) always passes through 0, but f(n) might not (why?) In the third diagram, c1g(n) and c2g(n) have the same “shape 14 ” (why?)
22
//输出:n!的值
if n=0 retuen 1 else return F(n-1)*n
举例:F(5)
分析递归算法效率的通用方案
决定用哪个参数作为输入规模的度量 找出算法的基本操作 检查对相同规模的输入,基本操作的执行 次数是否相同,如果不同,必须对最差、 平均及最优效率单独研究 建立一个递推关系式及相应的初始条件 求解这个递归关系式,或者至少确定解的 增长次数
3
分析框架——输入规模度量
输入规模度量
算法的时间效率和空间效率都用输入规模的函 数进行度量。 对于所有的算法,对于规模更大的输入都需要 运行更长的时间。 经常使用一个输入规模n为参数的函数来研究 算法的效率。 选择输入规模的合适量度,要受到所讨论算法 的操作细节影响。
12
利用极限比较增长次数
前两种情况意味着t(n) ∈ O(g(n)) 后两种情况意味着t(n) ∈ Ω(g(n)) 第二种情况意味着t(n) ∈ Θ(g(n))
P44例题
13
Graphs
f(n) is O(g(n)) cg(n) f(n)
f(n) is (g(n))
f(n) cg(n)
N
N c1g(n) f(n) c2g(n) Points to notice: What happens near the beginning (n < N) is not important cg(n) always passes through 0, but f(n) might not (why?) In the third diagram, c1g(n) and c2g(n) have the same “shape 14 ” (why?)
22
//输出:n!的值
if n=0 retuen 1 else return F(n-1)*n
举例:F(5)
分析递归算法效率的通用方案
决定用哪个参数作为输入规模的度量 找出算法的基本操作 检查对相同规模的输入,基本操作的执行 次数是否相同,如果不同,必须对最差、 平均及最优效率单独研究 建立一个递推关系式及相应的初始条件 求解这个递归关系式,或者至少确定解的 增长次数
算法设计与分析课堂PPT
105 秒
11
算法算设法计设与计分与析分>析算法>教概学述安排
算法设计与分析
2、对给定的算法如何分析它的运行效率(复杂 性)
在给定的计算模型下,研究算法或问题的 复杂性:上界、下界、平均以及问题固有 复杂性
12
算法算设法计设与计分与析分>析算法>教概学述安排
课程目标
使学生掌握计算机算法的通用设计方法 ,学会分析算法的空间和时间复杂性。对一 定的实际问题,能够设计求解算法并分析算法 的效率。
5
算算法法设设计计与与分分析析>算>教法学概安述排
例如:第17周上交报告的安排如下,16周周日早上发现 什么报告都没有写,如何安排时间以确保每门课的报告
都能如期完成?若不能全部按期完成,也能尽量使迟交
报告的数目减到最小?
学科
算法设 计与分
析
数据库 原理
计算机 体系结
构
微机原 理
生物认 证技术
高级程 序设计 原理
算法设计与分析>算法概述
2.算法设计过程(程序设计过程)
1.问题的陈述 理解问题,并用科学规范的语言把所求解问题进行准
确的描述,包括所有已知条件和输出要求.
2.建立数学模型 通过对问题分析,找出其中所有操作对象以及对象之
间的关系,并用数学语言加以描述. 对非数值型解法来说, 数学模型通常是链表,树,图,集合等数据结构.
基本内容:
第一章 算法概述 第二章 递归与分治 第三章 动态规划 第四章 贪心算法 第五章 回朔法 第六章 分支限界法 第七章 随机化算法
预备知识: 离散数学、数据结构、程序设计语言C、C++
15
算法算设法计设与计分与析分>析算法>教概学述安排
《计算机算法设计与分析》第三章动态规划法
解决复杂问题 动态规划可以将复杂问题分解为简单的子问题, 通过逐步求解子问题来得到原问题的解,使得复 杂问题得以解决。
发展历程及现状
发展历程
动态规划的思想起源于20世纪50年代,由美国数学家Richard Bellman提出。随着计 算机科学的发展,动态规划在算法设计和分析领域得到了广泛应用和深入研究。
第六章
总结与展望
动态规划法在计算机科学中重要性
高效求解最优化问题
动态规划法通过把原问题分解为相对简单的子问题,并保存子问题的解,避免了大量重复计算,从而高效地求解最优化问题。
广泛应用
动态规划法在计算机科学、经济学、生物信息学等领域都有广泛应用,如背包问题、最短路径问题、序列比对问题等。
提供算法设计框架 动态规划法不仅为解决特定问题提供了有效方法,而且为算法设计提供了一个通用框架,有助于理解和设 计更复杂的算法。
现状
目前,动态规划已经成为计算机算法设计和分析领域的重要工具之一。在实际应用 中,许多复杂的问题都可以通过动态规划的方法得到有效的解决。同时,随着计算 机技术的不断发展,动态规划的应用领域也在不断扩展。
第二章
动态规划法基本原理
最优子结构性质
在动态规划法中, 子问题之间是相互 独立的,即一个子 问题的求解不会影 响到其他子问题的 求解。这使得动态 规划法能够避免重 复计算,提高算法 效率。
学习相关算法和技术
学习与动态规划法相关的其他算法 和技术,如贪心算法、分治法等, 以便在实际问题中灵活应用。
关注最新研究进展
关注计算机科学和算法设计领域的 最新研究进展,了解动态规划法的 新发展和应用,保持对新技术的敏 感性和好奇心。
THANKS
感谢观看
基本思想
发展历程及现状
发展历程
动态规划的思想起源于20世纪50年代,由美国数学家Richard Bellman提出。随着计 算机科学的发展,动态规划在算法设计和分析领域得到了广泛应用和深入研究。
第六章
总结与展望
动态规划法在计算机科学中重要性
高效求解最优化问题
动态规划法通过把原问题分解为相对简单的子问题,并保存子问题的解,避免了大量重复计算,从而高效地求解最优化问题。
广泛应用
动态规划法在计算机科学、经济学、生物信息学等领域都有广泛应用,如背包问题、最短路径问题、序列比对问题等。
提供算法设计框架 动态规划法不仅为解决特定问题提供了有效方法,而且为算法设计提供了一个通用框架,有助于理解和设 计更复杂的算法。
现状
目前,动态规划已经成为计算机算法设计和分析领域的重要工具之一。在实际应用 中,许多复杂的问题都可以通过动态规划的方法得到有效的解决。同时,随着计算 机技术的不断发展,动态规划的应用领域也在不断扩展。
第二章
动态规划法基本原理
最优子结构性质
在动态规划法中, 子问题之间是相互 独立的,即一个子 问题的求解不会影 响到其他子问题的 求解。这使得动态 规划法能够避免重 复计算,提高算法 效率。
学习相关算法和技术
学习与动态规划法相关的其他算法 和技术,如贪心算法、分治法等, 以便在实际问题中灵活应用。
关注最新研究进展
关注计算机科学和算法设计领域的 最新研究进展,了解动态规划法的 新发展和应用,保持对新技术的敏 感性和好奇心。
THANKS
感谢观看
基本思想
精品课件-算法设计与分析PPT课件
19
Bland提出避免循环的一个简单易行的方法。Bland提出在单纯形算法迭代中,按照下面的2个简单规则就可以避免循环。规则1:设 ,取xe为入基变量。规则2:设 取xk为离基变量。算法leave(col)已经按照规则2选取离基变量。选取入基变量的算法enter(objrow) 中只要加一个break语句即可。
4
这个问题的解为 (x1,x2,x3,x4) = (0,3.5,4.5,1);最优值为16。
5
8.1.2 线性规划基本定理
约束条件(8.2)-(8.5)中n个约束以等号满足的可行解称为线性规划问题的基本可行解。若n>m,则基本可行解中至少有n-m个分量为0,也就是说,基本可行解中最多有m个分量非零。线性规划基本定理:如果线性规划问题有最优解,则必有一基本可行最优解。上述定理的重要意义在于,它把一个最优化问题转化为一个组合问题,即在(8.2) -(8.5)式的m+n个约束条件中,确定最优解应满足其中哪n个约束条件的问题。由此可知,只要对各种不同的组合进行测试,并比较每种情况下的目标函数值,直到找到最优解。Dantzig于1948年提出了线性规划问题的单纯形算法。单纯形算法的特点是:1)只对约束条件的若干组合进行测试,测试的每一步都使目标函数的值增加;2)一般经过不大于m或n次迭代就可求得最优解。
16
为了进一步构造标准型约束,还需要引入m个人工变量,记为zi。至此,原问题已经变换为等价的约束标准型线性规划问题。对极小化线性规划问题,只要将目标函数乘以-1即可化为等价的极大化线性规划问题。
17
8.1.5 一般线性规划问题的2阶段单纯形算法
引入人工变量后的线性规划问题与原问题并不等价,除非所有zi都是0 。为了解决这个问题,在求解时必须分2个阶段进行。第一阶段用一个辅助目标函数 替代原来的目标函数。这个线性规划问题称为原线性规划问题所相应的辅助线性规划问题。对辅助线性规划问题用单纯形算法求解。如果原线性规划问题有可行解,则辅助线性规划问题就有最优解,且其最优值为0,即所有zi都为0。在辅助线性规划问题最后的单纯形表中,所有zi均为非基本变量。划掉所有zi相应的列,剩下的就是只含xi和yi的约束标准型线性规划问题了。单纯形算法第一阶段的任务就是构造一个初始基本可行解。单纯形算法第二阶段的目标是求解由第一阶段导出的问题。此时要用原来的目标函数进行求解。如果在辅助线性规划问题最后的单纯形表中, zi不全为0,则原线性规划问题没有可行解,从而原线性规划问题无解。
Bland提出避免循环的一个简单易行的方法。Bland提出在单纯形算法迭代中,按照下面的2个简单规则就可以避免循环。规则1:设 ,取xe为入基变量。规则2:设 取xk为离基变量。算法leave(col)已经按照规则2选取离基变量。选取入基变量的算法enter(objrow) 中只要加一个break语句即可。
4
这个问题的解为 (x1,x2,x3,x4) = (0,3.5,4.5,1);最优值为16。
5
8.1.2 线性规划基本定理
约束条件(8.2)-(8.5)中n个约束以等号满足的可行解称为线性规划问题的基本可行解。若n>m,则基本可行解中至少有n-m个分量为0,也就是说,基本可行解中最多有m个分量非零。线性规划基本定理:如果线性规划问题有最优解,则必有一基本可行最优解。上述定理的重要意义在于,它把一个最优化问题转化为一个组合问题,即在(8.2) -(8.5)式的m+n个约束条件中,确定最优解应满足其中哪n个约束条件的问题。由此可知,只要对各种不同的组合进行测试,并比较每种情况下的目标函数值,直到找到最优解。Dantzig于1948年提出了线性规划问题的单纯形算法。单纯形算法的特点是:1)只对约束条件的若干组合进行测试,测试的每一步都使目标函数的值增加;2)一般经过不大于m或n次迭代就可求得最优解。
16
为了进一步构造标准型约束,还需要引入m个人工变量,记为zi。至此,原问题已经变换为等价的约束标准型线性规划问题。对极小化线性规划问题,只要将目标函数乘以-1即可化为等价的极大化线性规划问题。
17
8.1.5 一般线性规划问题的2阶段单纯形算法
引入人工变量后的线性规划问题与原问题并不等价,除非所有zi都是0 。为了解决这个问题,在求解时必须分2个阶段进行。第一阶段用一个辅助目标函数 替代原来的目标函数。这个线性规划问题称为原线性规划问题所相应的辅助线性规划问题。对辅助线性规划问题用单纯形算法求解。如果原线性规划问题有可行解,则辅助线性规划问题就有最优解,且其最优值为0,即所有zi都为0。在辅助线性规划问题最后的单纯形表中,所有zi均为非基本变量。划掉所有zi相应的列,剩下的就是只含xi和yi的约束标准型线性规划问题了。单纯形算法第一阶段的任务就是构造一个初始基本可行解。单纯形算法第二阶段的目标是求解由第一阶段导出的问题。此时要用原来的目标函数进行求解。如果在辅助线性规划问题最后的单纯形表中, zi不全为0,则原线性规划问题没有可行解,从而原线性规划问题无解。
算法设计与分析第三章循环与递归详解演示文稿
/*minj代表当前行中最小值的列下标;设置标志量kz*/
readmtr(a,n);
prntmtr(a,n);
for(i=0;i<n;i++)
{t=a[i][0]; minj=1;
for(j=1;j<n;j++)
if(a[i][j]<t) {t=a[i][j];minj=j;} for(k=0;k<n;k++)
if(a[i][j]<t) {
t=a[i][j];
minj=j; }
第18页,共50页。
3)检验t是否第minj列的最大值,是,则输出鞍点;
for(k=0;k<n;k=k+1) if(a[k][minj]>t) break;
if(k<n) continue; print(“the result is a[“,i ,“][” ,minj, “]=”, t);
基于以上数据变化规律,以层号作为外层循环,循环变量为i(范围为1— —n);以层内元素从左上到右下的序号作为内循环,循环变量为j(范围为 1——n+1-i)。这样循环的执行过程正好与“摆放”自然数的顺序相同。用 一个变量k模拟要“摆放”的数据,下面的问题就是怎么样将数据存储到对应 的数组元素。
第22页,共50页。
数组元素的存取,只能是按行、列号操作的。所以下面用由具体到抽 象设计循环的“归纳法”,找出数组元素的行号、列号与层号i及层内序号 j的关系:
1.每层内元素的列号都与其所在层内的序号j是相同的。因为每层的序号是从 第一列开始向右下进行。
2.元素的行与其所在的层号及在层内的序号均有关系,具体地: 第一层行号1——n,行号与j同;
算法设计与分析 ppt
算法设计与分析 >目录
第一章 算法概述 第二章 递归与分治策略 第三章 动态规划 第四章 贪心算法 第五章 回朔法 第六章 分支限界法 第七章 随机化算法
1
算法设计与分析 >第一章 目录
1.1 算法与程序 1.2 算法复杂度分析 1.3 NP完全性理论
2
算法设计与分析>算>法算概法述概述
1.1 算法与程序 1 算法定义及其特性
A
是
否
条件成立?
条件成立?
是
否
B
A
B
A
C
14
算法设计与分>析算>法算概法述概述
5. 算法分类
从解法上 数值型算法:算法中的基本运算为算术运算. 非数值型算法:算法中的基本运算为逻辑运算.
从处理方式上 串行算法:串行计算机上执行的算法. 并行算法:并行计算机上执行的算法.
本课程主要介绍非数值型的串行算法.
如果存在一个函数 ~T(n)使得当n ,有
(T(n) - ~T(n)) / T(n)0
称 ~T(n)是T(n)当 n 时的渐进性态 或 渐进复杂性
27
算法设计与分>>析算算法>法算复概法杂述概性分述析 >渐进性态
在数学上,T(n)与 ~T(有n)相同的最高阶项.可取 为~T(略n去) T(n)的低阶项后剩余的主项. 例如 T(n)=3n2+4nlogn+7, 则 ~T(n) 可以是3n2 当n充分大时用 ~T(n)代替T(n)作为算法复杂性的度量, 以简化分析 比较两个算法时,如果他们的阶不同,就可分出效率高低 。故此时只需关心 ~T最(n高) 限的阶即可。可忽略最高项系 数或低阶项。
4
第一章 算法概述 第二章 递归与分治策略 第三章 动态规划 第四章 贪心算法 第五章 回朔法 第六章 分支限界法 第七章 随机化算法
1
算法设计与分析 >第一章 目录
1.1 算法与程序 1.2 算法复杂度分析 1.3 NP完全性理论
2
算法设计与分析>算>法算概法述概述
1.1 算法与程序 1 算法定义及其特性
A
是
否
条件成立?
条件成立?
是
否
B
A
B
A
C
14
算法设计与分>析算>法算概法述概述
5. 算法分类
从解法上 数值型算法:算法中的基本运算为算术运算. 非数值型算法:算法中的基本运算为逻辑运算.
从处理方式上 串行算法:串行计算机上执行的算法. 并行算法:并行计算机上执行的算法.
本课程主要介绍非数值型的串行算法.
如果存在一个函数 ~T(n)使得当n ,有
(T(n) - ~T(n)) / T(n)0
称 ~T(n)是T(n)当 n 时的渐进性态 或 渐进复杂性
27
算法设计与分>>析算算法>法算复概法杂述概性分述析 >渐进性态
在数学上,T(n)与 ~T(有n)相同的最高阶项.可取 为~T(略n去) T(n)的低阶项后剩余的主项. 例如 T(n)=3n2+4nlogn+7, 则 ~T(n) 可以是3n2 当n充分大时用 ~T(n)代替T(n)作为算法复杂性的度量, 以简化分析 比较两个算法时,如果他们的阶不同,就可分出效率高低 。故此时只需关心 ~T最(n高) 限的阶即可。可忽略最高项系 数或低阶项。
4
算法设计与分析课件
2019/6/10
35
2.3递归技术
以上的关系实际上给出了计算Q(n,m)的 递归式如下递归技术
可以设计出计算Q(n,m)的递归算法如下:
int Q(int n, int m)
{
if((n < 1) || (m < 1))
return 0;
if((n == 1) || (m == 1))
2019/6/10
8
1.2计算复杂性的测度
问题的规模:也就是该问题所谓的体积,或者说是大 小。一个问题的体积可以用一个整数来表示,它是对 问题的输入数据或初始数据的多少的一种量度。
定义:如果一个问题的体积是n,解决这一问题的某一 算法所需要的时间为T(n),它是n的某一函数,T(n)称 作这一算法的“时间复杂性”。当输入量n逐渐增大时, T(n)的极限情形就称作算法的“渐近时间复杂性”, 类似可定义算法的空间复杂性。但实际上人们主要是 研究算法的时间复杂性而很少讨论它们的空间耗费。
2019/6/10
29
2.3递归技术
Acheman函数A(n,m)有两个独立的整变 量m≥0 和 n≥0,其定义如下:
2019/6/10
30
2.3递归技术
A(n,m)的自变量m的每一个值都定义了一个单 变量函数。由递归式的第三式可知m = 0定义 了函数“加2”。
当m = 1时,由于A(1,1) = A(A(0,1),0) = A(1,0) = 2以及A(n,1) = A(A(n-1,1),0) = A(n1,1) + 2 (n > 1),则A(n,1) = 2n (n ≥ 1),即 A(n,1)是函数“乘2”
2019/6/10
14
第三章 搜索(2)—启发式搜索
计算f(n, mi):=g(n, mi)+h(mi); ADD(mj, OPEN), 标记mj到n的指针; IF f(n, mk)<f(mk) THEN f(mk):=f(n, mk), 标记mk到n的指针; IF f(n, ml)<f(ml) THEN f(ml):=f(n, ml), 标记ml到n的指针, ADD(ml, OPEN);
第三章 - 14
启发式搜索
3.1.0 局部择优搜索
Hill Climbing Strategy(爬山策略)
①在搜索过程中扩展当前状态; ②评估它的孩子; ③选择最佳的孩子做进一步扩展; ④当搜索遇到了一个比其所有孩子都更佳的状态时 便停止。 注意:这个过程中,既不保留它的兄弟节点,也不 保留它的双亲。所以无法辨别局部和全局最大值。
g(n)=1
每个状态的f (n)值:
从n到起始状态的实际值 错位的牌数
第三章 - 34
启发式搜索
思考题
八皇后问题
在国际象棋棋盘的一个8×8区域放置8个皇后棋子, 并满足约束:每行、每列和对角线上只允许出现一 个皇后,以避免皇后间发生冲突。
第三章 - 35
启发式搜索
思考题
设计四皇后问题的启发函数h(n)
G
第三章 - 15
启发式搜索
3.1.0 局部择优搜索
基于爬山策略的启发式搜索
3
A
5 4
4
B
5
4
S C
10.1 3.5 9.2
S
G
A
10.1
D
11.5 7.1
D
2
E
4
第三章 - 14
启发式搜索
3.1.0 局部择优搜索
Hill Climbing Strategy(爬山策略)
①在搜索过程中扩展当前状态; ②评估它的孩子; ③选择最佳的孩子做进一步扩展; ④当搜索遇到了一个比其所有孩子都更佳的状态时 便停止。 注意:这个过程中,既不保留它的兄弟节点,也不 保留它的双亲。所以无法辨别局部和全局最大值。
g(n)=1
每个状态的f (n)值:
从n到起始状态的实际值 错位的牌数
第三章 - 34
启发式搜索
思考题
八皇后问题
在国际象棋棋盘的一个8×8区域放置8个皇后棋子, 并满足约束:每行、每列和对角线上只允许出现一 个皇后,以避免皇后间发生冲突。
第三章 - 35
启发式搜索
思考题
设计四皇后问题的启发函数h(n)
G
第三章 - 15
启发式搜索
3.1.0 局部择优搜索
基于爬山策略的启发式搜索
3
A
5 4
4
B
5
4
S C
10.1 3.5 9.2
S
G
A
10.1
D
11.5 7.1
D
2
E
4
算法设计与分析基础第三PPTch文档ppt
for i ←1 to n-1 do replace each of the subsequent rows (i.e., rows i+1, …, n) by a difference between that row and an appropriate multiple of the i-th row to make the new coefficient in the i-th column of that row 0
Note: About nlog2 n comparisons are also sufficient to sort array of size n (by mergesort).
Searching with presorting
Problem: Search for a given K in A[0..n-1]
Instance simplification - Presorting
Solve a problem’s instance by transforming it into another simpler/easier instance of the same problem
Presorting Many problems involving lists are easier when list is sorted, e.g.
Solve the latter by substitutions starting with the last equation and moving up to the first one.
a11x1 + a12x2 + … + a1nxn = b1 a21x1 + a22x2 + … + a2nxn = b2
Note: About nlog2 n comparisons are also sufficient to sort array of size n (by mergesort).
Searching with presorting
Problem: Search for a given K in A[0..n-1]
Instance simplification - Presorting
Solve a problem’s instance by transforming it into another simpler/easier instance of the same problem
Presorting Many problems involving lists are easier when list is sorted, e.g.
Solve the latter by substitutions starting with the last equation and moving up to the first one.
a11x1 + a12x2 + … + a1nxn = b1 a21x1 + a22x2 + … + a2nxn = b2
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 11.
}}}
8
算法设计与分析 >动态规划
3.10 0-1背包问题
有编号分别为a,b,c,d,e的五件宝石原石,它们的 重量分别是2,2,6,5,4千克,它们的价值分别是 6,3,5,4,6万元。 物品名称 重量(千克) 价值(万)
现在给你个承重为10千 克的背包,如何让背包 里装入的物品具有最大 的价值总和?
0 i j t[i][ j ] min{t[i][k ] t[k 1][ j ] w(vi 1vk v j )} i j i k j
7
算法设计与分析 >动态规划
4. 计算最优值
Void MinWeightTriangulation(int n, Type **t, int **s) 2. { for (int i = 1; i <= n; i++) t[i][i] = 0; 3. for (int r = 2; r <= n; r++) 4. for (int i = 1; i <= n – r +1; i++) { 5. int j = i + r – 1; 6. t[i][j] = t[i+1][j] + w(i–1, i, j); 7. s[i][j] = i; 8. for (int k = i + 1; k < j; k++) { 9. int u = t[i][k] + t[k+1][j] + w(i–1, k, j); 10. if (u < t[i][j]) {t[i][j] = u; s[i][j] = k;}
m(i, j) =
max{m(i+1, j), m(i+1, j–wi)+vi} j≥wi
显然,对于j为连续的,wi为实数时,m(i, j)依 然是梯状单调不减函数。
20
算法设计与分析 >动态规划
阶跃函数m(i, j)的跳跃点
• 实际上在m(i, j)的计算中并不需要将j逐渐加 1。因为m(i, j)有阶跃性。这样的点称为函数 m(i, j)的跳跃点,可以表示为(j, m(i,j))。
13
算法设计与分析 >动态规划
由0-1背包问题的最优子结构性质,可以建 立计算m( i , j )的递归式如下。 选择了物品i
的最优解
j wi m(i 1, j ), m(i 1, j wi ) vi } max{ m(i, j ) 0 j wi m(i 1, j )
•叶结点:矩阵
3
算法设计与分析 >动态规划
2、最优子结构性质
最优三角剖分问题
输入:多边形P 和代价函数W 输出:求P 的三角剖分T,使得ห้องสมุดไป่ตู้价 Σs∈STW(s)最小,其中ST 是T 所对应 的三角形集合
4
算法设计与分析 >动态规划
3、最优三角剖分的递归结构
定义t[i][j],1≤i<j≤n为凸子多边形{vi-1,vi,…,vj}
1. jMax=min(w[i]-1,c); 如果第i个物品不能放入背包,则m(i,j)=m(i+1,j) int 2. (int 否则,比较放与不放两种情况下哪种更优,取更优的值 for j = 0; j <= jMax; j++) 最为 的值。 m[i][ j m(i,j) ] =m[i+1][j]; (int j = w[i]; j <= c; j++) 3. for 考虑第一个物品,不能放的话 m(1,c)=m(2,c);否 m[i][j] = max(m[i+1][j], m[i+1][j-w[i]] + v[i]); } 则 m(1,c)= 放的情况下和不放情况下的最大值。 m[1][c] =m[2][c]; 4. 返回m(1,c) if (c >= w[1]) m[1][c] = max(m[1][c], m[2][c-w[1]] + v[1]); 16 }
j wn vn m(n, j ) 0 0 j wn
max(i,j)
4,6
当i=5时,
j4 6 m(5, j ) 0 0 j 4
j
该函数是关于变量j的阶梯状函数。
19
算法设计与分析 >动态规划
• 对于每一个确定的i,函数m(i, j)是关于变量j的阶 梯状单调不减函数: • 由0-1背包问题的递归式 m(i+1, j) 0≤j<wi 可知每当j增大超过一个物品的重量wi时,函数 m(i, j)便有可能增加vi,因而形成了关于变量j的 阶梯状单调不减函数。
11
算法设计与分析 >动态规划
如果不是最优 解,进行替代, 矛盾!
12
算法设计与分析 >动态规划
设所给0-1背包问题的子问题: 最优值m(i , j)是
max v k x k
k i n
n wk x k j k i x k {0,1}, i k n
即m(i ,j)是背包容量为 j,可选择物品为 i, i+1,…,n时0-1背包问题的最优值。
2. 从第n-1行开始到第2行,一行一行的填写m。假设 i行 for 当前填写的是第 (int i = n - 1; i > 1; i-) { // 计算剩下的m
算法设计与分析 >动态规划
void Traceback(T **m, int w[ ], int c, int n, int x[]) { // 计算x[i],它表示i物品是否装入背包 for (int i = 1; i < n; i++) if (m[i][c] ==m[i+1][c]) x[i] = 0; //未装入 else { x[i] = 1; //装入了背包 c -= w[i]; } x[n] = (m[n][c]) ? 1 : 0; }
a b c d e
2 2 6 5 4
6 3 5 4 6
9
算法设计与分析 >动态规划
给定n种物品和一背包。物品i的重量是 wi,其价值为vi,背包的容量为C。问应如何 选择装入背包的物品,使得装入背包中物品 的总价值最大? 对每种物品i只有两种选择,即装入背包 或者不装入背包,不能将物品i重复装入,也 不允许部分装入,因此,该问题被称为0-1背 包问题。
(d, e)实际上受控于 (a, b),被称为受控跳跃点。 m(i, j)
因此,将前面产生的跳跃点中的受控跳跃点删除, b 便可得到P[i]中的跳跃点。 e 由此便可得到计算表P[i]的算法。
10
算法设计与分析 >动态规划
0-1背包问题是一个特殊的整数规划问题。问 题的解是找出一个n元的0,1向量{x1, x2,……xn}, 使得
n wi xi C i 1 xi {0,1},1 i n
max vi xi
i 1
n
xi表示物品i是 否装入背包
15
算法设计与分析 >动态规划
void Knapsack(Type v[], int w[], int c, int n, Type **m) { 算法说明 : int 处理最简单情况,即填好 jMax=min(w[n]-1,c); 1. m(n,j)。当j<wn时, for (int j = 0; j <= jMax; j++) m[n][j] = 0; // 初始化m [n][] m(n,j)=0; 当j<wn时, m(n,j)=v[n]; for (int j = w[n]; j <= c; j++) m[n][ j ] = v[n];
22
算法设计与分析 >动态规划
跳跃点的递推关系
函数m(i,j)=
max{m(i+1, j), m(i+1, j–wi)+vi} 函数m(i,j)的全部跳跃点
p[i+1]=m(i+1,j)的跳跃点集
q[i+1]=m(i+1, j–wi)+vi的跳 跃点集 23
算法设计与分析 >动态规划
例子:n=5,c=10,w={2,2,6,5,4},v={6,3, 5,4,6},计算p[i] i=6 p[6]={(0,0)} i=5 p[5]={(0,0), (4,6)} q[6]=p[6](w5,v5)={(4,6)} q[5]={(5,4),(9,10)}
17
算法设计与分析 >动态规划
算法复杂度分析: 从m(i,j)的递归式容易看出,算法需要O(nc) 计算时间。
存在的不足: 求物品重量wi是整数 当背包容量c很大时,算法需要的计算时 间较多。例如,当c>2n时,算法需要Ω(n2n) 计算时间。
18
算法设计与分析 >动态规划
背包容量为实数时, 递归公式仍然成立 例子:n=5,c=10,w={2,2,6,5,4},v={6,3, 5,4,6}由计算m(i,j)的递归式,
m(i, j) xi,m(i, xi)
0
xi
c
j
21
算法设计与分析 >动态规划
跳跃点决定了函数m(i, j)
• 显然在m(i, j)的计算中,只需要计算它的跳 跃点。 • 在变量j是连续的情况下,我们可以对每个 确定的i (1≤i≤n),用一个表P[i]来保存m(i, j) 的全部跳跃点。 • 对于每一个确定的实数j,可以通过查表P[i] 来确定m(i, j)的值。 • 由于m(i, j)是单调不减的阶梯函数,所以P[i] 中的全部跳跃点的值也是递增排列的。
}}}
8
算法设计与分析 >动态规划
3.10 0-1背包问题
有编号分别为a,b,c,d,e的五件宝石原石,它们的 重量分别是2,2,6,5,4千克,它们的价值分别是 6,3,5,4,6万元。 物品名称 重量(千克) 价值(万)
现在给你个承重为10千 克的背包,如何让背包 里装入的物品具有最大 的价值总和?
0 i j t[i][ j ] min{t[i][k ] t[k 1][ j ] w(vi 1vk v j )} i j i k j
7
算法设计与分析 >动态规划
4. 计算最优值
Void MinWeightTriangulation(int n, Type **t, int **s) 2. { for (int i = 1; i <= n; i++) t[i][i] = 0; 3. for (int r = 2; r <= n; r++) 4. for (int i = 1; i <= n – r +1; i++) { 5. int j = i + r – 1; 6. t[i][j] = t[i+1][j] + w(i–1, i, j); 7. s[i][j] = i; 8. for (int k = i + 1; k < j; k++) { 9. int u = t[i][k] + t[k+1][j] + w(i–1, k, j); 10. if (u < t[i][j]) {t[i][j] = u; s[i][j] = k;}
m(i, j) =
max{m(i+1, j), m(i+1, j–wi)+vi} j≥wi
显然,对于j为连续的,wi为实数时,m(i, j)依 然是梯状单调不减函数。
20
算法设计与分析 >动态规划
阶跃函数m(i, j)的跳跃点
• 实际上在m(i, j)的计算中并不需要将j逐渐加 1。因为m(i, j)有阶跃性。这样的点称为函数 m(i, j)的跳跃点,可以表示为(j, m(i,j))。
13
算法设计与分析 >动态规划
由0-1背包问题的最优子结构性质,可以建 立计算m( i , j )的递归式如下。 选择了物品i
的最优解
j wi m(i 1, j ), m(i 1, j wi ) vi } max{ m(i, j ) 0 j wi m(i 1, j )
•叶结点:矩阵
3
算法设计与分析 >动态规划
2、最优子结构性质
最优三角剖分问题
输入:多边形P 和代价函数W 输出:求P 的三角剖分T,使得ห้องสมุดไป่ตู้价 Σs∈STW(s)最小,其中ST 是T 所对应 的三角形集合
4
算法设计与分析 >动态规划
3、最优三角剖分的递归结构
定义t[i][j],1≤i<j≤n为凸子多边形{vi-1,vi,…,vj}
1. jMax=min(w[i]-1,c); 如果第i个物品不能放入背包,则m(i,j)=m(i+1,j) int 2. (int 否则,比较放与不放两种情况下哪种更优,取更优的值 for j = 0; j <= jMax; j++) 最为 的值。 m[i][ j m(i,j) ] =m[i+1][j]; (int j = w[i]; j <= c; j++) 3. for 考虑第一个物品,不能放的话 m(1,c)=m(2,c);否 m[i][j] = max(m[i+1][j], m[i+1][j-w[i]] + v[i]); } 则 m(1,c)= 放的情况下和不放情况下的最大值。 m[1][c] =m[2][c]; 4. 返回m(1,c) if (c >= w[1]) m[1][c] = max(m[1][c], m[2][c-w[1]] + v[1]); 16 }
j wn vn m(n, j ) 0 0 j wn
max(i,j)
4,6
当i=5时,
j4 6 m(5, j ) 0 0 j 4
j
该函数是关于变量j的阶梯状函数。
19
算法设计与分析 >动态规划
• 对于每一个确定的i,函数m(i, j)是关于变量j的阶 梯状单调不减函数: • 由0-1背包问题的递归式 m(i+1, j) 0≤j<wi 可知每当j增大超过一个物品的重量wi时,函数 m(i, j)便有可能增加vi,因而形成了关于变量j的 阶梯状单调不减函数。
11
算法设计与分析 >动态规划
如果不是最优 解,进行替代, 矛盾!
12
算法设计与分析 >动态规划
设所给0-1背包问题的子问题: 最优值m(i , j)是
max v k x k
k i n
n wk x k j k i x k {0,1}, i k n
即m(i ,j)是背包容量为 j,可选择物品为 i, i+1,…,n时0-1背包问题的最优值。
2. 从第n-1行开始到第2行,一行一行的填写m。假设 i行 for 当前填写的是第 (int i = n - 1; i > 1; i-) { // 计算剩下的m
算法设计与分析 >动态规划
void Traceback(T **m, int w[ ], int c, int n, int x[]) { // 计算x[i],它表示i物品是否装入背包 for (int i = 1; i < n; i++) if (m[i][c] ==m[i+1][c]) x[i] = 0; //未装入 else { x[i] = 1; //装入了背包 c -= w[i]; } x[n] = (m[n][c]) ? 1 : 0; }
a b c d e
2 2 6 5 4
6 3 5 4 6
9
算法设计与分析 >动态规划
给定n种物品和一背包。物品i的重量是 wi,其价值为vi,背包的容量为C。问应如何 选择装入背包的物品,使得装入背包中物品 的总价值最大? 对每种物品i只有两种选择,即装入背包 或者不装入背包,不能将物品i重复装入,也 不允许部分装入,因此,该问题被称为0-1背 包问题。
(d, e)实际上受控于 (a, b),被称为受控跳跃点。 m(i, j)
因此,将前面产生的跳跃点中的受控跳跃点删除, b 便可得到P[i]中的跳跃点。 e 由此便可得到计算表P[i]的算法。
10
算法设计与分析 >动态规划
0-1背包问题是一个特殊的整数规划问题。问 题的解是找出一个n元的0,1向量{x1, x2,……xn}, 使得
n wi xi C i 1 xi {0,1},1 i n
max vi xi
i 1
n
xi表示物品i是 否装入背包
15
算法设计与分析 >动态规划
void Knapsack(Type v[], int w[], int c, int n, Type **m) { 算法说明 : int 处理最简单情况,即填好 jMax=min(w[n]-1,c); 1. m(n,j)。当j<wn时, for (int j = 0; j <= jMax; j++) m[n][j] = 0; // 初始化m [n][] m(n,j)=0; 当j<wn时, m(n,j)=v[n]; for (int j = w[n]; j <= c; j++) m[n][ j ] = v[n];
22
算法设计与分析 >动态规划
跳跃点的递推关系
函数m(i,j)=
max{m(i+1, j), m(i+1, j–wi)+vi} 函数m(i,j)的全部跳跃点
p[i+1]=m(i+1,j)的跳跃点集
q[i+1]=m(i+1, j–wi)+vi的跳 跃点集 23
算法设计与分析 >动态规划
例子:n=5,c=10,w={2,2,6,5,4},v={6,3, 5,4,6},计算p[i] i=6 p[6]={(0,0)} i=5 p[5]={(0,0), (4,6)} q[6]=p[6](w5,v5)={(4,6)} q[5]={(5,4),(9,10)}
17
算法设计与分析 >动态规划
算法复杂度分析: 从m(i,j)的递归式容易看出,算法需要O(nc) 计算时间。
存在的不足: 求物品重量wi是整数 当背包容量c很大时,算法需要的计算时 间较多。例如,当c>2n时,算法需要Ω(n2n) 计算时间。
18
算法设计与分析 >动态规划
背包容量为实数时, 递归公式仍然成立 例子:n=5,c=10,w={2,2,6,5,4},v={6,3, 5,4,6}由计算m(i,j)的递归式,
m(i, j) xi,m(i, xi)
0
xi
c
j
21
算法设计与分析 >动态规划
跳跃点决定了函数m(i, j)
• 显然在m(i, j)的计算中,只需要计算它的跳 跃点。 • 在变量j是连续的情况下,我们可以对每个 确定的i (1≤i≤n),用一个表P[i]来保存m(i, j) 的全部跳跃点。 • 对于每一个确定的实数j,可以通过查表P[i] 来确定m(i, j)的值。 • 由于m(i, j)是单调不减的阶梯函数,所以P[i] 中的全部跳跃点的值也是递增排列的。