算法设计与分析:动态规划法求扔鸡蛋问题 C++

目录

一、实验目的

二、问题描述

三、实验要求

四、算法思想和实验结果

1、动态规划法原理: 

2、解决方法:

2.1 方法一:常规动态规划

2.1.1 算法思想:

2.1.2 时间复杂度分析

2.1.3 时间效率分析

2.2 方法二:动态规划加二分查找最优x

2.2.1 算法思想:

2.2.2 时间复杂度分析

2.2.3 时间效率分析

2.3 方法三:动态规划加逆向求解

2.3.1 算法思想

2.3.2 时间复杂度分析

2.3.3 时间效率分析

3、结果输出示例


实验目的

1. 掌握动态规划算法设计思想。

2. 掌握扔鸡蛋问题的动态规划法。

问题描述

扔鸡蛋问题是计算机程序设计中的一个经典问题。从一幢楼房的不同楼层往下扔鸡蛋,用最少的最坏情况试验次数,确定鸡蛋不会摔碎的最高安全楼层。仅有一个鸡蛋供试验时,只能采用顺序查找法。有足够多的鸡蛋时,可以采用二分查找法。有多于一个但数量有限的鸡蛋时,采用动态规划方法求解。双蛋问题(two-egg problem)是本问题的一个特例,曾出现于谷歌的程序员面试题中。

有一幢楼房高层。某人准备了N个鸡蛋供试验。他想知道鸡蛋从几层扔下不会摔碎,并确定出最高安全楼层。试验过程中,鸡蛋没有摔碎则可以继续使用,摔碎了则需要换一个鸡蛋继续试验。为保证试验成功,此人要设计一个程序,以最小化最坏情况的试验次数F(M, N)。作为一个数学抽象,本问题采用一些理想化假设:所有鸡蛋抗摔能力相同,不计重复坠地的累积损伤,且忽略试验结果的偶然性。试验成功的标准是在N个鸡蛋用完之前,精确确定最高安全楼层是哪一层。允许有鸡蛋剩余。

如果只有N=1个鸡蛋供试验,则为了保证试验成功,只能从一层开始逐层往上试验。这相当于采用顺序查找算法,最坏试验次数F(M, 1)=M。如果一层就碎了,则最高安全楼层为0。如果M层还不碎,则最高安全楼层为M。

实验要求

1. 给出解决问题的动态规划方程;

2. 理论分析该算法的时间复杂度;

3. 分别测试M=10000, 20000, …, 100000, N=20时以及M=50000, N=11, 12, …, 20时的算法运行时间,并分析实验结果;

4. 依次在终端输出M=10000, N=1~20时的F(M, N)值,实验课时检查该代码,限用C或C++语言编写。

、算法思想和实验结果

1、动态规划法原理: 

        将复杂问题划分为更小的子问题,通过子问题的最优解来重构原问题的最优解。求解过程中,保存子问题的解,以便在需要时直接查表而不是重复计算,从而减少计算量。

2、解决方法:

2.1 方法一:常规动态规划
2.1.1 算法思想:

        用二维数组k[m][n]表示从第m层扔n个鸡蛋的动态规划法最优解,即该实验所要求的最少的最坏情况试验次数。

        对于m层、n个鸡蛋的求解,当尝试从第x层扔下一个鸡蛋时,有两种情况:

        1)鸡蛋破碎,剩余n-1个鸡蛋,则在第1层至第x-1层(共x-1层)继续尝试,即k[x-1][n-1]。

        2)鸡蛋未破碎,仍剩余n个鸡蛋,则在第x+1至m层(共m-x层)继续尝试,即k[m-x][n];

        因为题目要求是最坏情况,所以应该取上述两种情况的较大者。又由于要最少实验次数,所以x应该取让前面的较大者尽量小些的值。

        得动态规划方程如下:

 k[m][n]=1+min{max{k[x-1][n-1],k[m-x][n]}}(x=1,2,3……,m)

        实验时

        1)对于m=0、m=1或n=1的情况取值依次为0、1、m(在创建**k时就赋值完成)。

        2)对于其他值,用三层for循环自底向上依次确定k[i][j]的值。伪代码如下:

F1(m,n)

    for i=2 to m

        for j=2 to n

            for x=1 to i

                k[i][j]=1+max{k[x-1][j-1],k[i-x][j]}

    return k[m][n]
