【算法竞赛】算法复杂度

news2024/12/25 9:39:01

计算的资源是有限的,竞赛题会限制代码所使用的计算资源。

计算资源有两种:计算时间和存储空间。与此对应的有时间复杂度和空间复杂度,时间复杂度衡量计算的次数,空间复杂度衡量需要的存储空间。

编程竞赛的题目在逻辑、数学、算法上有不同的难度:简单的题目,可以一眼看懂;复
杂的题目,往往需要很多步骤才能找到解决方案。它们对代码性能考核的要求是代码必须在限定的时间和空间内运行结束。这是因为问题的"有效"解决,不仅在于能否得到正确答案,更重要的是能在合理的时间和空间内给出答案。算法竟赛的题目,都会对代码的运行时间和空间做出要求。一般情况下,C++代码的运行时间是1秒,即代码必须在1秒内计算结束并输出结果;空间一般不超过100MB。如果是Java和Python代码,运行时间应该是C++代码的3~5倍。

需要说明的是,时间复杂度不完全等于运行时间
由于代码的运行时间依赖于计算机的性能,同样的代码在不同的机器上运行,需要的时间不同。所以,直接把运行时间作为判断标准并不准确。用代码执行的"次数"衡量更加合理,如一个for循环了几次,把它的时间复杂度记为O(n)。

对于同一个问题,常常存在不同的解决方案,有高效的,也有低效的。算法编程竞赛主
要的考核点就是在限定的时间和空间内解决问题。虽然在大部分情况下,只有高效的算法才能满足判题系统的要求,但并不是只有高效的算法才是合理的,低效的算法有时也是有用的。

对于程序设计竟赛,由于竟赛时间极为紧张,解题速度极为关键,只有尽快完成更多的题目,才能获得胜利。在满足限定条件的前提下,用最短的时间完成编码任务才是最重要的。而低效算法的编码时间往往大大低于高效算法。

例如:题目限定时间是1秒,现在有两个方案:1、高效算法0.01秒运行结束,代码有50行,编程40分钟;2、低效算法1秒运行结束,代码只有20行,编程10分钟。此时显然应该选择低效算法。

算法概念

一般认为:“程序=算法+数据结构”。算法是解决问题的逻辑、方法、步骤,数据结构是数据在计算机中的存储和访问的方式。算法和数据结构是紧密结合的,而且有些数据结
构有特定的处理方法,此时很难把数据结构和算法区分开来:

算法(Algorithm)是对特定问题求解步骤的一种描述,是指令的有限序列。算法有以下
5个特征。

  1. 输入:一个算法有零个或多个输入。算法可以没有输入,如一个定时闹钟程序,它不需要输入,但是能够每隔一段时间就输出一个报警。
  2. 输出:一个算法有一个或多个输出。程序可以没有输入,但是一定要有输出。
  3. 有穷性:一个算法必须在执行有穷步之后结束,且每每步都在有穷时间内完成。
  4. 确定性:算法中的每条指令必须有确切的含义,对于相同的输入只能得到相同的输出。
  5. 可行性:算法描述的操作可以通过已经实现的基本操作执行有限次来实现。

以冒泡排序算法为例,它满足上述5个特征,具体如下。

  1. 输入:由n个数构成的序列{a1,a2,a3,…a_}。
  2. 输出:对输入的排序结果{ai,a2,ag,…an),ai<a2<as<…<ah。
  3. 有穷性:算法在执行O(n2)次后结束,这也是对算法性能的评估,即算法复杂度。
  4. 确定性:算法的每个步骤都是确定的。
  5. 可行性:算法的步骤能编程实现。

复杂度与大 o o o符号

衡量算法性能的主要对象是时间复杂度,一般不讨论空间复杂度。因为一个算法的空间复杂度是容易分析的,而时间复杂度往往关系到算法的根本逻辑,不容易分析,更能说明一个程序的优劣。

衡量算法运行时间最常见的一种方法是大0记号,它表示一个算法或函数的渐近上界。对于一个函数g(n),用O(g(n))表示一个函数集合,读作"g(n)的大O"。

O( g(n) )= { f(n):存在正常数c和no ,使对所有的n=no,有0<=f(n)<=cg(n) }

用大O做算法分析,得到的复杂度只是一个上界估计。例如在一个有几个数的无序数列中,查找某个数.可能第1个数就是x,也可能最后一个个数才是x,平均查找次数为n/2次,但是把查找的时间复杂度记为O(n),而不是O(n/2)。

