实验05:算法设计策略的比较与选择

news2024/11/17 3:47:06

1.实验目的

比较同一问题,采用不同策略设计不同算法,分析和比较算法的性能。

2.实验内容

自学第10章的10.1.1至10.1.3, 总结分析编程实现简单算法、分治法和动态规划算法的理论复杂度,编程实现这些算法。

3.实验要求

并对一组数据测试实际运行时间,算法实际运行时间检测实际运行时间与理论分析是否一致。

□ \square 基础性实验 □ \square 综合性实验 ⊠ \boxtimes 设计性实验


实验报告正文

实验报告正文

一、问题分析(模型、算法设计和正确性证明等)

简单算法(暴力枚举)

枚举序列子段起点,延长该子段直到序列末尾,在所有子段的求和的结果中取最大值即为所求。

分治算法

从序列中间将序列分为两个子序列,则所求子段有以下三种情形:

  1. 和最大子段是左子序列的子段;
  2. 和最大子段是右子序列的子段;
  3. 和最大子段的左子段是左子序列的子段,右子段是右子序列的子段。

对于情形1和2,可由递归求得,对于情形3,从左右子序列的分割点开始分别往左右遍历,取最大值求和即为和最大子段。

动态规划

f [ i ] f[i] f[i]表示前 i i i个元素的最大子段和且一定取第 i i i个元素a[i],换而言之, f [ i ] f[i] f[i]是以a[i]结尾的子段能取到的最大值,对于 a [ i ] a[i] a[i]

f [ i − 1 ] ≤ 0 f[i-1]\leq 0 f[i1]0时,若把 a [ i ] a[i] a[i]加入到当前和最大子段中有 f [ i ] = a [ i ] + f [ i − 1 ] ≤ a [ i ] f[i]=a[i]+f[i-1]\leq a[i] f[i]=a[i]+f[i1]a[i],故此时应把 a [ i ] a[i] a[i]作为新的子段开端(此时子段中只有 a [ i ] a[i] a[i]),即令f[i]=a[i];

f [ i − 1 ] > 0 f[i-1]>0 f[i1]>0时,有 f [ i − 1 ] + a [ i ] > a [ i ] f[i-1]+a[i]>a[i] f[i1]+a[i]>a[i],故 f [ i ] = f [ i − 1 ] + a [ i ] f[i]=f[i-1]+a[i] f[i]=f[i1]+a[i].

最后只需遍历所有 f [ i ] f[i] f[i]取最大值即可。

二、算法设计复杂度分析(伪代码,不要粘贴源码)

时间复杂度: T ( n ) ∈ θ ( n 2 ) T(n)\in \theta(n^2) T(n)θ(n2)

空间复杂度: S ( n ) ∈ θ ( n ) S(n) \in \theta(n) S(n)θ(n)

时间复杂度: T ( n ) ∈ θ ( n log ⁡ ( n ) ) T(n)\in \theta(n\log(n)) T(n)θ(nlog(n))

空间复杂度: S ( n ) ∈ θ ( n ) S(n)\in \theta(n) S(n)θ(n)

时间复杂度: T ( n ) ∈ O ( n ) T(n)\in O(n) T(n)O(n)

空间复杂度: S ( n ) ∈ O ( n ) S(n)\in O(n) S(n)O(n)

三、实验结果记录和分析(测试向量上的测试结果、运行时间)

问题规模计算结果BF用时DC用时DP用时
50499750.0066ms0.0033ms0.0008ms
100915900.012ms0.0058ms0.0005ms
5001553890.269ms0.0277ms0.0016ms
10004141021.0693ms0.0566ms0.0033ms
500083821126.5556ms0.2922ms0.0127ms
10000500018107.681ms0.886ms0.0407ms
500009854442715.4ms3.6782ms0.1141ms
100000431229210654ms6.7081ms0.4336ms
5000004545027268872ms35.0238ms1.1395ms
1000000144074531.1011e+06ms74.0568ms2.302ms

简单算法用时曲线:

分治算法用时曲线:

动态规划算法用时曲线:

在这里插入图片描述

四、总结(可描述出现的问题和解决方法、经验和反思等)

三种算法在解决这个问题时都考虑到固定某一元素一定在和最大子段中,然后通过遍历、分治、动态规划的方法求解最大值。在BF算法中,固定了和最大子段的起点,分支算法固定了子段的中点,而DP算法固定了子段末尾。区别在于BF算法枚举 n n n次起点,每次需要 n − i n-i ni次求和,分治算法枚举 log ⁡ n \log{n} logn次固定点,每次遍历加和需要 n n n次,动态规划算法枚举 n n n次固定点,但是每次枚举时根据之前的结果就可立刻判断最大值。

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

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

相关文章

C语言复习之顺序表(十五)

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c阶段>——目标C、Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享…

docker容器内的应用利用k8s configmap做配置中心

ConfigMap 能带来什么好处? 传统的应用服务都有自己的配置文件,各自配置文件存储在服务所在节点。如果配置出现变更,就需要对应节点的配置文件。Kubernetes 利用了 Volume 功能,完整设计了一套配置中心,其核心对象就是…

基于Java+Spring+vue+element实现旅游信息管理平台系统

