当前位置: 首页 > news >正文

蓝桥杯备赛笔记(二)

这里的笔记是关于蓝桥杯关键知识点的记录,有别于基础语法,很多内容只要求会用就行,无需深入掌握。

文章目录

  • 前言
  • 一、时间复杂度
    • 1.1 时间复杂度⭐
    • 1.2 空间复杂度
    • 1.3 分析技巧
  • 二、枚举
    • 2.1 枚举算法介绍
    • 2.2 解空间的类型
    • 2.3 循环枚举解空间
  • 三、模拟算法介绍
    • 3.1 模拟算法介绍
  • 四、递归
    • 4.1 递归的介绍
    • 4.2 递归如何实现
    • 4.3 递归和循环的比较
  • 总结


前言

持续更新,千里之行始于足下


一、时间复杂度

1.1 时间复杂度⭐

1、时间复杂度是衡量算法执行时间随输入规模增长的增长率
2、通过分析算法中基本操作的执行次数确定时间复杂度
3、常见的时间复杂度包括:常数时间O(1)、线性时间O(n)、对数时间O(log n)、平方时间O(n^2)等
4、在计算的时候我们关注的是复杂度的数量级,并不要求严格的表达式
一般我们关注的是最坏时间复杂度,用O(f(n))表示,大多数时候我们仅需估计即可。
一般来说,评测机1秒大约可以跑2e8次运算,我们要尽可能地让我们的程序运算规模的数量级控制在1e8以内

常数时间例子:10→100ms,10000→100ms,这里常数无论多少都是100ms。
线性时间例子:for循环嵌套for循环的情况下,时间复杂度为O(2n)但由于我们并不要求严格的表达式,所以这里的O(2n)=O(n)即可。

评测机1秒跑的2e8即 2 ∗ 1 0 8 2*10^8 2108,假如此时我们的n=1e4的情况下,O( n 2 n^2 n2)约等于1e8次。
但如果是n=1e5的情况下,O( n 2 n^2 n2)约等于1e10次就超过了运算规模的数量级控制了,此时我们应该用O(nlogn)的算法,约等于3e6。

1.2 空间复杂度

1、空间复杂度是衡量算法执行过程中所需的存储空间随输入规模增长的增长率(vector)。
2、通过分析算法中所使用的额外存储空间的大小来确定空间复杂度。(全局大数组)
3、常见的空间复杂度包括:常数空间O(1)、线性空间O(n)、对数空间O(log n)、平方空间O( n 2 n^2 n2)等。
一般我们关注的是最坏空间复杂度,用O(f(n))表示,大多数时候程序占用的空间一般可以根据开的数组大小精确算出,但也存在需要估算的情况。题目一般不会卡空间,一般是卡时间。
举个例子:假如题目限制128MB,1int = 32bit = 4Bytes。128MB = 32 * 2^20int = 3e7int。

1.3 分析技巧

1、理解基本操作:基本操作可以是算术运算(加法、乘法、位运算等)、比较操作、赋值操作等。
2、关注循环结构:循环是算法中常见的结构,它的执行次数对于时间复杂度的分析至关重要。
3、递归算法:递归算法的时间和空间复杂度分析相对复杂。需要确定递归的深度以及每个递归调用的时间和空间开销。(树的数据结构,n层的情况下就是 2 n − 1 2^n-1 2n1个)
4、最坏情况分析:对于时间复杂度的分析,通常考虑最坏情况下的执行时间。要考虑输入数据使得算法执行时间达到最大值的情况
5、善用结论:某些常见算法的时间和空间复杂度已经被广泛研究和证明。可以利用这些已知结果来分析算法的复杂度。

二、枚举

2.1 枚举算法介绍

枚举算法是一种基本的算法思想,它通过穷举所有可能的情况来解决问题。它的基本思想是将问题的解空间中的每个可能的解都枚举出来,并进行验证和比较,找到满足问题条件的最优解或所有解。
枚举算法适用于问题规模较小,解空间可穷举的情况。它的优点是简单直观,不需要复杂的数学推导,易于实现。但是,由于需要穷举所有可能的情况,对于问题规模较大的情况,枚举算法的时间复杂度可能会非常高,效率较低。

2.2 解空间的类型

