算法分析-三壶谜题

一.题目需求

有一个充满水的8品脱的水壶和两个空水壶(容积分别是5品脱和3品脱)。
通过将水壶完全倒满水和将水壶的水完全倒空这两种方式,在其中的一个水壶中得到4品脱的水。

二、算法思想

1.算法分析
1.1. 采用的算法思想是将某个时刻水壶中水的数量看作一个状态,用一个长度为3的数组表示。
1.2. 初始状态便为[8,0,0],再拓展他的下一结点的可能结构。
1.3. 若下一结点的结构已经被拓展过了便放弃,若没有拓展过则加入拓展列表(new_list)中。然后递归上述操作。
1.4. 直到拓展列表(new_list)为空或者找到目标为止。

2.思想图解
这里的第一个数就代表着是那个8品脱的瓶子,依次分别是8品脱,5品脱,3品脱。

就如图一样,使用广度优先遍历(类似于层次遍历)一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止。


三、代码展示
1.创建树节点结构
节点包括两个属性,一个属性是数组类型的,存储当前三个水壶的容量状态,另一个属性是记录它是由哪个结点扩展过来的,以便找到解决路径:

2.实现倒水动作
由于这里只有三个壶,互相倾倒的方案可以枚举出来,所有我就没使用二重嵌套循环,而是使用一层循环:

这个算法的时间复杂度是O(n^2)。

时间复杂度分析:
2.1. 外层循环有6次,每次循环中都会进行一次内层循环,内层循环最多有6次。所以总共会进行36次循环。
2.2. 在内层循环中,有一个判断语句,用于检查当前的n_list状态是否已经被考虑过。这个判断语句的时间复杂度是O(n),因为它需要遍历old_list列表。
2.3. 因此,总的时间复杂度是O(6 * 36 * n) = O(n^2)。


3.广度优先遍历
主要算法:使用广度优先遍历算法(层次遍历算法)一次一次递归扩展新的结点,知道找到4品脱的水或者无结点可扩展为止:

这个算法是广度优先遍历(BFS)的实现。它从一个根节点开始,然后访问所有相邻的节点,然后再访问这些节点的相邻节点,以此类推。

这个过程会一直持续到没有更多的节点可以访问为止。


时间复杂度分析:
1. 初始化两个列表 old_list 和 new_list,它们的大小取决于树的宽度。在最坏的情况下,树可能是一个线性结构,即每个节点只有一个子节点。在这种情况下,new_list 的大小将等于树的宽度,即 O(n),其中 n 是树的节点数。
2. while 循环会执行直到 new_list 为空。在每次迭代中,它会从 new_list 中弹出一个节点,并将其添加到 old_list 中。这个过程的时间复杂度是 O(1)。由于 while 循环会执行 n 次,所以总的时间复杂度是 O(n)。
3. 在每次迭代中,还会调用 pour 函数来处理当前节点的状态。pour 倒水函数的时间复杂度是 O(n^2),那么总的时间复杂度将是 O(n)*O(n^2)。
综上所述,这个算法的时间复杂度是 O(n^3)。

4.实现主函数

5.运行结果
从运行结果可以看出,遍历到第7步即可得到含有4品脱的水壶。
 

==========结束==========

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《向量数据库指南》——向量数据库Milvus Cloud搭建Excel公式编辑器助手

引言 在日常工作中,Excel是我们经常使用的办公工具,而熟练应用Excel公式对于提高工作效率非常重要。然而,有时候我们会遇到一些复杂的需求,需要用到较为专业的Excel公式,而这正是Excel公式编辑器助手的用武之地。本文将介绍如何利用向量数据库Milvus Cloud搭建GPT大模型和…

灾备建设中,跨主机集群恢复技术应用

在介绍跨主机集群恢复之前,要了解到虚拟化主机集群是什么? 虚拟化主机集群是一种把一组主机组合起来形成一个整体,向用户提供资源方式(计算存储、存储资源、网络资源)的技术。 虚拟化集群具有以下特性: …

听说90%的人都没搞定手撕协程池这道面试题!

特别的缘分 听说90%的人都没搞定手撕协程池这道面试题! 能看到这篇文章一定是特殊的缘分,请务必珍惜,请详细看看吧,哈哈。 不止上图,最近 Go就业训练营 中不少小伙伴说,面试中碰到了好几次手撕协程池的问题…

CountDownLatch和CyclicBarrier

JUC(Java.util.concurrent)是Java 5中引入的一个并发编程库,它包含了许多用于多线程处理的工具类和接口。JUC主要提供了以下特性: 线程池:线程池可以提高线程的使用效率,避免频繁地创建和销毁线程&#xff…

为什么要学习 Linux?

为什么要学习 Linux? 用 Linus 本人的话来说,用户不需要接触到操作系统。操作系统的功能是给应用程序提供API,因而,只有开发人员才需要学习操作系统。 最近很多小伙伴找我,说想要一些Linux的资料,然后我根…

栈的生长方向不总是向下

据我了解,栈的生长方向向下,内存地址由高到低 测试 windows下: 符合上述情况 测试Linux下: 由此可见,栈在不同操作系统环境下,生长方向不总是向下

wvp分享视频访问页面

先登录查看视频 输入用户名密码登录 国标设备--点击通道 点击播放 点击复制 打开分享链接查看视频 直接在浏览器中打开 可以直接预览 原有标签退出登录 刷新分享的视频链接依然可以查看视频 iframe内嵌网页查看视频 获取iframe代码 点击复制 打开vscode,新建一…

一键合并多个TXT文本,将保存在TXT的快递单号进行一键合并

如果你需要处理大量的TXT文本文件,那么你可能会遇到需要将这些文件合并为一个文件的情况。这不仅涉及到文件的组织和管理,还可能涉及到文件内容的连贯性和完整性。现在,我们有一个强大的工具,可以帮助你轻松实现一键文件整理&…

不存在类型变量 A, T 的实例,使 Collector<T, A, List<T>> 符合 Supplier<R>

报错信息 原因: 不存在类型变量 A, T 的实例&#xff0c;使 Collector<T, A, List<\T>> 符合 Supplier<\R> 来源 测试Stream流的map方法&#xff0c;做算法习惯基本类型定义数组。 map方法:Stream API的一部分。允许以一种声明式的方式处理数据&#xff0c…

京东数据分析平台(京东运营数据采集):2023年10月京东白酒品牌销售排行榜

鲸参谋监测的京东平台10月份白酒市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;10月份&#xff0c;京东平台上白酒的销量为340万&#xff0c;环比增长约16%&#xff0c;同比增长约37%&#xff1b;销售额为28亿&#xff0c;环比增长约20%&#xff0c;同比增长约122…

深入了解Performance API:优化网页性能的利器

在现代Web开发中&#xff0c;优化网页性能是至关重要的。用户对于加载速度和交互性能的要求越来越高&#xff0c;而Performance API作为一组用于测量和监控网页性能的JavaScript接口&#xff0c;为开发者提供了丰富的工具和信息。本文将深入探讨Performance API的各个方面&…

web自动化测试十大问题+解决方法汇总,一篇概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、启动浏览器报错…