时间复杂度分析

复杂度分析的必要性:

当给我们一段代码时,我们是以什么准则来判断代码效率的高低呢?每一段代码都会消耗一段时间,或占据一段数据空间,那么自然是在实现相同功能的情况下,代码所耗时间最少,所占据空间最小的代码效率更优。所以对于所耗时间,我们采用时间复杂度进行分析,对于所占空间,我们采用空间复杂度进行分析。

时间复杂度:

在问题中,我们将题目中数据的频数成为n。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。我们想要知道当n不断变化时,T(n)的变化规律。若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。

大O符号表示法的引入:

下面我们先来看这一段代码:

1|for(i=1; i<=n; ++i)
2|{
3|  j = i;
4|  j++;
5|}

假设每行代码的执行时间都是相同的,假设为1。

则第1行执行时间是1,第3行执行时间为n,第4行执行时间为n。所以有T(n) = (2n + 1),

有当n趋于无穷大时,+1, 与*2 的意义可以忽略。所以时间复杂度记为O(n)。

常见的时间复杂度量级:

常数阶O(1)
对数阶O(logN)
线性阶O(n)
线性对数阶O(nlogN)
平方阶O(n2)
立方阶O(n3)
K次方阶O(nk)
指数阶(2n)

复杂度从上到下越来越大,执行效率越来越低下

下面对一些复杂度举例分析:

1,常数阶——无论有多少行,其复杂度不随n的变化而变化。

int i = 1;
int j = 2;
++i;
j++;
int m = i + j;

 2,线性阶O(n):

如上文举例所示。

3,对数阶O(logN):

int i = 1;
while(i<n)
{i = i * 2;
}

while循环中,将i * 2,i变化的越来越快,离n也越来越近。假设循环x次后,i就大于2了;所以有

2的x次方等于n,所以x = log2^n,所以代码的时间复杂度为O(logN);

4,线性对数阶O(NlogN):

就是将线性阶循环N次,便是线性对数阶。

for(m=1; m<n; m++)
{i = 1;while(i<n){i = i * 2;}
}

5,k次方阶:

就是k层循环嵌套。

经典算法的时间复杂度分析:

一般算法题或笔试题的时间限制为1s,或2s以内;故c++的操作次数一般控制在10^7 ~ 10^8为佳。

log(10^x)≈3*x。

调和级数的时间复杂度为O(logN);

分母只取质数的调和级数时间复杂度为O(loglogN);

而在不同数据范围内,应该选择怎样的算法与时间复杂度:

· 当N <= 30, ——指数级别,dfs + 剪枝,状压DP;

· 当N <= 100, ——O(N^3) 或O(N^3 logN) floyd算法,或普通dp

· 当N <= 1000.——O(N^2) 或 O(N ^ 2 logN)  dp,  二分

· 当N <= 10000 —— O(N * \sqrt{N}),块状链表。

· 当N  <= 10^5——O(N logN),各种排序,线段树,树状数组,set/map,heap,堆优化版Dijkstra,spfa,二分,求半平面交

· 当N <= 10^6 —— O(N)以及常数较小的O(NlogN)hash,单调队列,双指针,BFS,并查集,kmp,AC自动机。(常数较小的O(NlogN))sort、树状数组、heap、dijkstra、spfa

·当N ≤ 10^7—— O(n)双指针扫描、kmp、AC自动机、线性筛素数

· 当N <= 10^9——O(\sqrt{N}) 判断质数,试除法求质数,试除法求所有约数,试除法分解质因数

