【算法竞赛】算法复杂度

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

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

编程竞赛的题目在逻辑、数学、算法上有不同的难度:简单的题目,可以一眼看懂;复
杂的题目,往往需要很多步骤才能找到解决方案。它们对代码性能考核的要求是代码必须在限定的时间和空间内运行结束。这是因为问题的"有效"解决,不仅在于能否得到正确答案,更重要的是能在合理的时间和空间内给出答案。算法竟赛的题目,都会对代码的运行时间和空间做出要求。一般情况下,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.rhkb.cn/news/436568.html

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

相关文章

针对考研的C语言学习(定制化快速掌握重点5)

顺序表 特点&#xff1a; 写代码主要就是增删改查&#xff01;&#xff01;&#xff01; 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始&#xff0c;而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …

SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器

SpringMVC九大内置组件之HandlerMapping处理器映射器-AbstractHandlerMethodMapping类以及子类RequestMappingHandlerMapping如何将Controller修饰的注解类以及类下被注解RequestMapping修饰的方法存储到处理器映射器中。 从RequestMappingHandlerMapping寻找: AbstractHandle…

C语言VS实用调试技巧

文章目录 一、什么是bug?二、什么是调试&#xff1f;三、Debug和Release四、VS调试快捷键4.1环境准备4.2调试快捷键 五、监视和内存观察5.1监视5.2内存 六、调试举例七、编程常见错误归类7.1编译型错误7.2链接型错误7.3运行时错误 一、什么是bug? &#x1f34e;bug本意是 “…

前端——切换轮播图

学完前端js小知识后&#xff0c;动手操作的一个简单图片轮播图。 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"keywords" content"关键词信息"><meta name"des…

MATLAB绘图基础9:多变量图形绘制

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 9.多变量图形绘制 9.1 气泡图 气泡图用于展示三个或更多变量变量之间的关系&#xff0c;气泡图的组成要素&#xff1a; 横轴( X {\rm X} X轴)&#xff1a;表示数据集中的一个变量&#xff0c…

带徒实训项目实战讲义分享:ApiFirst文档对比功能页面开发2

前一篇&#xff1a;带徒实训项目实战讲义分享&#xff1a;ApiFirst文档对比功能页面开发 亲爱的学员朋友们好&#xff0c;本小节跟小卷一起来学习用thymeleaf模板技术来渲染数据模型到表格中&#xff0c;通过本小节的学习&#xff0c;你会真正将thymeleaf模板技术应用到实处&a…

Qt获取本机Mac地址、Ip地址

一、简述 今天给大家分享一个获取本机IP地址和Mac地址的方法&#xff0c;经过多次测试&#xff0c;台式机、笔记本等多个设备&#xff0c;暂时没有发现问题。 由于很多时候本地安装了虚拟机、蓝牙、无线网卡或者其他设备等&#xff0c;会有多个Mac地址&#xff0c;所以需要进…

汽车信息安全 -- 存到HSM中的密钥还需包裹吗?

目录 1.车规芯片的ROM_KEY 2.密钥加密与包裹 3.瑞萨RZ\T2M的密钥导入 4.小结 在车控类ECU中&#xff0c;我们通常把主控芯片MCU中的HSM以及HSM固件统一看做整个系统安全架构的信任根。 所以大家默认在HSM内部存储的数据等都是可信的&#xff0c;例如CycurHSM方案中使用HSM…

ControlGAN:Controllable Text-to-Image Generation

1 研究目的 当前的生成网络通常是不可控的&#xff0c;这意味着如果用户更改句子的某些单词&#xff0c;合成图像将与原始文本生成的合成图像显着不同&#xff1b;当给定的文本描述&#xff08;例如颜色&#xff09;发生变化时&#xff0c;鸟类的相应视觉属性被修改&#xff0c…

easyexcel常见问题分析

文章目录 一、读取数字多了很多小数位的精度问题 一、读取数字多了很多小数位的精度问题 浮点型转成BigDecimal的时候会出现精度问题&#xff0c;例如 这儿设置的实体类对象类型是String&#xff0c;默认用到的是StringNumberConverter转换器 2.1.4 版本 public class Strin…

【无人机设计与技术】四旋翼无人机的建模

摘要 本项目的目标是通过 Simulink 建模和仿真&#xff0c;研究四旋翼无人机的建模、姿态控制、定点位置控制及航点规划功能。无人机建模包含了动力单元模型、控制效率模型和刚体模型&#xff0c;并运用这些模型实现了姿态控制和位置控制。姿态控制为无人机的平稳飞行提供基础…

计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

往期热门项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…

在VMware虚拟机上部署polardb

免密登录到我们的虚拟机之后&#xff0c;要在虚拟机上部署polardb数据库&#xff0c;首先第一步要先克隆源码&#xff1a; 为了进SSH协议进行传输源码需要先进行下面的步骤&#xff1a; 将宿主机上的私钥文件复制到虚拟机上 scp "C:\Users\waitw\.ssh\id_rsa" ann…

ThinkPHP发送邮件教程:从配置到发送指南!

ThinkPHP发送邮件功能实现策略&#xff1f;Thinkphp如何发邮件&#xff1f; ThinkPHP作为一个流行的PHP框架&#xff0c;提供了强大的邮件发送功能&#xff0c;使得开发者可以轻松地在应用中集成邮件发送功能。AokSend将详细介绍如何在ThinkPHP中配置和发送邮件。 ThinkPHP发…

【Linux-基础IO】如何理解Linux下一切皆文件磁盘的介绍

目录 如何理解Linux系统上一切皆文件 1.物理角度认识磁盘 2.对磁盘的存储进行逻辑抽象 磁盘寻址 3.磁盘中的寄存器 如何理解Linux系统上一切皆文件 计算机中包含大量外设&#xff0c;操作系统想要管理好这些外设&#xff0c;就必须对这些外设进行先描述再组织&#xff0c…

【Linux 23】线程池

文章目录 &#x1f308; 一、线程池的概念&#x1f308; 二、线程池的应用场景&#x1f308; 三、线程池的实现 &#x1f308; 一、线程池的概念 线程池 (thread pool) 是一种利用池化技术的线程使用模式。 虽然创建线程的代价比创建进程的要小很多&#xff0c;但小并不意味着…

一篇文章快速学会docker容器技术

目录 一、Docker简介及部署方法 1.1Docker简介 1.1.1什么是docker 1.1.2 docker在企业中的应用场景 1.1.3 docker与虚拟化的对比 1.1.4 docker的优势 二 、部署docker 2.1 容器工作方法 2.2 部署第一个容器 2.2.1 配置软件仓库 2.2.2 安装docker-ce并启动服务 2.2.…

【AIGC】ChatGPT提示词解析:如何生成爆款标题、节日热点文案与完美文字排版

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;情绪化的吸睛爆款标题提示词使用方法 &#x1f4af;紧跟节日热点选题文案提示词使用方法 &#x1f4af;高效文字排版技巧提示词使用方法 &#x1f4af;小结 &#x1f4af…

数据结构-链表笔记

移除节点 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListN…

Oracle数据库体系结构基础

关于Oracle体系结构 基于Oracle11g体系结构 目标&#xff1a; 了解Oracle体系结构掌握逻辑存储结构掌握物理存储结构熟悉Oracle服务器结构熟悉常用的数据字典 Oracle数据库管理中的重要的三个概念 实例&#xff08;instance):实例是指一组Oracle后台进程以及在服务器中分配…