1-时间复杂度分析

news2024/9/17 9:11:11

时间复杂度

①what:

指执行当前算法所消耗的时间

②简介结论:

时间复杂度由多项式T(n)中最高阶的项来决定,系数的影响忽略即可

例子

操作数量T(n)

时间复杂度O(f(n))

常数,比如

100000(即:n的0次方 值为1)

O(1)

一次函数,比如

3n+2

O(n)

二次函数,比如

2n^2+3n+2

O(n^2)

三次函数,比如

n^3+10000n^2

O(n^3)

...

以此类推

2^n+10000n^10000

2^n从某个位置开始会出现“爆炸性”增长,指数增长幅度远大于幂增长

O(2^n)

③常见类型:

设输入数据大小为n,常见的时间复杂度类型(从低到高)有:

              O(1)<O(logn) < O(n)   < O(nlogn)   < O(n^2)< O(2^n)<O(n!)

对应:常数阶< 对数阶 <线性阶<线性对数阶<平方阶 < 指数阶 <阶乘阶

----说明:这里logn也就是log2 n (2为下标)


  • 常数阶O(1)

常数阶的操作数量与输入数据大小n无关,即不随着n的变化而变化

无论操作数量size有多大,只要与数据大小n无关,时间复杂度就仍为O(1)

/* 常数阶 O(1) */
int constant(int n){
	int cnt=0;
	int size=100000;
	for(int i=0;i<size;i++) cnt++;
	return cnt;
} 

  • 对数阶O(logn)

对数阶反映“每轮缩减到一半的情况”
对数阶常出现于「二分查找」和「分治算法」中,体现“一分为多”、“化繁为简”的算法思想

现在:设输入数据大小为n,由于每轮缩减到一半,因此循环次数是log2^n

/* 对数阶 O(logn) */
int logarithmic(float n){
	int cnt=0;
	while(n>1) n/=2,cnt++;
	return cnt;
} 

对数阶也常出现于递归函数,代码如下:

/* 对数阶(递归实现) */
int logRecur(float n){
	if(n<=1) return 0;
	return logRecur(n/2)+1;
} 

  • 线性阶O(n)

线性阶的操作数量相对输入数据大小成线性级别增长,常出现在单层循环

/* 线性阶 O(n) */
int linear(int n){
	int cnt=0;
	for(int i=0;i<n;i++) cnt++;
	return cnt;
} 

涨知识:「遍历数组」和「遍历链表」等操作,时间复杂度都为O(n),其中n为数组或链表的长度。


  • 线性对数阶O(nlogn)

线性对数阶常出现于嵌套循环中,两层循环的时间复杂度分别为O(logn)和O(n)
主流排序算法的时间复杂度都是O(nlogn),例如快速排序、归并排序、堆排序等

/* 线性对数阶 O(nlogn) */
int linearLogRecur(float n){
	if(n<=1) return 1;
	int cnt=linearLogRecur(n/2)+linearLogRecur(n/2);
	for(int i=0;i<n;i++) cnt++;
	return cnt;
} 

  • 平方阶O(n²)

平方阶常出现于嵌套循环,外层循环和内层循环都为O(n),总体为O(n2)


  • 指数阶O(2^n)

借用“细胞分裂”来代表指数阶增长:初始状态为1个细胞,分裂一轮后为2个,分裂两轮后为4个,....分裂n轮后为2^n个细胞,指数阶常出现于递归函数

/* 指数阶 O(2^n) */
int exponential(int n){
	int cnt=0,base=1;
	// cell每轮一分为二,形成数列 1,2,4,8,... ,2^(n-1) 
	for(int i=0;i<n;i++)
		for(int j=0;j<base;j++)
			cnt++;
		base*=2;
	return cnt;
} 

  • 阶乘阶 O(n!)