` 当N <= 10 ^ 18——O(logN)最大公约数,快速幂,数位DP

· 当n≤10^1000——O(logN * loglogN)k表示位数,高精度加减乘除
 

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

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

相关文章

L1-1、Prompt 是什么?为什么它能“控制 AI”?

*Prompt 入门 L1-1 想象一下&#xff0c;你只需输入一句话&#xff0c;AI 就能自动为你写一篇文案、生成一份报告、甚至规划你的创业计划。这种“对话即编程”的背后魔法&#xff0c;就是 Prompt 的力量。 &#x1f50d; 一、Prompt 的定义与由来 Prompt&#xff08;提示词&am…

微信小程序文章管理系统开发实现

概述 在内容为王的互联网时代&#xff0c;高效的文章管理系统成为各类平台的刚需。幽络源平台今日分享一款基于SSM框架开发的微信小程序文章管理系统完整解决方案&#xff0c;该系统实现了多角色内容管理、智能分类、互动交流等功能。 主要内容 一、用户端功能模块 ​​多角…

【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

R7周:糖尿病预测模型优化探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、数据预处理 1.设置GPU import torch.nn.functional as F import torch.nn as nn import torch, torchvisiondevice torch.device("cuda"…

使用Tortoise-ORM和FastAPI构建评论系统

title: 使用Tortoise-ORM和FastAPI构建评论系统 date: 2025/04/25 21:37:36 updated: 2025/04/25 21:37:36 author: cmdragon excerpt: 在models.py中定义了Comment模型,包含id、content、created_at、updated_at字段,并与User和Article模型建立外键关系。schemas.py中定义了…

【VS Code】如何使用SSH打开远程服务器Docker上的项目或文件夹

要在VS Code中使用SSH打开远程服务器Docker上的项目或文件夹&#xff0c;您需要结合使用VS Code的Remote - SSH扩展和Docker的远程访问功能。以下是详细步骤&#xff1a; 安装VS Code Remote - SSH扩展 打开VS Code。点击左侧活动栏的扩展图标&#xff08;或使用快捷键CtrlShif…

NHANES指标推荐:PLP

文章题目&#xff1a;Association of pyridoxal 5-phosphate (PLP) with lipid profiles: a population-based cohort study DOI&#xff1a;10.3389/fnut.2025.1545301 中文标题&#xff1a;5-磷酸吡哆醛 (PLP) 与血脂谱的关系&#xff1a;一项基于人群的队列研究 发表杂志&am…

MySQL 详解之备份与恢复策略:数据安全的最后一道防线

在任何信息系统中,数据都是最宝贵的资产。数据的丢失可能源于多种原因:硬件故障、人为误操作、软件 Bug、恶意攻击,甚至自然灾害。一旦发生数据丢失,如果没有有效的备份和恢复机制,后果可能是灾难性的,可能导致业务中断、经济损失甚至法律责任。 数据库备份与恢复,正是…

2026《数据结构》考研复习笔记五(栈、队列)

栈、队列 一、栈1.卡特兰数2.不合法的出栈序列 二、队列1.循环队列2.输入输出受限队列&#xff08;四个数1234&#xff09; 三、算法1.栈在括号匹配中的应用2.中缀表达式求值&#xff08;通过转化为后缀表达式再后缀表达式求值&#xff09;3.中缀表达式转化为后缀表达式4.后缀表…

深入解析微软MarkitDown:原理、应用与二次开发指南

一、项目背景与技术定位 微软开源的MarkitDown并非简单的又一个Markdown解析器&#xff0c;而是针对现代文档处理需求设计的工具链核心组件。该项目诞生于微软内部大规模文档系统的开发实践&#xff0c;旨在解决以下技术痛点&#xff1a; 大规模文档处理性能&#xff1a;能够高…

pyinstaller打包paddleocr发生错误解决

python环境是3.9&#xff0c;github paddleocr v2.10.0。 一个非常简单的案例如下&#xff0c;打包时发生错误。 import requests from paddleocr import PaddleOCR if __name__ "__main__":paddleocr_ocr PaddleOCR(use_angle_clsTrue, langch,det_model_dirmode…

算法之回溯法

回溯法 回溯法定义与概念核心思想回溯法的一般框架伪代码表示C语言实现框架 回溯法的优化技巧剪枝策略实现剪枝的C语言示例记忆化搜索 案例分析N皇后问题子集和问题全排列问题寻路问题 回溯法的可视化理解决策树状态空间树回溯过程 回溯法与其他算法的比较回溯法与动态规划的区…

命令行指引的尝试

效果 步骤 首先初始化一个空的项目&#xff0c;然后安装一些依赖 npm init -y npm install inquirer execa chalk ora至于这些依赖是干嘛的&#xff0c;如下图所示&#xff1a; 然后再 package.json 中补充一个 bin 然后再根目录下新建一个 index.js , 其中的内容如下 #!/…

探秘LLM推理模型:hidden states中藏着的self verification的“钥匙”

推理模型在数学和逻辑推理等任务中表现出色&#xff0c;但常出现过度推理的情况。本文研究发现&#xff0c;推理模型的隐藏状态编码了答案正确性信息&#xff0c;利用这一信息可提升推理效率。想知道具体如何实现吗&#xff1f;快来一起来了解吧&#xff01; 论文标题 Reasoni…

流量抓取工具(wireshark)

协议 TCP/IP协议簇 网络接口层&#xff08;没有特定的协议&#xff09;PPPOE 物理层数据链路层 网络层: IP(v4/v6) ARP&#xff08;地址解析协议) RARP ICMP(Internet控制报文协议) IGMP传输层&#xff1a;TCP(传输控制协议&#xff09;UDP&#xff08;用户数据报协议)应用层…

.NET仓储层在 using 块中创建 SqlSugarClient 的风险

如题&#xff0c;先看代码示例 using 块的使用 public ISugarQueryable<T> GetSet(Expression<Func<T, bool>> whereExpression null) {using (SqlSugarClient dbClient SqlSugarInstance.GetInstance()){var query dbClient.Queryable<T>();if (w…

C语言----函数栈帧讲解

目录 1.函数栈帧是什么? 2. 理解函数栈帧能解决什么问题 3、函数栈帧的创建和销毁具体过程 3.1 什么是栈 3.2 认识相关寄存器和汇编指令 3.3函数栈帧的创建和销毁 3.3.1 预备知识 3.3.2 函数的调用堆栈 3.3.3 准备环境 3.3.4 转到反汇编 3.3.5 函数栈帧的创建 3.3…

代码随想录学习笔记---二叉树

学习目标&#xff1a; 学习代码随想录–二叉树 每天学习1道,复习两道 学习内容&#xff1a; 2025.4.7 复习内容: 24. 两两交换链表中的节点 25. 最大二叉树 学习内容 26. 合并二叉树 2025.4.8 复习内容: 27. 二分查找 28. 合并二叉树 29. 27. 移除元素 学习内容: 30. 二叉…

Git ——提交至github,Vercel拉取,更新不了项目的问题解决

首先因为github上有个错误 1 failing check Vercel - No GitHub account was found matching the commit author email address 发现好像是vercel拉取不了项目&#xff0c;vercel登录的邮箱与我此次提交更改的邮箱不匹配&#xff0c;查看Git的user确实如此&#xff08;之前的…

Vue3项目中 npm 依赖安装 --save 与 --save-dev 的区别解析

这两个命令的区别如下&#xff1a; bash npm install --save types/crypto-js # 安装到 dependencies&#xff08;生产依赖&#xff09; npm install --save-dev types/crypto-js # 安装到 devDependencies&#xff08;开发依赖&#xff09; 核心区别 依赖分类不同…