算法——A/算法通识

news2024/11/20 14:29:43

目录

一、复杂度分析

A/时间复杂度

B/空间复杂度

C/分析技巧

二、枚举分析

A/枚举算法介绍

B/解空间的类型

C/循环枚举解空间

三、模拟算法

四、递归

A/递归介绍

递归的两个关键要素:

B/递归如何实现

C/递归和循环的比较


一、复杂度分析

A/时间复杂度

1、时间复杂度是衡量算法执行时间随输入规模增长的增率;

2、通过分析算法中基本操作的执行次数来确定时间复杂度;

3、常见的时间复杂度包括:常数时间 O(1)、线性时间 O(n)、对数时间 O(log n)、平方时间O(n^2)等。

4、在计算的时候我们关注的是复杂度的数量级,并不要求严格的表达式。

        一般我们关注的是最坏时间复杂度,用O(f(n))表示,大多数时候我们仅需估算即可。评测机1秒大约可以跑2e8(2*10的8次方)次运算,我们要尽可能地让我们的程序运算规模的数量级控制在1e8以内。

B/空间复杂度

1、空间复杂度是衡量算法执行过程中所需的存储空间随输入规模增长的增长率。

2、通过分析算法中所使用的额外存储空间的大小来确定空间复杂度。

3、常见的空间复杂度包括:常数空间 O(1)、线性空间O (n)、对数空间 O(log n)、平方空间 (n^2)等。
        一般我们关注的是最坏空间复杂度,用O(f(n))表示,大多数时候程序占用的空间一般可以根据开出的数组大小精确算出,但也存在需要估算的情况。题目一般不会卡空间,一般是卡时间。

C/分析技巧

1、理解基本操作:基本操作可以是算术运算(加法、乘法、位运算等)、比较操作、赋值操作等。

2、关注循环结构:循环是算法中常见的结构,它的执行次数对子时间复杂度的分析至关重要。

3、递归算法:递归算法的时间和空间复杂度分析相对复杂。需要确定递归的深度以及每个递
归调用的时间和空间开销。

4、最坏情况分析:对于时间复杂度的分析通常考虑最坏情况下的执行时间。要考虑输入数据使得算法执行时间达到最大值的情况。

5、善用结论:某些常见算法的时间和空间复杂度已经被广泛研究和证明。可以利用这些已知结果来分析算法的复杂度。

二、枚举分析

A/枚举算法介绍

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

B/解空间的类型

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

C/循环枚举解空间

1、首先确定解空间的维度,即问题中需要枚举的变量个数。

        例如当题目要求的是满足条件的数字时,我们可以循环枚举某个范围内的数字。如果要求的是满足条件的二元组,我们可以用双重循环分别枚举第一个和第二个变量,从而构造出一个二元组。

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

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

三、模拟算法

        模拟算法通过模拟实际情况来解决问题,一般容易理解但是实现起来比较复杂,有很多需要注意的细节,或者是一些所谓很“ 麻烦 ”的东西。

        模拟题一般不涉及太难的算法,一般就是由较多简单且不好处理的部分组成的,考察选手的细心程度和整体的逻辑思维。

        一般为了使得模拟题写的逻辑清晰一些,经常会写比较多的小函数来帮助解题,例如 int 和 string 的相互转换、回文串的判断、日期的转换、各种特殊条件的判断等等。

四、递归

A/递归介绍

        概念:递归是指函数直接或间接调用自身的过程。

递归的两个关键要素:

        a.基本情况(递归终止条件):递归函数中的一个条件,当满足该条件时,递归终止避免无限递归。可以理解为直接解决极小规模问题的发法

        b.递归表达式(递归调用):递归函数中的语句,用于解决规模更小的子问题,再将子问题的答案合并成为当前问题的答案。

B/递归如何实现

        过程:1.将大问题分解为规模更小的子问题;2.使用递归调用解决每个子问题;3.通过递归终止条件来结束递归。

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

C/递归和循环的比较