解空间可以是一个范围内的所有数字(或二元组、字符串等数据),或者满足某个条件的所有数字。
当然也可以是解空间树,一般可分为子集树和排列树,针对解空间树,需要使用回溯进行枚举(在后面讲到搜索的时候会讲到)。
我们目前仅使用循环去暴力枚举解空间,具体的解空间类型需要根据题目来理解构造

2.3 循环枚举解空间

1、首先确定解空间的维度,即问题中需要枚举的变量个数
例如当题目要求的是满足条件的数字时,我们可以循环枚举某个范围内的数字
如果要求的是满足条件的二元组,我们可以用双重循环分别枚举第一个和第二个变量,从而构造出一个二元组

2、对于每个变量,确定其可能的取值范围。这些范围可以根据问题的性质和约束条件来确定。这一步往往是时间复杂度优化的关键

3、在循环体内,针对每个可能解进行处理。可以进行问题的验证、计算、输出等操作。

三、模拟算法介绍

3.1 模拟算法介绍

模拟算法通过模拟实际情况来解决问题,一般容易理解但实现起来比较复杂,有很多需要注意的细节,或者是一些所谓很“麻烦”的东西。
模拟题一般不涉及太难的算法,一般就是由较多的简单但是不好处理的部分组成的,考察选手的细心程度和整体的逻辑思维
一般为了使得模拟题写的逻辑清晰一些,经常会写比较多的小函数来帮助解题,例如int和string的相互转换、回文串的判断、日期的转换、各种特殊条件的判断等等。

四、递归

4.1 递归的介绍

概念:递归是指函数直接或间接调用自身的过程。
解释递归的两个关键要素:
基本情况(递归终止条件):递归函数中的一个条件,当满足该条件时,递归终止,避免无限递归。可以理解为直接解决极小规模问题的方法。
递归表达式(递归调用):递归函数中的语句,用于解决规模更小的子问题,再将子问题的答案合并成为当前问题的答案

4.2 递归如何实现

递归函数的基本结构如下:
实现过程:
1、将大问题分解为规模更小的子问题
2、使用递归调用解决每个子问题
3、通过递归终止条件来结束递归。

设计时需注意的细节:
1、确保递归一定能到递归出口,避免无限递归,这可能导致TEL(超时)、MLE(超内存)、或RE(运行错误)
2、考虑边界条件,有时候递归出口不止一个
3、避免不必要的重复计算,尽可能优化递归函数的性能(例如使用记忆化)。

4.3 递归和循环的比较

递归的特点:
1、直观、简洁、易于理解和实现。
2、适用于问题的规模可以通过递归调用不断减小的情况。
3、可以处理复杂的数据结构和算法,如树和图的遍历
4、存在栈溢出风险(栈空间一般只有8MB,所以递归层数不宜过深,一般不超过1e6层)。

循环的特点:
1、直接控制流程,效率较高
2、适用于问题的规模没有明显的缩减,或者需要特定的迭代次数
3、适合处理大部分的动态规划问题

在部分情况下,递归和循环可以相互转化。(dfs栈)


总结

相关文章:

  • 番外04:前端面试八股文-HTML
  • QML 快捷键与Shortcut的使用
  • 一个简单的Windows TCP服务器实现
  • windows系统 从 Hugging Face网站上使用 huggingface-cli 命令下载AI大模型到本地
  • 在npm上传属于自己的包
  • ARM64 Trust Firmware [一]
  • 【Copilot】Redis SCAN SSCAN
  • Linux探秘坊-------4.进度条小程序
  • DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?
  • ES6 Proxy 用法总结以及 Object.defineProperty用法区别
  • 【redis】数据类型之bitmaps
  • 【H5自适应】高端科技类pbootcms网站模板 – 三级栏目、下载与招聘功能支持
  • Python自动化办公之Excel拆分
  • 真正通俗易懂的Langchain入门学习(六)
  • HDFS核对迁移的历史数据是否正确
  • python爬虫--简单登录
  • SpringBoot_基础
  • 树莓派上 基于Opencv 实现人脸检测与人脸识别
  • 通过 VBA 在 Excel 中自动提取拼音首字母
  • 互联网大厂中面试的高频计算机网络问题及详解
  • 建筑工程公司名录/windows11优化大师
  • 秦皇岛市海港区建设局网站/全网营销推广软件
  • 南京公司做网站/百度学术论文官网入口
  • 太原自助模板建站/亚马逊关键词工具哪个最准
  • j2ee博客网站开发/seo关键词优化推荐
  • 手机如何做微电影网站/搜索引擎优化英文简称