【信息学奥赛】CSP-J/S初赛06 算法基础及时间/空间复杂度等问题

 本专栏👉CSP-J/S初赛内容主要讲解信息学奥赛的初赛内容,包含计算机基础、初赛常考的C++程序和算法以及数据结构,并收集了近年真题以作参考。

如果你想参加信息学奥赛,但之前没有太多C++基础,请点击👉专栏:C++语法入门,如果你C++语法基础已经炉火纯青,则可以进阶算法👉专栏:算法知识和数据结构👉专栏:数据结构啦

目录

1 算法的定义

2 算法的特征

3 算法复杂度

 空间复杂度

 时间复杂度

4 计算简单程序的时间复杂度

5 计算复杂程序的时间复杂度

6 时间复杂度的计算规则


1 算法的定义

算法是一组有序的、确定的、可执行的操作步骤,用于解决特定问题或完成特定任务。它可以被看做是一种计算机处理的过程,将一些输入数据转换为需要的输出结果。

算法通常包含了输入、输出、处理流程、控制结构等要素,通过精心设计可以高效地实现各种计算、搜索、排序、优化、数据挖掘等任务。

算法是计算机科学和信息技术领域中重要的基础知识之一,对于软件开发、数据分析、人工智能等方面都有着广泛的应用。

2 算法的特征

算法有以下几个特征:

1. 有限性(有穷性):算法必须是有限的,也就是说,它必须在有限的时间内完成。

2. 确定性(确切性):算法中每一步骤必须是明确的,无歧义的。同样的输入,必须得到同样的输出。

3. 可行性:算法中的每个步骤必须是可行的,也就是说,可以通过计算机或其他工具来实现。

4. 输入:算法应该明确其输入,也就是待处理的数据。

5. 输出:算法应该明确其输出,也就是处理完输入数据后的结果。

3 算法复杂度

同一个问题可以用不同的算法来解决,而一个算法质量的优劣将影响到程序的效率。算法分析的目的在于选择合适的算法和改进算法。对于算法的评价主要从时间复杂度和空间复杂度来考虑。

 空间复杂度

空间复杂度指的是一个算法在运行过程中所需的内存空间大小,通常用空间复杂度来衡量算法对计算机资源的利用程度。

算法在时间的高效性和空间的高效性之间通常是矛盾的,所以一般会取一个平衡点。通常会假设程序运行在足够大的内存空间中,来研究算法的时间复杂度。

 时间复杂度

时间复杂度指的是一个算法在运行过程中所需的计算时间大小,通常用时间复杂度来衡量算法对计算机资源的利用程度。时间复杂度表示的是算法执行时间与输入数据规模之间的关系。

时间复杂度通常用大O符号表示,表示算法所需最长时间与输入数据规模之间的关系。例如,一个时间复杂度为O(n)的算法表示在最坏情况下,随着输入数据规模的增加,算法所需的执行时间也会以线性的方式增长。

常见的时间复杂度从低到高依次为:O(1)、O(log n)、O(n)、O(n log n)、O(n²)、O(n³)。当然还有更高阶的时间复杂度,但它们往往不太常见。

在实际应用中,我们通常希望选择时间复杂度越小的算法来解决问题,这样可以提高程序的效率,节省计算机资源。

(常见的时间复杂度对比图)

4 计算简单程序的时间复杂度

计算一个简单程序的时间复杂度,需要分析程序中循环语句、条件判断语句、函数调用等代码块的执行次数。下面以一个简单的C++程序为例,来演示时间复杂度的计算过程:

以上程序中,用于计算时间复杂度的是for循环语句。根据循环语句的定义,可以得到程序的时间复杂度为O(n),其中n为输入的数值。

#include <iostream>
using namespace std;
int main()
{int n;cin >> n;int sum = 0;for (int i = 0; i < n; i++){sum += i;}cout << "sum = " << sum << endl;return 0;
}

具体分析过程如下:

1. 第1行的cin >> n;语句顺序执行一次,时间复杂度为O(1);

2. 第2行的int sum = 0;语句顺序执行一次,时间复杂度为O(1);

3. 第3~6行的for循环语句执行次数为n次,时间复杂度为O(n);

4. 第7行的cout << "sum = " << sum << endl;语句顺序执行一次,时间复杂度为O(1);

5. 第8行的return 0;语句顺序执行一次,时间复杂度为O(1)。

因此,以上程序的时间复杂度为O(n)

5 计算复杂程序的时间复杂度

计算稍微复杂的C++程序时间复杂度,首先需要了解各个代码块(如循环语句、条件判断语句、函数调用等)的执行次数,然后根据执行次数的总和来计算时间复杂度。下面以一个稍微复杂的C++程序为例,来演示时间复杂度的计算过程:

#include <iostream>
using namespace std;
int func(int n)
{int sum = 0;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){sum += i * j;}}return sum;
}int main()
{int n;cin >> n;cout << "sum = " << func(n) << endl;return 0;
}

