算法分析:蛮力法

一、实验目的

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.mzph.cn/bicheng/81128.shtml

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

相关文章

信息系统运行管理员:临阵磨枪版

信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料,力求完整覆盖考点细节) 第一部分:基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息: 含义:香农 - 减少随机不确定性的东西&#xff1b…

Linux的进程管理和用户管理

gcc与g的区别 比如有两个文件:main.c mainc.cpp(分别是用C语言和C语言写的)如果要用gcc编译: gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc表明使用C标准库; 区别一: gcc默认只链接C库&#x…

Python 常用模块(八):logging模块

目录 一、引言:日志模块在项目开发中的重要性二、从 Django 日志配置看 Logging 模块的核心组成三、logging模块核心组件详解3.1 记录器Logger3.2 级别Level3.3 根记录器使用3.4 处理器Handler3.5 格式化器Formatter3.6 日志流3.7 日志示例 四、日志模块总结 一、引…

Servlet原理

Servlet 体系结构的类层次关系 Servlet(接口):定义了 Servlet 的核心生命周期方法(如 init()、service()、destroy()),是所有 Servlet 的顶层规范,任何 Servlet 都需实现该接口。GenericServlet…

数据科学和机器学习的“看家兵器”——pandas模块 之五

目录 4.5 pandas 高级数据处理与分析 一、课程目标 二、对数据表格进行处理 (一)行列转置 (二)将数据表转换为树形结构 三、数据表的拼接 (一)merge () 函数的运用 (二)concat () 函数的运用 (三)append () 函数的运用 四、对数据表格的同级运算 五、计算数据表格中数…

组合问题(去重)

40. 组合总和 II - 力扣&#xff08;LeetCode&#xff09; class Solution { private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex,vector<bool>&used)…

论QT6多线程技术

前言 以前我多线程使用传统的继承qthread重写run()或者继承qrunable类把对象丢到线程池解决。经过昨天的面试让我了解到新的技术&#xff0c;我之前看到过只不过没有详细的去了解movetotread技术&#xff0c;这个技术是qt5推出的&#xff0c;qt6还在延续使用 代码结构 以下是…

VTEP是什么

VTEP&#xff08;VXLAN Tunnel Endpoint&#xff0c;VXLAN 隧道端点&#xff09;是 VXLAN&#xff08;Virtual Extensible LAN&#xff09;网络中的关键组件&#xff0c;用于处理 VXLAN 流量的封装和解封装。以下以可读的 Markdown 格式详细解释 VTEP 的定义、功能、实现方式以…

antdv3 Tabs.TabPane 右上角增加一个角标Badge

1、Tabs官方说明 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 2、Badge角标官方效果图 Ant Design Vue — An enterprise-class UI components based on Ant Design and Vue.js 3、Tabs.TabPane要实现的效果 4、代码 <Tabs v-m…

浅析 Spring 启动过程:从源码到核心方法

浅析 Spring 启动过程&#xff1a;从源码到核心方法 一、Spring 注解方式启动类 Demo二、Spring 启动过程源码解析​AnnotationConfigApplicationContext构造函数refresh()方法详解 三、refresh()的核心方法/步骤obtainFreshBeanFactory() - 获取Bean工厂prepareBeanFactory(be…

贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现

贝叶斯优化Transformer融合支持向量机多变量回归预测&#xff0c;附相关性气泡图、散点密度图&#xff0c;Matlab实现 目录 贝叶斯优化Transformer融合支持向量机多变量回归预测&#xff0c;附相关性气泡图、散点密度图&#xff0c;Matlab实现效果一览基本介绍程序设计参考资料…

智慧化系统安全分析报告

智慧化系统的安全背景与现状 一、政策法规背景 &#xff08;一&#xff09;全球主要国家/地区政策对比 地区政策名称核心内容实施时间特点中国《生成式人工智能服务管理暂行办法》明确服务提供者责任&#xff0c;强调数据合法、隐私保护&#xff0c;禁止生成违法内容2023年8…

【学习笔记】点云自动化聚类简要总结

聚类是将将具有相似特征划分为相同点集的操作。 基于空间邻近性的方法 核心思想&#xff1a;依据点的空间距离进行分组 欧式聚类&#xff08;DBSCAN&#xff0c;KD-tree) 原理&#xff1a;基于半径搜索和最小点数扩展簇。 优点&#xff1a;适应不规则形状&#xff0c;无需预…

全志F10c200开发笔记——移植uboot

相关资料&#xff1a; &#xff08;二&#xff09;uboot移植--从零开始自制linux掌上电脑&#xff08;F1C200S)&#xff1c;嵌入式项目&#xff1e;-CSDN博客 F1C200S挖坑日记&#xff08;3&#xff09;——Uboot编译篇_f1c200s uboot-CSDN博客 一、安装编译器 Linaro Rele…

常见WEB漏洞----暴力破解

什么是暴力破解 暴力破解 (Brue Force) 是一种攻击方法 (穷举法)&#xff0c;简称为“爆破”&#xff0c;黑客通过反复猜解和实验&#xff0c;旨在以暴力手段登入、访问目标主机获取服务&#xff0c;破坏系统安全&#xff0c;其属于 ATT&CK技术中的一种&#xff0c;常利用…

ARM A64 LDR指令

ARM A64 LDR指令 1 LDR (immediate)1.1 Post-index1.2 Pre-index1.3 Unsigned offset 2 LDR (literal)3 LDR (register)4 其他LDR指令变体4.1 LDRB (immediate)4.1.1 Post-index4.1.2 Pre-index4.1.3 Unsigned offset 4.2 LDRB (register)4.3 LDRH (immediate)4.3.1 Post-index…

2.安卓逆向2-adb指令

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

Obsidian Callouts标注框语法

Obsidian 从 0.14 版本开始原生支持 Callouts&#xff1a; 语法基于 Markdown 引用块&#xff08;>&#xff09;扩展&#xff1a; 语法格式如下&#xff1a; > [!类型] 可选标题 > 内容支持 **Markdown 格式**、[[内部链接]] 和嵌入文件。预览 可选类型一览&#xf…

nt!MiAllocateWsle函数分析之设置Wsle[WorkingSetIndex]

第一部分&#xff1a; 1: kd> p nt!MiAddValidPageToWorkingSet0xa9: 80a83c13 e8da9afcff call nt!MiAllocateWsle (80a4d6f2) 1: kd> t nt!MiAllocateWsle: 80a4d6f2 55 push ebp 1: kd> dv WsInfo 0x8953a1f8 PointerPte …

docker 命令操作大全

1 Docker Hello World 简单命令 docker run ubuntu:15.10 /bin/echo "Hello world" docker run&#xff1a;启动一个新容器。 ubuntu:15.10&#xff1a;使用的 Docker 镜像&#xff08;Ubuntu 15.10 版本&#xff09;。 Docker 首先从本地主机上查找镜像是否存在&a…