阶乘阶对应数学上的「全排列」
即给定n个互不重复的元素,求其所有可能的排列方案,则方案数量为
n!=n*(n-1)*(n- 2)*...*2*1
阶乘常使用递归实现
例如以下代码,第一层分裂出n个,第二层分裂出n-1个,....,直至到第n层时终止分裂

/* 阶乘阶 O(n!) */
int factorialRecur(int n){
	if(n==0) return 1;
	int cnt=0;
	//从 1个分裂出 n个
	for(int i=0;i<n;i++) cnt+=factorialRecur(n-1);
	return cnt;
} 
完
//总结:站在巨人的肩膀上打小抄

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

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

相关文章

ChatGPT将批量文档翻译成中文的方法

文档翻译成中文软件是指在处理文档时&#xff0c;自动将文档中的内容翻译成中文的软件。这些软件通常采用自然语言处理技术&#xff0c;通过对待翻译文本的分词、词义分析、语法分析等多种技术处理&#xff0c;实现对文本中的单词、短语、句子等级别的翻译。 文档翻译成中文软件…

CSDN,有幸遇见 ——我的三周年创作纪念日

一生二&#xff0c;二生三&#xff0c;三生万物 三年&#xff0c;与 CSDN 的相遇相识相知—— 前两年都没写&#xff0c;一是没纪念的概念&#xff0c;二是纪念日这天每年总是清明节。 还有就是不知道有勋章&#xff08;&#xff08; Meet 遇见 那年&#xff0c;我六年级&a…

JVM 垃圾回收详解之垃圾收集算法+垃圾收集器

标记-清除算法 该算法分为“标记”和“清除”阶段&#xff1a;首先标记出所有不需要回收的对象&#xff0c;在标记完成后统一回收掉所有没有被标记的对象。 它是最基础的收集算法&#xff0c;后续的算法都是对其不足进行改进得到。 这种垃圾收集算法会带来两个明显的问题&…

Node.js—path模块

目录 1、什么是path模块2、path.resolve 拼接规范的绝对路径 常用3、path.sep 获取操作系统的路径分隔符4、 path.parse 解析路径并返回对象5、path.basename 获取路径的基础名称6、path.dirname 获取路径的目录名7、path.extname 获得路径的扩展名8、 path.join()路径拼接 1、…

Linux高性能服务器编程|阅读笔记:第2章 - IP协议详解

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

超越ChatGPT:AgentGPT正在将自主AI带到浏览器中

你好&#xff0c;欢迎来到人工智能领域的新时代&#xff01;今天我们介绍AgentGPT&#xff0c;这是一款最前沿的基于浏览器的平台&#xff0c;旨在革新人工智能的自主性。这项开创性的技术让你能够在舒适的网络浏览器中创建、配置和部署定制化的人工智能代理&#xff0c;以实现…

又涨了?2023全国程序员薪资最新统计(文末附招聘岗位)

大家好&#xff0c;金三银四招聘季还在进行中。刚好最近看到一份 2022 国内程序员薪酬报告&#xff0c;感觉挺有意思的&#xff0c;跟大家分享一下。 在科技迅速发展的时代&#xff0c;各行业对程序员的需求持续增长&#xff0c;程序员作科技市场的“重要基石”&#xff0c;薪…

nodejs+vue 高校校园食堂餐品在线订购网

食堂作为学校的一个重要的部门&#xff0c;为学生提供了用餐的地点&#xff0c;学生可以在食堂享用丰富的餐品&#xff0c;建立一个在校订餐网站&#xff0c;帮助了学生提供一个用餐订餐的系统&#xff0c;也帮助了食堂提供了一个餐品展示的站点。 园的食堂作为一个窗口单位&a…

【nacos配置中心】源码部分解析

启动初始化 SpringApplication.prepareContext applyInitializers 回调ApplicationContextInitializer的initialize方法 getInitializers()从applicationContext获取List<ApplicationContextInitializer<?>> initializers 这个集合是通过SpringApplication的…

Node.js -- Express中间件