2.1.2 时间复杂度分析

        由前面伪代码可知,最外层m-1次,中间层n-1次,最里层i(i=2,3,……,m)次,则时间复杂度为O(n*m^2)。

2.1.3 时间效率分析

        由于效率较低,这里降低数据规模,分别测试M=1000, 2000, …, 10000, N=20时以及M=10000,N=11, 12, …, 20时的算法运行时间(对每种情况都运行5次取平均值)。

        1)N=20时,以M=1000为基准

M

1000

2000

3000

4000

5000

6000

7000

8000

9000

10000

平均运行时间/ms

47

190

434

814

1310

1964

2750

3706.2

4722.4

5802

理论时间/ms

47

188

423

752

1175

1692

2303

3008

3807

4700

        得下图:N=20时的实际效率曲线和理论效率曲线图。

        两条曲线一开始较贴合,但随着M的增大,实际运行时间与理论运行时间的差(非负)呈现递增趋势。

        2)M等于10000时,以N=11为基准:

N

11

12

13

14

15

16

17

18

19

20

平均运行时间/ms

2890.5

3152.25

3443

3832

4092.5

4408

4704

5180

5478

5825

理论时间/ms

2890.5

3153.27

3416.05

3678.82

3941.59

4204.36

4467.17

4729.91

4992.68

5255.45

        得下图:M=10000时的实际效率曲线和理论效率曲线图。

        与上一个图一样,两条曲线一开始较贴合,但随着N的增大,实际运行时间与理论运行时间的差(非负)呈现递增趋势。

        可能原因是

        k[i][j]=1+max{k[x-1][j-1],k[i-x][j]}中的数据访问的耗时实际是随着规模的增大而增大的,但分析时间复杂度和理论时间时忽略这个。(实际效率与理论效率之间差某些常数因子)

2.2 方法二:动态规划加二分查找最优x
2.2.1 算法思想:

        对于

            for x=1 to m

                k[i][j]=1+max{k[x-1][j-1],k[i-x][j]}

        当x增大时,k[x-1][j-1]是x相关的非递减函数,而k[i-x][j]是x相关的非递增函数。所以可以在前面的基础上,用二分法求出最优的x,而不是从1到m逐个的尝试、比较。

        由于层数为整数,二分到最后有两种情况:

        1)二分到最后low!=high,如下图,则应该取点1和点3中次数较小的那个(最坏情况下的最少测试次数),即

 k[i][j]=min{k[i-low][j],k[high-1][j-1]}

        2)分到最后刚好low=high,如下图:此时x=low=high,k[x-1][j-1=,k[i-x][j]。

        伪代码如下:

F2(m,n)

    for i=2 to m

        for j=2 to n

            l=1;

            h=i;

            while l+1<h

                x=(l+h)/2

                if  k[x-1][j-1]<k[i-x][j]

                    l=x

                else if  k[x-1][j-1]>k[i-x][j]

                    h=x

                else  low=high=x

            k=1+min{k[i-l][j],k[h-1][j-1]}

    return k[m][n]
2.2.2 时间复杂度分析

        原来求最优x需m次循环,现在为log m,所以时间复杂度变为O(n*m*log m)

2.2.3 时间效率分析

        分别测试M=10000, 20000, …, 100000, N=20时以及M=50000, N=11, 12, …, 20时的算法运行时间(对每种情况都运行20次取平均值)。

        1)N=20时,以M=10000为基准

M

10000

20000

30000

40000

50000

60000

70000

80000

90000

100000

平均运行时间/ms

5

9.5

14.5

19.05

29.95

34.45

41.5

47.45

57.5

62.93

理论时间/ms

5

10.75

16.79

23.01

29.37

35.84

42.39

49.03

55.74

62.5

        得下图:N=20时的实际效率曲线和理论效率曲线图。

        两条曲线贴合度较高,说明算法效率基本符合关于m的mlog m级关系。

        2)M等于50000时,以N=11为基准

N

11

12

13

14

15

16

17

18

19

20

平均运行时间/ms

17

18.5

19.45

20

22.5

24

26.25

27.25

28.25

29

理论时间/ms

17

18.55

20.09

21.64

23.18

24.73

26.27

27.83

29.36

30.91

        得下图:M=50000时的实际效率曲线和理论效率曲线图。

        两条曲线较贴合,说明算法效率基本符合关于N的线性关系。