再如,冒泡排序算法的计算次数约为n2/2次,但是时间复杂度仍记为O(n2),而不是O(n2/2)。在大0分析中,规模n前面的常数系数被省略了。不过在做算法题时,由于打分时还是按照实际的运行时间衡量代码的性能,所以规模"前面的常数也需要考虑。

一个代码或算法的时间复杂度有以下情况。

  1. O O O(1)
    计算时间是一个常数,与问题的规模n无关。例如,用公式计算时,一次计算的复杂度就是 O O O(1);哈希算法用哈希函数在常数时间内计算出存储位置;在矩阵A[M][N]中查找行j列的元素,只需要对A[i]做一次访问就够了;贪心法的时间复杂度也常常是 O O O(1)。
  2. O O O(log2n)
    计算时间是对数,通常是以2为底的对数,每步计算后,问题的现模缩小一半。二分法、倍增法、分治法的复杂度为O(log2n)。例如二分法,在一个长度为n的有序数列中查找某个数,用折半查找的方法,只需要log2n次就能找到。再如分治法,每次分治能把规模减小一半,所以一共只有O(log2n)个步骤。
    O(log2n)和O(1)没有太大差别,它们的计算量都极小。
  3. 0 0 0(n)
    计算时间随规模"线性增长。在很多情况下,这是算法可可能达到的最优复杂度,因为对输入的几个数,程序一般需要处理所有数,即计算几次,。例如,查找一个无序数列中的某个数,可能需要检查所有的数。再如图问题,一个图中有V个点和E条边,大多数图图问题都需要搜索到所有的点和边,复杂度至少为O(V+E)。
  4. O O O(nlog2n)
    O O O(nlog2n)常常是算法能达到的最优复杂度,n为问题规模,log2n为操作步骤数。例如分治法,一共有 O O O(log2n)个步骤,每个步骤对n个数操作一次,所以总复杂度为 O O O(nlog2n)。用分治法思想实现的快速排序算法和归并排序算法复杂度就是 O O O(nlog2n)。
  5. O O O(n2)
    一个二重循环的算法的复杂度为O(n2),如冒泡排序是典型的二重循环。类似的复杂度有O(n3)、O(nt)等,如矩阵乘法、Floyd算法,都是3个for循环。
  6. O O O(2n)
    一般对应集合问题,如一个集合中有几个数,要求输出它的所有子集,共有2"个子集。
  7. O O O(n!)
    在排列问题中,如果要求输出几个数的全排列,共有n!个,复杂度为O(n!)

把上述复杂度分为两类:

  1. 多项式复杂度,包括0(1)、O(n)、O(nlog2n)、O(nk)等,其中k为一个常数;
  2. 2指数复杂度,包括O(2")、O(n!)等。

如果一个算法是多项式复杂度,称它为"高效"算法;如果是指当数复杂度,则称它为一个"低效"算法。

可以这样通俗地解释"高效"和"低效"算法的区区别:
多项式复杂度的算法,随着规模n的增加,可以通过堆叠硬件来实现,"砸钱"是行得通的;
而指数复杂度的算法,增加硬件也无济于事,其计算量的增长速度远远超过了硬件的增长。换个角度说,高效算法可以弥补低档硬件的不足。

竞赛题的限制时间一般是1秒,对应普通计算机计算速度是每每秒千万次级,现在有些判题系统是每秒上亿次,不过为了保险,一般还是按千万次估算复杂度。通过上述时间复杂度可以换算出能解决问题的数据规模。例如,一个算法的复杂度为O(n!),当n=11时,11!=39916800,这个算法只能解决n<11的问题。

表2.1详细总结了不同算法复杂度与7的关系,需要牢记。
在这里插入图片描述

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

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

相关文章

1.8 物理层下的传输媒体

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 1 导引型传输媒体1.1 双绞线1.2 同轴电缆1.3 光缆 2 非导引型传输媒体2.1 无线电微波通信2.2 多径效应2.3 卫星通信2.4 无线局域网 在数据通信系统中&#xff0c;传输媒体是发…

排水系统C++

题目&#xff1a; 样例解释&#xff1a; 1 号结点是接收口&#xff0c;4,5 号结点没有排出管道&#xff0c;因此是最终排水口。 1 吨污水流入 1 号结点后&#xff0c;均等地流向 2,3,5 号结点&#xff0c;三个结点各流入 1/3 吨污水。 2 号结点流入的 1/3​ 吨污水将均等地流向…

【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型

文章目录 服务&#xff08;Service&#xff09;和服务实例&#xff08;Instance&#xff09;定义服务服务元数据定义实例实例元数据持久化属性 集群定义集群 生命周期服务的生命周期实例的生命周期集群的生命周期元数据的生命周期 服务&#xff08;Service&#xff09;和服务实…

vue3中el-input在form表单按下回车刷新页面

摘要&#xff1a; 在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面&#xff01; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 再写一个input 表单 &#xff0c;并设置style“display:none” <ElInput style"display…

畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)