1.中间件的概念 1.1 什么是中间件 中间件&#xff08;Middleware&#xff09;,特指业务流程的中间处理环节。 1.2 现实中的例子 1.3 Express中间件的调用流程 当一个请求到达Express服务器中&#xff0c;可以连续调用多个中间件&#xff0c;从而对这次请求进行预处理。 1…

OpenGL入门教程之 深入理解

一、OpenGL简介 OpenGL是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程规范。OpenGL包含一系列可以操作图形和图像的函数&#xff0c;但OpenGL没有实现这些函数&#xff0c;OpenGL仅规定每个函数应该如何执行以及其输出值(类似接口)&#xff0c;所以OpenGL仅是一…

Excel技能之计数求和,让你成为高手之路的机车手

Excel高手之路&#xff0c;开始学习就看到希望。 直接套用&#xff0c;秒变Excel大神。点滴积累&#xff0c;效率飞升。分享给更多的人&#xff0c;一起学习进步。告别加班&#xff0c;让同事刮目相看。 Excel函数&#xff0c;你可以不用&#xff0c;但是不能不知道&#xff…

OpenAI-ChatGPT最新官方接口《安全最佳实例》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(十)(附源码)

Safety best practices 安全最佳实践 前言Use our free Moderation API 使用我们的免费审核APIAdversarial testing 对抗性测试Human in the loop (HITL) 人在回路Prompt engineering 快速工程“Know your customer” (KYC) “了解你的客户”Constrain user input and limit ou…

【Vue3】setup的注意点及watch监视属性的六种情况

一&#xff0c;setup须知 1.1setup的执行时间 1.setup的执行时间要比beforCreate执行要早 export default {name: "Demo",beforeCreate(){console.log(beforeCreate已执行);},setup() {console.log(setup已执行);let person reactive({name: "小明",ag…

Faster RCNN系列——RPN的真值详解与损失值计算

目录 一、RPN真值详解二、RPN预测值三、损失值计算 一、RPN真值详解 RPN的真值分为类别真值和偏移量真值&#xff0c;即每一个Anchor是否对应着真实物体&#xff0c;以及每一个Anchor对应物体的真实偏移值&#xff0c;这两种真值的具体求解过程如下图所示&#xff1a; Anchor生…

【小程序云开发】不用后端也能构建完整的微信小程序

文章目录 什么是微信小程序云函数云数据库HTTP 云函数定时触发云函数总结写在最后 什么是微信小程序云函数 微信小程序云函数是通过微信小程序云开发提供的一种服务器端代码&#xff0c;用于在小程序中进行服务器端的开发和部署。 以下是一些常见的微信小程序云函数类型&#…

AI网站汇总(免费chatgpt)(70个持续增加中)

本文总结了八大类AI工具,包括:聊天AI、绘画AI、AI提示词、图像处理、实用工具、UI设计和3D设计、本地部署AI,汇总AI网站,一键收藏。 目录 一、聊天AI 二、绘画AI 三、AI提示词 四、图像处理

巡检机器人之仪表识别系统

作者主页&#xff1a;爱笑的男孩。 博客简介&#xff1a;分享机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。 如发现文章有误&#xff0c;麻烦请指出&#xff0c;我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666foxmail.c…

什么是LVS

&#x1f618;作者简介&#xff1a;一名99年运维岗位员工。&#x1f44a;宣言&#xff1a;人生就是B&#xff08;birth&#xff09;和D&#xff08;death&#xff09;之间的C&#xff08;choise&#xff09;&#xff0c;做好每一个选择。&#x1f64f;创作不易&#xff0c;动动…

【brtc】视频下行弱网对抗优化 学习笔记

感谢孙健老师和livevideostack学习笔记百度云 音视频实时通信五个部分 1 RTC基础 需要云端服务器参与大量边缘服务器参与采集、前处理(图像处理)、压缩编码音频 3 A 回声消除、增益</