递归的特点:

        1.直观、简洁,易于理解和实现;

        2.适用于问题的规模可以通过递归调用不断减小的情况;

        3.可以处理复杂的数据结构和算法,如树和图的遍历;

        4.存在栈溢出风险(栈空间一般只有8MB,所以递归层数不宜过深一般不超过1e6层)。

循环的特点:

        1.直接控制流程,效率较高;

        2.适用于问题的规模没有明显的缩减,或者需要特定的迭代次数;

        3.适合处理大部分的动态规划问题;在部分情况下,递归和循环可以相互转化。

前缀和

前缀和原理和特点

prefix表示前缀和,前缀和由一个用户输入的数组生成。对于一个数组a[ ](下标从1开始),我们定义一个前缀和数组prefix[ ]满足:prefix[i] = \sum_{j=1}^{i}a[j],prefix有一个重要的特性,可以用于快速生成prefix:prefix[i] = \sum_{j=1}^{i=1}a[j]+a[i]=prefix[i-1]+a[i]

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

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

相关文章

Unknown custom element:<xxx>-did you register the component correctly解决方案

如图所示控制台发现了爆红(大哭): 报错解释: 当我们看到报错时,我们需要看到一些关键词,比如显眼的“component”和“name”这两个单词, 因此我们就从此处切入,大概与组件有关系。…

Transition内置组件设置无效的原因

1. 包裹的组件是否有显示隐藏状态的切换&#xff0c;或者是绑定的key值是否发生改变 由 v-if 所触发的切换由 v-show 所触发的切换由特殊元素<component> 切换的动态组件改变特殊的key属性 2. 要放在发生变化的组件外层&#xff0c;如果中间有其他元素或组件会不生效 …

C++ copy()函数详细介绍

copy() 是一个标准库函数&#xff0c;位于 头文件中。它用于将一个容器中的元素复制到另一个容器中&#xff0c;或者将一个范围内的元素复制到另一个范围中。 函数参数介绍 copy( first, last, d_first );first 和 last&#xff1a;表示输入范围的迭代器。 first 指向要复制的…

Keil软件某些汉字输出乱码,0xFD问题,51单片机

1. 问题 keil软件输入某些汉字的时候会输出乱码&#xff0c;例如&#xff1a;升、 数 2. 原因 keil软件会忽略0xFD。 升的GB2312编码为 0xc9fd&#xff0c;keil解析为0xc9数的GB2312编码为 0xcafd&#xff0c;keil解析为0xca 关于Keil软件中0xFD问题的说明 3. 解决方案1 …

深入解剖指针篇(3)

个人主页&#xff08;找往期文章&#xff09; &#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 二级指针 指针数组 指针数组模拟二维数组 字符指针变量 数组指针 数组指针初始化 二维数组传参的本质 函数指针 函数指针的使用 typedef关键字 函数指针数组 二级指针…

Linux内存管理:(十一)页面分配之慢速路径

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 水位管理和分配优先级 页面分配…

0202-2-存储器管理

第四章:存储器管理 存储器的层次结构 多层结构的存储系统 存储器的多层结构 CPU寄存器主存辅存 可执行存储器 寄存器和主存的总称访问速度快&#xff0c;进程可以在很少的时钟周期内用一条load或store指令完成存取。 主存储器与寄存器 高速缓存和磁盘缓存 程序的装入和链…

《金融时报》:直面“雪球”风波 究竟影响几何?

“他们给我推荐的时候说是只要市场不大跌&#xff0c;我就能按照年化20%获得收益&#xff0c;当时我看大盘走势&#xff0c;也认为跌那么多的概率不大。”李先生告诉《金融时报》记者&#xff0c;他当初被银行客户经理推荐“雪球”产品并头脑一热买了的时候&#xff0c;以为按照…

springboot集成 mysql快速入门demo

一、mysql环境搭建 采用docker-compose搭建&#xff0c;配置如下&#xff1a; docker-compose.yml version: 3 services:mysql:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:5.7 # 原镜像mysql:5.7container_name: mysql_3306 …

C++入坑基础知识点