以上程序包含了一个计算二重循环中每项乘积之和的函数`func`,以及在主函数中调用`func`计算并输出答案。其中,用于计算时间复杂度的是`func`函数中的二重循环语句。

具体分析过程如下:

1. 在`func`函数中,第2行的`int sum = 0;`语句顺序执行一次,时间复杂度为O(1);

2. 在`func`函数中,第3~6行的二重循环语句执行次数为n²次,时间复杂度为O(n²);

3. 在`func`函数中,第7行的`return sum;`语句顺序执行一次,时间复杂度为O(1);

4. 在主函数中,第2行的`cin >> n;`语句顺序执行一次,时间复杂度为O(1);

5. 在主函数中,第3行的`cout << "sum = " << func(n) << endl;`语句顺序执行一次,时间复杂度为O(n²);

6. 在主函数中,第4行的`return 0;`语句顺序执行一次,时间复杂度为O(1)。

因此,以上程序的时间复杂度为O(n²)

6 时间复杂度的计算规则

时间复杂度的计算规则有以下几点:

1. 对于最好、最坏和平均情况,时间复杂度分别使用最好、最坏和平均情况的执行时间来衡量。一般来说,我们关注的是最坏情况下的时间复杂度,因为这可以保证算法在任何情况下都不会超时。

2. 由于时间复杂度只关注算法的数量级而不关注常数项和低阶项,因此在计算时间复杂度时可以省略常数项和低阶项。例如,O(2n)可以简化为O(n),O(n²+n+1)可以简化为O(n²)。

3. 在计算带有循环语句的程序的时间复杂度时,可以根据循环体中代码的执行次数来计算总的执行次数。例如,在一个for循环中嵌套了一个for循环,内层循环执行了n次,外层循环执行了m次,那么这个程序的时间复杂度就是O(m*n)。

4. 在计算带有递归调用的程序的时间复杂度时,需要考虑递归调用的深度和每层递归调用的时间复杂度。例如,在斐波那契数列的递归实现中,递归深度为n,而每次递归调用都需要计算两个斐波那契数,因此时间复杂度为O(2ⁿ)。

5. 在计算带有多个不同代码段的程序的时间复杂度时,可以把每个代码段的时间复杂度相加来得到总的时间复杂度。例如,在一个函数中同时执行了一个循环和一个递归调用,那么程序的时间复杂度就是循环的时间复杂度加上递归调用的时间复杂度。

总之,计算时间复杂度需要对程序中各个代码段的执行时间进行分析,并把它们的时间复杂度相加或相乘,得到总的时间复杂度。

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

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

相关文章

AI与学术的交响:ChatGPT辅助下的实验设计新篇章

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术研究中&#xff0c;实验设计是确保研究质量和结果可信度的关键环节。这篇文章我们将为大家介绍如何利用ChatGPT辅助完成学术论文的实验设计&#xff0c;通过提供灵感、优化实验步…

VUE Pinia状态持久化

效果 实现方法 插件&#xff1a;pinia-plugin-persistedstate 链接地址 具体操作 安装 npm i pinia-plugin-persistedstate 添加到 pinia 实例上 import { createPinia } from pinia import piniaPluginPersistedstate from pinia-plugin-persistedstateconst pinia cre…

K8s 集群(kubeadm) CA 证书过期解决方案

Author&#xff1a;Arsen Date&#xff1a;2024/07/04 目录 一、现象描述二、解决方案三、集群验证 一、现象描述 之前有篇文章《K8s Token 过期解决方案&#xff08;Kubeadm&#xff09;》提到了默认生成的 Token 有效期只有 24 小时&#xff0c;过期后 Token 将不可用&#…

B端系统设计风格简洁与高效的完美融合

B端系统设计风格简洁与高效的完美融合

CIDEr(Consensus-based Image Description Evaluation)的计算

CIDEr&#xff08;Consensus-based Image Description Evaluation&#xff09; 论文原文 CIDEr: Consensus-based Image Description Evaluation CIDEr&#xff08;Consensus-based Image Description Evaluation&#xff09;是一种用于自动评估图像描述&#xff08;image ca…

基于java语言+ Vue+ElementUI+ MySQL8.0.36数字化产科管理平台源码,妇幼信息化整体解决方案

基于java语言 VueElementUI MySQL8.0.36数字化产科管理平台源码&#xff0c;妇幼信息化整体解决方案 数字化产科管理平台是为医院产科量身定制的信息管理系统。它管理了孕妇从怀孕开始到生产结束42天一系列医院保健服务信息。该系统由门诊系统、住院系统、数据统计模块三部分组…

web零碎知识

