【数据结构】2算法及分析

0

章节

1.4到1.5小节。

掌握算法概念、特性、描述、算法性能时间复杂度和空间复杂度;

理解递归含义?

掌握实现递归的条件和时机;

应用简单递归问题的算法设计;

重点

算法概念与特征,算法表示;

难点

算法的分析与算法设计;

递归算法的理解与使用;

作业或思考题

作业2:算法设计与表达

内容达成以下标准(考核点):

        理解与陈述算法概念;

        理解并设计与表达算法:设计算法,使用工具表达,分析算法

算法设计与实现作业

摘要: 本文旨在为求1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和,设计算法,并分别使用自然语言、N-S图,伪代码来表示。分析算法的时间和空间效率, 和评价算法,然后使用java 完成算法的实现。

关键词:算法设计;评价;Java实现;

abstract

The purpose of this article is to design an algorithm to calculate the sum of the series 1 + (1+2) + (1+3) + (1+2+4) + (1+3+5) + ... + (1+2+...+2n) + (1+3+5+...+2n-1). The algorithm will be represented using natural language, an N-S diagram, and pseudo code. The time and space efficiency of the algorithm will be analyzed, and the algorithm will be evaluated. Finally, the algorithm will be implemented in Java.

Keywords: Algorithm Design; Evaluation; Java Implementation

1 实现方法一

1.1算法表示

1.1.1自然语言表示

1.创建一个变量sum并将其初始化为0,用于保存总和。

2.使用for循环从1迭代到n,迭代变量i表示当前迭代的数字。

3.在每次迭代开始时,创建两个临时变量s1和s2,分别用于保存奇数项和偶数项的和,并将它们初始化为0。

4.判断i是否大于1,如果是,则计算s1的值为(i-1) * (i-1) + i,表示从1到2n-1的所有奇数的和,如果不是,则s1保持为0。

5.计算s2的值为i * i,表示从1到2n的所有偶数的和。

6.将s1和s2分别累加到总和sum中。

7.循环结束后,返回总和sum作为最终结果。

1.1.2 N-S图表示

1.1.3伪代码表示

输入:n

输出:sum // 1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和

    function calculateSum(n):

    sum = 0

    for i from 1 to n:

        s1 = 0

        s2 = 0

        if i > 1:

            s1 = (i-1)^2 + i

        s2 = i^2

        sum += s1 + s2

    return sum

1.2算法分析

时间复杂度分析:外层循环迭代n次,所以时间复杂度为O(n)。内部计算s1和s2的操作是常数时间的,不会随输入规模变化,因此对时间复杂度没有影响。

空间复杂度分析:算法使用了常数个变量来保存中间结果,所以空间复杂度为O(1),即为常数级别。不会随输入规模变化。

1.3算法实现

public class Algorithm {public static int calculateSum(int n) {int sum = 0;for (int i = 1; i <= n; i++) {int s1 = 0;int s2 = 0;if (i > 1){s1 = (i-1) * (i-1)  + i;//单独的和, 偶数项}s2 = i * i;//单独的和, 奇数项sum += s1 + s2;}return sum;}public static void main(String[] args) {int n = 4;int result = calculateSum(n);System.out.println("当n=" + n + "时,sum=" + result);}
}

1.4算法总结

        该算法是一个简单直观的解决方案,它通过循环迭代计算每一项的和,并将其累加到总和中。由于只有一个循环,算法的时间复杂度是线性的,具有较好的效率。同时,算法的空间复杂度也是常数级别的,节省了内存的使用。总体而言,这个算法是一个有效且可行的解决方案。

2实现方法二

2.1算法表示

2.1.1自然语言表示

1.初始化两个数组s1和s2,长度为n。

2.对于从1到n的每个数i:

如果i大于1,计算s1[i-1]的值为 (i-1) * (i-1) + i。

计算s2[i-1]的值为 i * i。

3.定义变量sum并初始化为0。

4.对于数组s1和s2的每个索引i:

将s1[i]和s2[i]的值累加到sum上。

5.返回sum作为结果。

2.1.2N-S图表示

2.1.3伪代码表示

输入:n

输出:sum // 1+(1+2)+(1+3)+(1+2+4)+(1+3+5)+....+(1+2+...+2n)+(1+3+5+...+2n-1)的和

function calculateSum(n):

    s1 = new int[n]

    s2 = new int[n]

    for i = 1 to n:

        if i > 1:

            s1[i-1] = (i-1) * (i-1) + i

        s2[i-1] = i * i

    sum = 0

    for i = 0 to n-1:

        sum += s1[i]

        sum += s2[i]