当学习了C语言之后&#xff0c;很多的小伙伴都想进一步学习C&#xff0c;但两者有相当一部分的内容都是重叠的&#xff0c;不知道该从哪些方面开始入门C&#xff0c;这篇文章罗列了从C到C必学的入门知识&#xff0c;学完就算是踏入C的大门了。 1. 命名空间 写C的时候&#xff…

LeetCode 热题 100 | 链表(上)

目录 1 基础知识 1.1 空指针 1.2 结构体 1.3 指针访问 1.4 三目运算符 2 160. 相交链表 3 206. 反转链表 4 234. 回文链表 菜鸟做题第三周&#xff0c;语言是 C 1 基础知识 1.1 空指针 使用 nullptr 来判断是否为空指针&#xff1a; if (headA nullptr) …

鸿蒙开发有必要学吗?看完这篇再决定吧

在科技的潮流中&#xff0c;每一次新操作系统的诞生都是对旧秩序的挑战与新机遇的孕育。鸿蒙操作系统的出现&#xff0c;无疑是近年来科技界最引人注目的事件之一。自华为于2019年正式推出鸿蒙系统以来&#xff0c;这一我们自主研发的操作系统不仅在国内引起巨大反响&#xff0…

常见的6种软件测试用例设计方法

常见的软件测试用例设计方法&#xff0c;个人认为主要是下面这6种&#xff1a; 流程图法&#xff08;也叫场景法&#xff09;等价类划分法边界值分析判定表正交法错误推测法 这6种常见方法中&#xff0c;我分别按照定义、应用场景、使用步骤、案例讲解这4个部分进行讲解。 所…

MySQL查询数据(十)

MySQL查询数据&#xff08;十&#xff09; 一、SELECT基本查询 1.1 SELECT语句的功能 SELECT 语句从数据库中返回信息。使用一个 SELECT 语句&#xff0c;可以做下面的事&#xff1a; **列选择&#xff1a;**能够使用 SELECT 语句的列选择功能选择表中的列&#xff0c;这些…

不一样的味觉体验:精酿啤酒与烤肉的绝妙搭配

在繁华的都市生活中&#xff0c;人们总是在寻找那份与众不同的味觉享受。当夏日的微风轻轻拂过&#xff0c;你是否想过&#xff0c;与三五好友围坐在一起&#xff0c;拿着Fendi Club啤酒与烤肉的绝妙搭配&#xff0c;畅谈生活点滴&#xff0c;感受那份惬意与自在&#xff1f; F…

2401Idea用GradleKotlin编译Java控制台中文出乱码解决

解决方法 解决方法1 在项目 build.gradle.kts 文件中加入 tasks.withType<JavaCompile> {options.encoding "UTF-8" } tasks.withType<JavaExec> {systemProperty("file.encoding", "utf-8") }经测试, 只加 tasks.withType<…

基于单片机的智能燃气灶控制系统设计

摘要&#xff1a;针对传统燃气灶存在不能防干烧、不能进行温度检测、不能进行火力自动调节等问题&#xff0c;设计了一种基于单片机控制的智能燃气灶&#xff0c;它通过单片机进行控制&#xff0c;由开关模块、测温模块、语音播报模块、火力控制模块和防空烧模块五个模块组成&a…

Lazysysadmin

信息收集 # nmap -sn 192.168.1.0/24 -oN live.port Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-30 21:10 CST Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00075s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nma…

Flutter解析后台发来的jwt字段数据,了解jwt是否过期

前言 了解JWT是什么可以看这一篇博文 JWT&#xff08;JSON Web Token&#xff09;详解以及在go-zero中配置的方法-CSDN博客 流程 采用jwt_decoder库 添加至pubspec.yaml jwt_decoder: ^2.0.1 解析字段 查看是否过期 获取过期时间和token颁发的年龄

面试八股文(2)

文章目录 1.ArrayList和LinkedList区别2.HashMap和HashTable区别3.线程的创建方式4.Java中异常处理5.Java序列化中某些字段不想进行序列化&#xff1f;6.Java序列化7.静态方法和实例方法8.List、Set、Map三者区别9.ArrayList和Vector区别10.HashMap和HashSet区别 1.ArrayList和…