&nbsp 在html文件中 连续的空格会被认为是一个空格 所以我们需要使用&nbsp来代表空格 &#x3000 把这个当成tab键来使用 我们可以引入js文件&#xff0c;就可以减少html文件的长度。 首先创建一个js文件夹&#xff0c;然后在js文件夹中创建一个&#xff0c;后缀…

数据库表导出到excel:前置知识4 业务和效果

清单配置页面(就是配置那些用户可以下载那些表内容,清单下载实际就是指数据库表下载,清单就是对应的表) 比如:导出一个atom_base_info表数据(数据多) atom_base_info的数据结构 下面这个配置审核状态一类不问&#xff0c;直接到清单下载页面 发起自己想下载的清单(先异步把数…

FreeRTOS之队列上锁和解锁(详解)

这篇文章将记录我学习实时操作系统FreeRTOS的队列上锁和解锁的知识&#xff0c;在此分享给大家&#xff0c;希望我的分享能给你带来不一样的收获&#xff01; 目录 一、简介 二、队列上锁函数prvLockQueue&#xff08;&#xff09; 1、函数初探 2、应用示例 三、队列解锁函…

js之模糊搜索

多的不说 少的不唠 直接上代码

警翼警用记录仪视频格式化后恢复方法

警翼是国内较大的一家警用记录仪厂商&#xff0c;此品牌我们恢复过很多&#xff0c;此次遇到的是一个典型的误格式化的情况&#xff0c;我们来看看误格式化后如何恢复。 故障存储: 32G卡/fat32 故障现象: 客户提供的信息是在交接设备后没有及时备份而做出了初始化设备的操…

养老院管理系统-计算机毕业设计源码00010

养老院管理系统的设计与实现 摘要 本文介绍了一种基于Spring Boot框架的养老院管理系统的设计与实现。该系统旨在帮助养老院管理者更有效地管理机构内的各项事务&#xff0c;并提供更好的服务于老年人。系统的设计考虑了养老院管理的特殊需求&#xff0c;包括系统用户、老人信息…

高二的他已通过NOI保送北大了,让我们一起了解他的信息学奥赛学习经历吧!!!

相信关注本号的各位&#xff0c;对于信息学奥赛已经不陌生了&#xff0c;部分同学也已经开始踏入信息学的旅程&#xff0c;但前路茫茫&#xff0c;让我们一起看看已经取得成就的同学的经历吧。 今天要介绍的这位同学&#xff0c;是来自深圳中学的高二某班的欧阳达晟同学&#x…

简洁纯文字类的Typecho主题wenso

主题介绍 文章说说类博客网站源码&#xff0c;页面清新简洁。适合文章说说美文博客网站建站使用&#xff0c;响应式手机版本。 本来是dedecms的模板&#xff0c;也比较简单&#xff0c;适合用来搭建一个文学类的&#xff0c;纯文字的网站&#xff0c;简单的改成了typecho&…

JVM 堆内存结构 年轻代 老年代

堆内存 内存划分 对于大多数应用&#xff0c;Java 堆是 Java 虚拟机管理的内存中最大的一块&#xff0c;被所有线程共享。此内存区域的唯一目的就是存放对象实例&#xff0c;几乎所有的对象实例以及数据都在这里分配内存。 为了进行高效的垃圾回收&#xff0c;虚拟机把堆内存…

小白 | 华为云docker设置镜像加速器

一、操作场景 通过docker pull命令下载镜像中心的公有镜像时&#xff0c;往往会因为网络原因而需要很长时间&#xff0c;甚至可能因超时而下载失败。为此&#xff0c;容器镜像服务提供了镜像下载加速功能&#xff0c;帮助您获得更快的下载体验。 二、约束与限制 构建镜像的客…

6年铲屎官测评宠物空气净化器哪款好,热门养宠空气净化器排名

作为一名资深猫奴&#xff0c;发现很多铲屎官每到春秋换季就开始疯狂打喷嚏、突然开始全身过敏。其原因是猫毛一到换季就开始疯狂掉毛&#xff0c;相对于可见猫毛&#xff0c;漂浮在空气中的浮毛就是罪灰祸首。微小的浮毛在空气总容易被人体吸入体内&#xff0c;而浮毛上面附带…

【Python机器学习】模型评估与改进——在模型选择中使用评估指标

我们通常希望&#xff0c;在使用GridSearchCV或cross_val_score进行模型选择时能够使用AUC等指标。scikit-learn提供了一种非常简单的实现方法&#xff0c;那就是scoring参数&#xff0c;它可以同时用于GridSearchCV和cross_val_score。你只需要提供一个字符串&#xff0c;用于…

Appium自动化测试框架3

滑动与拖拽 swipe 滑动时间的长短会影响最后的结果的 是有一定误差的 from appium import webdriver import time # 启动一个字典 包装相应的启动参数 desired_caps dict() # 平台的名字&#xff0c;安卓还是IOS 大小写无所谓 desired_caps[platformName] Android # 平台的…