当前位置: 首页 > backend >正文

算法分析:蛮力法

一、实验目的

1 掌握蛮力法的设计思想(利用计算机去穷举所有的可能解,再从中依次找出可行解)
2 掌握蛮力法的具体实现和时间复杂度分析
3 理解蛮力法的常见特性
实验要求:先用伪代码描述利用蛮力法解决的算法解决方案,再用程序实现,计算时间复杂度,记录最终测试数据和测试结果

二、实验内容

(1)简短明确地写出实验的内容

  • (简单)实验内容1:计算一个整数数组中所有元素的差值。如a[0]-a[1]-…-a[n-1]。具体地,实验通过实现一个 substraction 方法来计算数组中元素的逐步相减,最后输出计算结果。

  • (中等)实验内容2:来计算两个整数的最大公约数(GCD),并将这两个整数化简为最简分数。程序包括输入验证,确保用户输入有效整数,并使用欧几里得算法提高计算效率。最后,输出化简后的结果。

三、问题分析

(1) 分析要解决的问题,给出你的思路,可以借助图表等辅助表达。

  • 实验内容一
    思路分析:
    输入:我们有一个整数数组 a,长度为 n,即 a = [a[0], a[1], a[2], …, a[n-1]]
    计算过程:
    从数组的第一个元素 a[0] 开始,逐个从数组中每个元素中减去后续的元素。
    可以通过一个简单的迭代来实现,从 a[0] 开始,接着依次减去 a[1], a[2], …, a[n-1]。
    输出:输出最终的计算结果。

  • 实验内容二
    1.最大公约数计算:如何高效地计算两个整数的最大公约数。
    利用循环和取余操作,可以高效地计算最大公约数。这种方法相较于简单遍历更高效。
    2.分数化简:如何利用最大公约数将两个整数化简为最简分数。
    通过将两个整数分别除以它们的最大公约数,得到最简形式的分数。
    3.用户输入处理:如何确保用户输入的是有效的整数,并处理可能的错误输入。
    使用 Scanner 读取用户输入,确保输入为整数。如果输入无效,提示用户重新输入。

(2)其它(你认为需要在此说明的)

边界条件: 程序需考虑特殊情况,例如输入为零或负数的情况。可以设置条件使得输入必须为正整数。

四、问题解决

(1)根据对问题的分析,写出解决办法。

  • 实验内容一
    我们可以通过一个循环来遍历数组,初始值为第一个元素,然后不断地从当前值中减去下一个元素。具体步骤如下:
    初始化 result 为数组的第一个元素 a[0]。
    从数组的第二个元素开始,依次减去每个元素,直到最后一个元素。
    输出最终的 result。

  • 实验内容二
    1.用户输入:提示用户输入两个整数,并对输入进行有效性检查。
    2.计算最大公约数(GCD):使用欧几里得算法来高效计算最大公约数。
    3.化简分数:用最大公约数化简输入的两个整数,输出最简分数形式。
    4.错误处理和提示:如果用户输入无效(如非整数、负数等),给予明确提示并要求重新输入。

(2)描述你在进行实现时,主要的函数或操作内部的主要算法;分析这个算法的时间复杂度,并说明你设计的巧妙之处,如有创新,将其清晰的表述。

实验内容一

1.主要函数:
在这里插入图片描述

2.时间复杂度:
遍历数组:我们需要遍历整个数组 a 一次,计算每个元素的差值。具体来说,遍历从数组的第一个元素到最后一个元素,执行减法操作。
每次操作的时间:每一次从 result 中减去一个元素,所需的时间是常数时间 O(1),因为减法操作是常数时间操作。
总时间复杂度:因为遍历数组需要执行 n-1 次减法,其中 n 是数组的长度,因此总的时间复杂度是 O(n),其中 n 为数组的长度。

3.运行结果
在这里插入图片描述

实验内容二

主要函数:
在这里插入图片描述