基于JavaSpringvueelement实现旅游信息管理平台系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…

基于模型预测(MPC)的四轮转向车辆轨迹规划(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 在轨迹跟踪应用领域,通常 MPC 建模可根据机器人的控制方式选择基于运动学运动状态方程建模或者基于动力学运动状态…

深入探讨车载CAN协议的工作原理和应用场景

CAN概述 CAN(Controller Area Network)总线协议是一种数据通信协议,最初是由Bosch公司开发,用于汽车领域中的内部通讯。 CAN总线协议是一种串行通信协议,支持多主机和多从机之间的通讯,可以在不同的控制单…

典型的高可用设计(一):MinIO

为了更好的了解高可用设计,将各类常用服务关于高可用的设计原理汇总到一起,通过横向对比的方式去发现这些典型设计的共同之处和差异点。 一、部署方式 MinIO 有单机单硬盘、单机多硬盘、多机多硬盘三种部署模式。单机单硬盘存在单点风险,数据…

ElasticSearch 部署及安装ik分词器

ansiable playbook链接: https://download.csdn.net/download/weixin_43798031/87719490 需要注意的点:公司es集群现以三个角色部署分别为 Gateway、Master、Data 简单的理解可以理解为在每台机器上部署了三个es,以端口和配置文件来区分这三…

itop-3568 开发板系统编程学习笔记(18)LED 应用编程

【北京迅为】嵌入式学习之Linux系统编程篇 https://www.bilibili.com/video/BV1zV411e7Cy/ 个人学习笔记 文章目录 应用层操作 LED 的两种方式sysfs 方式控制 LED控制方法原理简介 编写 LED 应用程序 应用层操作 LED 的两种方式 应用层操作底层硬件有两种方法,分别…

数据治理与数据中台架构

随着工业 4.0 时代的到来,传统行业的数字化转型是大势所趋;将数据提高到数据要素层面,让传统的技术在新的场景下发挥出新的作用,是近期研究和探讨的焦点话题。数语科技支持和服务传统行业多年,聚焦于传统数据建模和数据…

PostgreSQL中的复制延迟

PostgreSQL是一个流行的开源关系数据库管理系统,PostgreSQL中可能遇到的一个常见问题是复制延迟。 在这篇博客中,我们将讨论什么是复制延迟,它为什么会发生,以及如何在PostgreSQL中减轻它。 什么是复制延迟? 复制延迟…

Flink系列-9、Flink DataStream的输入数据集Data Source

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录 addSource方…

【A component required a bean of type ‘xxx‘ that could not be found.】

在学谷粒商城项目的时候出现了以下问题: *************************** APPLICATION FAILED TO START *************************** Description: A component required a bean of type org.redisson.Redisson that could not be found. Action: Consider defining a…

React-Router详解

React-Router详解 简介React-Router React-Router是一款用于构建单页面应用(SPA)中处理路由的JavaScript库。在现代的Web应用中,SPA已经成为了一种常见的应用架构模式,它允许在不刷新整个页面的情况下进行交互式的用户体验。而Re…

GPT能给审计带来什么

ChatGPT的出现,让人工智能再次站在了聚光灯下,引发持续性的热议和关注。GPT模型作为重要的支撑,国内外近段时间密集性地发布了众多的大语言模型,OpenAI推出GPT-4、谷歌推出LaMDA和PaLM等大模型、Meta推出开源大模型LLaMA&#xff…

2023-04-23 学习记录--C/C++-邂逅C/C++(中)

合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 上一篇:邂逅C/C(上) 一、if语句 ⭐️ (一)、格式 🍭 if…

6.1 欧拉方法与改进欧拉方法

6.1.1 欧拉方法 欧拉方法是一种数值解常微分方程(ODE)的方法,可以用于近似求解给定的初值问题。它是以欧拉命名的瑞士数学家莱昂哈德欧拉所发明的,因此得名。 欧拉方法的基本思路是将连续的常微分方程转化为离散的形式。具体而言…

全功能药效团图谱(Full-feature pharmacophore map)是什么?怎么绘制?

药效团和全功能药效团图谱是什么? 药效团是指与靶点相互作用并导致生物活性的化学基团或者分子结构片段。【药效团通常包括氢键受体/供体、疏水部位、离子化部位等关键成分】 "全功能药效团图谱" (Full-feature pharmacophore map&#xff0…

.net6 core web项目发布部署到Linux,以守护进程服务的形式部署启动,nginx实现转发

一、发布项目 1、以文件夹形式 2、目标运行时选对应的平台(Linux-x64) 3、文件夹选项:在发布前删除所有现有文件 二、部署项目(安装.net6环境:参考Linux安装 dotnet sdk 6.0) (1)…

toRef

toRef就是把什么东西变成ref 用这个页面来讲解 改成这样就用不了,失去了响应的功能 为什么会这样? 看这个页面,其实这个Proxy的实现就响应式的原理,但是let namep.name实际上就是let name张三,只是把这个值给了name&…

Android 日志框架使用

在实际开发中,经常会遇到需要打印日志并保存到文件中,便于后面取日志分析代码运行情况,当然如果只是打印日志不需要记录文件,使用android自带的log工具就完全够了, Log打印日志会记录到系统日志中,可以取出…