    return sum

2.2算法分析

时间复杂度分析:该算法的时间复杂度为O(n),其中n是输入的参数。因为算法包含两个for循环,两个循环的迭代次数都是n。

空间复杂度分析:该算法的空间复杂度为O(n),其中n是输入的参数。因为算法使用了两个长度为n的数组s1和s2来存储中间结果。此外,还有几个整型变量用于计算和累加过程,它们的空间占用可以忽略不计。

2.3算法实现

public class Algorithm {public static int calculateSum(int n) {int[] s1 = new int[n];int[] s2 = new int[n];for (int i = 1; i <= n; i++) {if (i > 1){s1[i-1] = (i-1) * (i-1) + i; // 计算s1的值}s2[i-1] = i * i; // 计算s2的值}int sum = 0;for (int i = 0; i < n; i++) {sum += s1[i] + s2[i]; // 累加s1和s2的值}return sum;}public static void main(String[] args) {int n = 4;int result = calculateSum(n);System.out.println("当n=" + n + "时,sum=" + result);}
}

 2.4算法总结

算法优点: 这个算法有效地解决了问题,具有线性时间复杂度,适用于大多数输入规模。它的实现相对简单,易于理解。

算法缺点: 该算法使用了额外的空间来存储两个数组s1和s2,这可能会在输入规模很大的情况下导致内存消耗较大。如果对空间效率有更高的要求,可以考虑在计算过程中动态生成s1和s2的值而不存储它们。

总的来说,这个算法是一个有效的解决方案,适用于大多数情况,但在某些特定情况下,可能需要优化空间复杂度。

总结性分析:

第二个算法的优点在于将括号内部的和分别存放在两个数组中,方便计算和累加。但是它的缺点在于需要占用较多的空间,且计算s1的时候会产生一定的重复计算。

而第一个算法则没有使用数组,而是在每次循环的过程中直接计算出s1和s2并进行累加,避免了数组带来的空间占用和计算重复的问题。但是其缺点在于代码可读性不如第一个算法。

参考文献

[1] 王红梅, 党源源, 刘冰. 数据结构--从概念到Java实现[M]. 清华大学出版社, 2019.

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

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

相关文章

要在Unreal Engine 5(UE5)中实现角色打击怪物并让怪物做出受击反应,

UE5系列文章目录 文章目录 UE5系列文章目录前言一、实现思路二、最终效果 前言 ue5角色受击没有播放受击动画&#xff0c;主角达到怪物身上没有反应 一、实现思路 要在Unreal Engine 5&#xff08;UE5&#xff09;中实现角色打击怪物并让怪物做出受击反应&#xff0c;你需要…

Java糊涂包(Hutool)的安装教程并进行网络爬虫

Hutool的使用教程 1&#xff1a;在官网下载jar模块文件 Central Repository: cn/hutool/hutool-all/5.8.26https://repo1.maven.org/maven2/cn/hutool/hutool-all/5.8.26/ 下载后缀只用jar的文件 2&#xff1a;复制并到idea当中&#xff0c;右键这个模块点击增加到库 3&…

C++从零实现Json-Rpc框架

文章目录 一、项目介绍1. 基本原理2. 涉及到的技术栈3. 最终实现的效果 二、 第三方库的介绍与使用1. JsonCpp库Json的数据格式JsonCpp介绍封装Json工具类 2. muduo库muduo库是什么Muduo库常见接口介绍 3. C11异步操作std::future 三、框架设计1. 服务端模块划分NetworkProtoco…

用伪元素和jquery实现tab标签切换(下标线样式)

HTML代码 <div class"title"><div class"tab-item active">按场景</div><div class"tab-item">按名称</div><div class"tab-item">按手机号</div> </div> CSS代码 .active{positio…

Python写一个查星座的小程序,适合初学者练手——字典和if语句练习

一、界面预览 二、完整代码 # 导入必要的库 import tkinter as tk from tkinter import ttk # 导入ttk模块用于更现代的控件 from PIL import Image, ImageTk # 用于处理图片 import os # 用于文件路径操作class ZodiacApp:def __init__(self, root):self.root rootself.r…

【A2DP】蓝牙A2DP协议剖析:从架构到规范

目录 一、A2DP 协议架构 1.1 A2DP 协议栈结构组成 1.2 协议栈各部分的关系与作用 二、设备配置与角色定义&#xff08;Configurations and roles &#xff09; 2.1 角色定义 2.2 配置示例与角色体现 三、用户需求与场景 3.1 用户需求与场景 3.2 协议限制 3.3 协议要求…

C语言for循环语句的用法(非常详细)

在 C语言中&#xff0c;除了 while 和 do while&#xff0c;使用 for 语句也可以实现循环结构。 C语言for循环的基本用法 for 循环语句的一般形式如下&#xff1a; for(表达式1;表达式2;表达式3) {语句块; } 有以下几点说明&#xff1a; for 是循环结构中的关键字之一。表…

Flutter 学习之旅 之 flutter 不使用插件,实现简单带加载动画的 LoadingToast 功能

Flutter 学习之旅 之 flutter 不使用插件&#xff0c;实现简单带加载动画的 LoadingToast 功能 目录 Flutter 学习之旅 之 flutter 不使用插件&#xff0c;实现简单带加载动画的 LoadingToast 功能 一、简单介绍 二、LoadingToast 三、简单案例实现 四、关键代码 一、简单…

289. 生命游戏

根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态&#xff1a; 1 即为 活细胞 &am…

滑动窗口及边缘化直观理解

文章目录 问题例子example求解思路边缘化边缘化原理边缘化的实际步骤marg先验约束公式先验约束公式1先验约束公式2 marg的问题及FEJ实例分析&#xff1a;VINS-Mono中的滑动窗口策略 边缘化的代码实现&#xff08;伪代码&#xff09; 参考 本文简要介绍VIO常用的滑动窗口及边缘化…

类和对象(下)

一.再谈构造函数 构造函数有构造函数体赋值实现和初始化列表两种方式 1.构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值. 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是…

在资源有限中逆势突围:从抗战智谋到寒门高考的破局智慧

目录 引言 一、历史中的非对称作战&#xff1a;从李牧到八路军的智谋传承 李牧戍边&#xff1a;古代军事博弈中的资源重构 八路军的游击战&#xff1a;现代战争中的智慧延续 二、创业界的逆袭之道&#xff1a;小米与拼多多的资源重构 从MVP到杠杆解 社交裂变与资源错配 …

eLection: 1靶场渗透测试

eLection: 1 来自 <eLection: 1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.196 3&#xff0c;对靶机进行端口服…

RuleOS:区块链开发的“新引擎”,点燃Web3创新之火

RuleOS&#xff1a;区块链开发的“新引擎”&#xff0c;点燃Web3创新之火 在区块链技术的浪潮中&#xff0c;RuleOS宛如一台强劲的“新引擎”&#xff0c;为个人和企业开发去中心化应用&#xff08;DApp&#xff09;注入了前所未有的动力。它以独特的设计理念和强大的功能特性&…

【MySQL篇】MySQL基本查询详解

目录 前言&#xff1a; 1&#xff0c;Create 1.1&#xff0c;单行数据全列插入 1.2&#xff0c;单行数据指定列插入 1.3&#xff0c;多行数据全列插入 1.4&#xff0c;多行数据指定列插入 1.5&#xff0c;插入否则更新 1.6&#xff0c;替换 2&#xff0c;Retrieve …

第十七:go 反射

fmt.printf("%T"&#xff0c;obj) // 打印 reflect 的类型 fmt.Printf("%T", obj) // *reflect.rtype //打印的是一个指针类型 reflect包 在Go语言中反射的相关功能由内置的reflect包提供&#xff0c;任意接口值在反射中都可以理解为由reflect.Type和…

热门的壁纸创作风格呈现多元化发展趋势

下热门的壁纸创作风格呈现多元化发展趋势&#xff0c;以下是几种主流风格及其特点&#xff1a; 简约现代风格 流行元素&#xff1a;以简洁的线条、纯净的色彩块面和少量的抽象图形为主。摒弃过多繁杂的装饰&#xff0c;强调形式追随功能的设计理念。热度分析&#xff1a;在各大…

【SpringMVC】深入解析使用 Postman 在请求中传递对象类型、数组类型、参数类型的参数方法和后端参数重命名、及非必传参数设置的方法

SpringMVC—请求传参 1. 传递对象 如果参数比较多时&#xff0c;方法声明就需要有很多形参&#xff1b;并且后续每次新增一个参数&#xff0c;也需要修改方法声明. 我们不妨把这些参数封装为一个对象&#xff1b; Spring MVC 也可以自动实现对象参数的赋值&#xff0c;比如 Us…

AI智能眼镜的视觉革命:算法如何重塑人机交互新纪元

引言&#xff1a;视觉算法的核心地位与AI智能眼镜的崛起 AI智能眼镜作为下一代交互终端&#xff0c;其核心价值在于将视觉感知与人工智能深度融合&#xff0c;通过实时环境解析与动态反馈&#xff0c;重新定义人机交互的边界。据预测&#xff0c;2025年全球AI智能眼镜销量将突…

掌握 ArcGIS Pro:古地图制作技巧与方法

在探索历史的长河中&#xff0c;古地图以其独特的魅力承载着丰富的地理信息和历史文化价值。 随着技术的进步&#xff0c;现代地理信息系统&#xff08;GIS&#xff09;如ArcGIS Pro为我们提供了强大的工具&#xff0c;使制作古地图成为可能。 本文将详细介绍如何使用ArcGIS …