畅阅读系统小程序 目录 基于java的畅阅读系统小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师…

用C语言实现通讯录(顺序表实现)

SeqList.h 顺序表的头文件 #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #include "Contact.h" typedef PerInfo SLDatatype;//PerInfo为结构体类型//动态顺序表 typedef struct SeqList {SLDatatype…

量产小妙招---向量间的Project和Product

1 背景 在日常工作中&#xff0c;不管是在感知或者规控&#xff0c;或者其它的模块中&#xff0c;经常需要处理两个向量之间的关系&#xff0c;这就引入了本篇博客和读者朋友们讨论的一个话题&#xff1a;Project和Product。 2 Project和Product 向量间的Project和Product在定义…

STM32单片机编程调试常见问题(二) Keil5软件调试中常见的配置问题

文章目录 一.概要二.‌Keil5‌调试时无法打断点并且部分代码语句执行被优化三.Keil5烧录STM32程序代码后无法自动复位四.Keil5调试时Watch界面中的变量不会实时更新五.Keil5编译后无法进行 go to跳转到变量或函数六.Keil5编辑时注释输入中文显示乱码问号七.Keil5退出调试时出现…

C. Bitwise Balancing

原题 C. Bitwise Balancing 解析 题意如图 我们要求 a , 其实 a 只要满足条件即可, 我们可以发现每一位都不会影响到其它位, 因此对每一位检查, 发现对b c a, d 有固定结果 b c a d 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 bcd 无法为 011 和 1…

【Python】2. 变量和数据类型

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

python和r语言的区别是什么

在从事数据分析行业中&#xff0c;我们都会从R与Python当中进行选择&#xff0c;但是&#xff0c;从这两个异常强大、灵活好用的数据分析语中选择&#xff0c;却是非常难以选择的。 为了让大家能选择出更适合自己的语言&#xff0c;我们将两种语言进行简单的对比。 Stack Ove…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十八章 Linux编写第一个自己的命令

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

Web APIs——Dom获取属性操作

1.变量声明 1.1以后声明变量我们优先使用哪个&#xff1f; const 有了变量先给const&#xff0c;如果发现它后面是要被修改的&#xff0c;再改为let 1.2 为什么const声明的对象可以修改里面的属性&#xff1f; 因为对象是引用类型&#xff0c;里面存储的是地址&#x…

从设计到做出一张光刻掩模版要多久?

知识星球里的学员问&#xff1a;光刻掩模版是如何做出来的&#xff0c;麻烦详细讲解下。 如上图&#xff0c;设计分为四步&#xff1a; 1. 讨论工艺步骤&#xff08;约1小时&#xff09;&#xff1a;工艺人员和设计人员会首先讨论掩膜板的设计要求&#xff0c;明确最终所需的图…

【含文档】基于Springboot+Vue的古风生活体验交流网站(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

红外画面空中目标检测系统源码分享

红外画面空中目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comp…

麒麟操作系统部分目录介绍

图形系统目录 文字系统目录 &#xff08;1&#xff09;/bin&#xff1a;存放普通用户可以使用的命令文件。 &#xff08;2&#xff09;/boot&#xff1a;包含内核和其它系统程序启动时使用的文件。 &#xff08;3&#xff09;/dev&#xff1a;设备文件所在目录。在操作系统中…

【Linux】解锁磁盘文件奥秘,高效数据管理的实战技巧

磁盘文件 1. 引言2. 磁盘的机械构成3. 磁盘的物理存储3.1. CHS定位寻址法 4. 磁盘的逻辑存储4.1. LBA地址4.2. inode4.3. 分区、分组4.4. Boot Block4.5. 块组 — Block group4.5.1. inode Table4.5.2. Data Blocks4.5.3. inode Bitmap4.5.4. Block Bitmap4.5.5. GDT4.5.6. Sup…

c++primer第十三章 类继承

本章内容&#xff1a;单个类就可以提供用于管理对话框的全部资源。通常&#xff0c;类库是以源代码的方式提供的&#xff0c;这意味着可以对其进行修改&#xff0c;以满足需求。但是&#xff0c;C-提供了比修改代码更好的方法来扩展和修改类。这种方法叫作类继承(class inheria…

【Android 源码分析】Activity生命周期之onDestroy

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…