2.3 方法三:动态规划加逆向求解
2.3.1 算法思想

        不直接按照在m层、n个鸡蛋的情况下求解最少的最坏情况试验次数,而是逆向求解在n个鸡蛋、r次试验次数且最坏情况下最多能测多少层。找到层数大于m时的最小r。

        此时扔鸡蛋,碎了,就继续测楼下;没碎,就继续测楼上。

        总的可测楼层数 = 楼上的可测楼层数 + 楼下的可测楼层数 + 1(当前这层楼)。即

             k[n][r]=k[n][r-1]+k[n-1][r-1]+1

        此时的**k和前面的两种方法的不同,分配的空间不再是k[m+1][n+1],而是为k[n][max],max为一个较大的值(由于实验要求的最大规模M=100000、N=20的解为447,所以这里max取1000,实际未知该解时应取更大些)。

        伪代码如下:

F3(m,n)

    r=0

    while k[n][r]<m //r不超过m

        r++

        for i=1 to n

            k[i][r]=k[i][r-1]+k[i-1][r-1]+1

    return r
2.3.2 时间复杂度分析

        外层while循环(不大于)m次,内层for循环n次,所以时间复杂度为O(n*m)。

2.3.3 时间效率分析

        效率较高,m=2000000000,n=20时运行时间仍然小于1ms。

3、结果输出示例

​​​​​​​           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/739803.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

光伏发电项目是如何提高开发效率的?

随着全球对可再生能源需求的持续增长&#xff0c;光伏发电项目的高效开发成为关键。本文将深入探讨如何在实际操作中提高光伏发电项目的开发效率。 一、优化选址流程 1、数据收集与分析&#xff1a;利用卫星地图和遥感技术&#xff0c;收集目标区域的光照资源、地形地貌、阴影…

Win11 docker build拉取镜像失败(无法访问镜像仓库)

目录 遇到的问题&#xff1a; 修改docker配置 写了一个dockerfile(基于python的镜像)文件&#xff0c;在生成时&#xff0c;一直报错&#xff0c;换了好几个仓库&#xff0c;都是不行(包括阿里、南大、官网、网易、Azure中国镜像等都不行) 遇到的问题&#xff1a; 连接超时…

视频云存储平台LntonCVS国标视频平台功能和应用场景详细介绍

LntonCVS国标视频融合云平台基于先进的端-边-云一体化架构设计&#xff0c;以轻便的部署和灵活多样的功能为特点。该平台不仅支持多种通信协议如GB28181、RTSP、Onvif、海康SDK、Ehome、大华SDK、RTMP推流等&#xff0c;还能兼容各类设备&#xff0c;包括IPC、NVR和监控平台。在…

Inception_V2_V3_pytorch

Inception_V2_V3_pytorch 在上一节我们已经精度了Inception_V2_V3这篇论文&#xff0c;本篇我们将用pyorch复现论文中的网络结构&#xff01; 从论文中我们可以知道InceptionV3的主要改进为&#xff1a; 5 * 5卷积分解为2个3 * 3卷积核分解为不对称卷积滤波器组 我们可将GoogL…

【专利】一种光伏产品缺陷检测AI深度学习算法

申请号CN202410053849.9公开号&#xff08;公开&#xff09;CN118037635A申请日2024.01.12申请人&#xff08;公开&#xff09;超音速人工智能科技股份有限公司发明人&#xff08;公开&#xff09;张俊峰(总); 叶长春(总); 廖绍伟 摘要 本发明公开一种光伏产品缺陷检测AI深度…

区块链实验室(37) - 交叉编译百度xuperchain for arm64

纠结了很久&#xff0c;终于成功编译xuperchain for arm64。踩到1个坑&#xff0c;说明如下。 1、官方文档是这么说的&#xff1a;go语言版本推荐1.5-1.8 2、但是同一个页面&#xff0c;又是这么说的&#xff1a;不推荐使用1.11之前的版本。 3、问题来了&#xff1a;用什么版本…

ONLYOFFICE 编辑器8.1,一个功能全面的编辑器

目录 官网地址&#xff1a;ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE 一、PDF编辑 二、PPT播放 1. 多样化的幻灯片样式与布局 2. 强大的文本编辑与格式化功能 3. 丰富的图形与图表插入功能 4. 灵活的过渡效果与动画设置 5. 舒适的呈现与演讲辅助功能 6. 便捷的团…

Mac清理系统数据小技巧,告别卡顿烦恼 苹果电脑清理内存怎么清理

