算法——A/算法通识

目录

一、复杂度分析

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.hqwc.cn/news/447872.html

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

相关文章

一文7个步骤从0到1教你搭建Selenium 自动化测试环境

【导语】Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。本文详细介绍了搭建自动化测试环境所需的工具,让你学习自动化测试不…

制造业为什么越来越不景气?制造业为什么需要数字化转型?

从员工来说,付出和收获不成比例,干得多、拿得少,自然而然就越来越少人会选择这一行了。 从行业来说,成本提升、竞争大、利润低,维持运转更难,想提升员工待遇可能力不从心吧。 制造业工厂主要有以下3大问题…

STM32MP135开发板助力电力行业,IEC61850协议移植笔记

1.概述 IEC61850是变电站自动化系统(SAS)中通信系统和分散能源(DER)管理的国际标准。它通过标准的实现,实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明,在电力和储能系…

C++ 之LeetCode刷题记录(二十六)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 目标:执行用时击败90%以上使用 C 的用户。 125. 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后…

基于SpringBoot Vue学生信息管理

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

PP-PicoDet注意版面分析模型的结果导出时不需要有后处理,可以在configs/runtimes.yml中设置benchmark=Tr

版面分析 使用轻量模型PP-PicoDet检测模型实现版面各种类别的检测。 注意 版面分析模型的结果导出时不需要有后处理,可以在configs/runtimes.yml中设置benchmarkTrue

事件分发机制:demo复现子View的点击事件不起作用

demo使用的sdk是32 自定义一个MyLayout,继承自LinearLayout,重写onInterceptTouchEvent方法,返回true。如下: package com.exp.clickdemo;import android.content.Context; import android.util.AttributeSet; import android.vi…

详解 websocket

目录 一、什么是websocket 二、websocket 的用途 三、websocket 特点 四、websocket 帧 五、websocket URL 格式 六、发送消息 七、关闭会话的方式 八、关闭帧错误码 九、简单的websocket 代码 一、什么是websocket WebSocket该协议在规范RFC 6455中进行了描述&#…

C语言·贪吃蛇游戏(上)

1. 游戏任务 使用C语言在Windows环境的控制台中模拟实现小游戏贪吃蛇 游戏中要包含以下功能: 1. 贪吃蛇地图绘制 2. 贪吃蛇上下左右移动和吃食物 3. 蛇撞墙,或撞到自身死亡 4. 计算得分 5. 蛇身加速、减速 6. 暂停游戏 2. Win32 API 介绍 Windows是一种多…

Linux 网络配置及基础服务

目录 一. 查看网络配置信息的相关命令 1.1 ifconfig 命令 作用 1: 作用 2: 拓展: 1.2 ip/ethtool命令 1.3 hostname命令 1.4 route 命令 1.5 netstat 命令 1.6 ss(socket statistics)命令 1.7 ping 命令 …

element-ui link 组件源码分享

link 组件的 api 涉及的内容不是很多,源码部分的内容也相对较简单,下面从以下这三个方面来讲解: 一、组件结构 1.1 组件结构如下图: 二、组件属性 2.1 组件主要有 type、underline、disabled、href、icon 这些属性,…

《元梦之星》赛季更新带来“新”内容,为何却被玩家集体声讨?

前段时间,《元梦之星》迎来了“山海奇遇”赛季的重磅更新,诸多“新”内容的上线吸引了很多玩家们的关注,然而在新版本开启之后没有多,新玩法新时装甚至是游戏中的新改动都引起了不少玩家的不满。 在新赛季开启之后,玩家…