1.选择最小值:首先使用三元运算符确定 m 和 n 中的较小值,赋值给 min。
2.循环查找:从 min 开始向下逐一检查每一个整数 i,判断 i 是否同时为 m 和 n 的因子(即 m % i == 0 且 n % i == 0)。
3.返回结果:一旦找到这样的 i,就立即返回它作为最大公约数。如果循环结束仍未找到,则返回1(表示 m 和 n 互质)。
4.
在最坏情况下,当 m 和 n 是互质的(如 8 和 9),函数会遍历到 min 的值,即 O(min(m, n)) 次。
因此,时间复杂度为 O(min(m, n))。

(3)运行结果截图以及其它(你认为需要在此说明的)
在这里插入图片描述

五、实验结果总结

回答以下问题:

(1)通过实验叙述你对蛮力法的理解及其优缺点

蛮力法是一种直接且简单的解决问题的方法,通常通过枚举所有可能的选项来寻找解决方案。在计算最大公约数时,蛮力法会逐一检查直至找到最大的共同因子。
优点:
简单易懂:实现代码较为简单,适合初学者理解。
可靠性:在小范围内能够保证找到正确答案。
缺点:
效率低:对于大数或复杂问题,时间复杂度较高,导致运行时间长。
资源消耗:可能需要较多的存储和计算资源,尤其在数据量大时。

(2)请列出对你实验中算法的改进之处。

1.使用欧几里得算法:改用欧几里得算法计算 GCD,可以将时间复杂度降低到 O(log(min(m, n))),提高效率。
2.提前终止:在循环中,可以引入条件,例如如果 i 的平方大于 m 或 n,则可以提前结束查找。
3.缓存计算结果:对于频繁计算相同数对的情况,可以缓存已计算的 GCD 值,避免重复计算。

(3)列出你在本次实验中遇到的各种问题

1.输入验证:在实验过程中,遇到了如何处理无效输入(如负数或零)的问题。
2.逻辑错误:在初始实现中可能出现边界条件处理不当的情况,比如输入相同数字时未能正确返回该数字作为 GCD。

http://www.xdnf.cn/news/6340.html

相关文章:

  • Redis--基础知识点--27--redis缓存分类树
  • 计算机视觉----基于锚点的车道线检测、从Line-CNN到CLRNet到CLRKDNet 本文所提算法Line-CNN 后续会更新以下全部算法
  • OneNote内容太多插入标记卡死的解决办法
  • 在Rocky Linux 9.5上部署MongoDB 8.0.9:从安装到认证的完整指南
  • 【HTML】个人博客页面
  • 为什么浏览器设置代理ip后不能上网?原因与对应解决方案
  • maven报错 You have to use a classifier to attach supplemental artifacts
  • XBL6501/02/03在POE设备上的应用方案
  • JSX语法介绍
  • python制造一个报错
  • 音频/AI/BLE/WIFI/玩具/商业等方向的论坛网站总结
  • 【有理数加法结构体】2022-1-3
  • 深度理解用于多智能体强化学习的单调价值函数分解QMIX算法:基于python从零实现
  • 【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
  • 【清华实验室】招聘机器人博后5名
  • 金融量化智能体,如何开发一个有效的策略?
  • mysql 字段类型解释
  • VirtualiSurg使用SenseGlove触觉手套开发XR手术培训体验
  • go的interface接口底层实现
  • 基于FPGA的车速检测系统仿真设计与实现
  • 单片机开发软件
  • 《MySQL:MySQL视图特性》
  • python的宫崎骏动漫电影网站管理系统
  • 【学习心得】2025年Docker Desktop安装记录
  • 二、IGMP
  • 记录一下seata后端数据库由mariadb10切换到mysql8遇到的SQLException问题
  • groovy 如何遍历 postgresql 所有的用户表 ?
  • 【golang】DNS 资源记录(RR)接口
  • 深度学习、机器学习及强化学习的联系与区别
  • 「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(二)