任何使用Mac的用户都会同意&#xff1a;没有什么比一台运行缓慢的电脑更能消磨人的耐心了。那些无休止的彩球旋转、程序响应迟缓、突然的系统冻结&#xff0c;这一切都让人想抓狂&#xff01;但别担心&#xff0c;这里有一些简单的Mac清理系统数据小技巧和CleanMyMac X的神助攻…

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化&#xff08;一&#xff09;通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解 码客 卢益贵 ygluu 关键词&#xff1a;游戏策划 可配置化 模块化配置 数据引擎 条件系统 红点系统 一、前言 在插件式模块化软件开发当中&#xff0c;既要模块高度独…

DDD(data display debugger)调试工具

文章目录 DDD安装界面说明 DDD data display debugger是命令行调试程序&#xff0c;可以理解为可视化的GDB。 安装 CentOS下使用以下命令进行安装&#xff1a; yum install ddd等待安装完成即可。 界面说明 顺便写一个测试程序&#xff0c;编译可执行文件 终端命令行输入…

[C++深入] --- malloc/free和new/delete

1 new运算符的拓展 1.1 自由存储区与堆的概念 在C++中,内存区分为5个区,分别是堆、栈、自由存储区、全局/静态存储区、常量存储区。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。 new操作符从自由存储区(free st…

十大排序算法之->基数排序

一、计数排序简介 基数排序&#xff08;Radix Sort&#xff09;是一种非比较型整数排序算法&#xff0c;其原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。具体做法是用0-9之间的所有整数作为键值&#xff0c;对数据集中的每一个数&#xff0c;按照从…

无线领夹麦克风哪个品牌音质最好,揭秘无线麦克风哪个牌子最好!

​在这个数字化、信息化的时代&#xff0c;短视频和直播已经成为了人们生活中不可或缺的一部分。而无线麦克风&#xff0c;则是这些活动中不可或缺的重要工具。它们能够轻松捕捉声音&#xff0c;让内容更加生动、真实。然而&#xff0c;市场上的无线麦克风种类繁多&#xff0c;…

深入解析与解决高并发下的线程池死锁问题

问题背景 在现代互联网应用中&#xff0c;高并发场景是常态&#xff0c;为了高效处理大量用户请求&#xff0c;后端服务通常会采用线程池来管理线程资源。然而&#xff0c;在一个复杂的微服务架构项目中&#xff0c;我们遇到了一个棘手的问题&#xff1a;在业务高峰期&#xf…

收银系统源码-千呼新零售2.0【线上营销】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看&a…

数据结构-顺序表的插入排序

顺序表的排序可以看作数组排序的拓展。基本逻辑和数组排序的逻辑大同小异。 由于顺序表中可以存放不同种的数据类型&#xff0c;进而和结构体排序又有相似之处。其中要注意的是&#xff08;->&#xff09;和&#xff08;.&#xff09;的区别。 -> 符号是针对指针进行的操…

《计算机英语》Unit 1 Computer Overview 计算机概述

期末试卷组成 1、选择20道 2、判断20道 3、词汇翻译&#xff08;单词词组&#xff0c;参照课后习题&#xff09; 4、翻译2道&#xff08;一道原题&#xff0c;参照作业&#xff09; SectionA About Computer 关于计算机 algorithm n. 算法 operate v.…

6.19长难句打卡

The Flatiron School, where people pay to learn programming, started as one of the many coding bootcamps that’s become popular for adults looking for a career change. 人们在Flatiron学校里花钱学习编程&#xff0c;且Flatiron学校也成为在寻求职业变化的成年人之中…

超越招聘技术人才目标的最佳技术招聘统计数据

研究发现&#xff0c;难以找到的人才比以往任何时候都更难找到&#xff1a;根据新人才委员会招聘调查报告&#xff1a;2024年难以找到的人才的战略和战略&#xff0c;60%的受访者表示&#xff0c;熟练人才的招聘时间比一年前长。调查进一步揭示了以下关于招聘技术的关键事实&am…

与亚马逊云科技深度合作,再获WAPP、ISV认证

上半年&#xff0c;VERYCLOUD睿鸿股份加入亚马逊云科技的WAPP&#xff08;Well-Architected Partner Programs&#xff09;和ISV加速计划&#xff08;ISV Accelerate Program&#xff09;&#xff0c;为客户带来更坚实优质的海外云服务。 Well-Architected 获得WAPP这项认证代表…