渐进时间复杂度O(n)

基本操作数

       算法的运行速度受计算机性能的影响,所以通常考虑算法效率的不是算法运行的实际用时,而是算法运行所需要进行的基本操作的数量。

       像加减乘除、访问变量、给变量赋值等都可以看作基本操作。对基本操作的计数或是估测可以作为评判算法用时的指标。

时间复杂度

       在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即 时间复杂度。

        时间复杂度是指算法运行时间与问题规模之间的关系,通常用大 O 表示法来表示。

     常见的时间复杂度有O(1), O(logn), O(n), O(nlogn), O(n^2 ), O(2^n)等,其中 O(1) 表示算法的运行时间不随问题规模变化而改变,而O(2^n ) 则表示算法的运行时间随问题规模n呈指数级增长。

 变化趋势意味着我们不用纠结于具体的操作次数和n之间的精确对应关系,也就是不用看具体的函数的参数是什么,而只用看随着数据范围的增大,操作次数的变化是属于哪一类函数。

       例如:是常数,还是线性的,还是对数的,还是nlogn的,还是n^2的,还是2^n的,还是阶乘n!的。原因是当n变得非常大的时候,这些不同类型的函数之间的差异值才是明显的,而同一种类型之间的参数不同带来的差异就显得微不足道了,可以忽略不计。这也是为什么O(1)和O(3) 都被称作 O(1)。

例子
for (int i = 1; i <= n; i++)
{j = i;j++;
}

   这段代码的时间复杂度O(n)的。分析代码的执行次数,第1行中i=1执行1次, i<=ni++分别执行n次,第2行、第3行分别执行n次,所以这段代码总共执行4n+1次。从这个结果可以看出,这个算法的耗时是随着n的变化而变化。如果n无限大的时候,1+4n 中的常量1就没有意义了,倍数4的意义也不大。因此时间复杂度直接简化为O(n)。

计算次数

       O(n)、O(logn)、O(n​)、O(nlogn)随着n的增加,复杂度提升不大,因此这些复杂度属于效率高的算法,反观O(2^n)和O(n!)当n增加到50时,复杂度就突破十位数了,这种效率极差的复杂度最好不要出现在程序中。(tips:通常计算机每秒可以计算的次数大约是10的8次方)

最坏、最好、平均

       在进行时间复杂度分析时,需要考虑算法的最好、最坏、平均情况时间复杂度。

      最好情况时间复杂度是指算法在最优输入情况下的运行时间复杂度,即在所有可能的输入情况中,算法所需的最少时间。例如,对于二分查找算法来说,在目标元素为中间元素的情况下,查找时间为 O(1)。

      最坏情况时间复杂度是指算法在最劣输入情况下的运行时间复杂度,即在所有可能的输入情况中,算法所需的最长时间。例如,对于冒泡排序算法来说,最坏情况是需要 O(n^2) 的时间复杂度。

     平均情况时间复杂度是指算法在所有可能输入情况下的平均运行时间复杂度。对于某些算法来说,平均情况时间复杂度更能反映算法的运行效率,例如快速排序算法的平均情况时间复杂度为 O(nlogn),而最坏时间复杂度是 O(n^2)。

       我们通常所说的时间复杂度大 O是指算法的最坏时间复杂度。这是因为最坏时间复杂度能够给出算法的最长运行时间,可以帮助我们评估算法的性能并预估程序的执行时间。此外,最坏时间复杂度也是一种更保守的衡量指标,即使算法在最坏情况下表现较好,也能够保证算法的性能不会低于最坏时间复杂度。

常见的时间复杂度
常数阶O(1)

       代码执行次数是一个常数,不随n的变化而变化,那这个代码的时间复杂度就都是O(1),如下的代码中虽然含有for循环,但循环次数是100次,不随问题规模变化而变化,因此是常数级O(1)的时间复杂度:

for(int i = 1; i <= 100; i++)
{cnt += i;
}
线性阶O(n)

       这段代码,for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码都可以用O(n)来表示它的时间复杂度。

for(int i = 1; i <= n; i++)
{cnt += i;
}
对数阶O(logn)

        同样是for循环,但这段代码的时间复杂度是O(logn),因此不能单纯认为for循环就一定是O(n)的。

for(int i = 1; i <= n; i *= 2)
{cnt++;
} 
线性对数阶O(nlogn)

       线性对数阶O(nlogn) 其实非常容易理解,将时间复杂度为O(logn) 的代码循环n遍的话,那么它的时间复杂度就是 n×O(logn)。

就拿上面的代码加一点修改来举例:

for(int i = 1; i <= n; i++)
{     for(int j = 1; j <= n; j *= 2){cnt++;}
}

 

平方阶O(n^2 )

平方阶O(n^2)就更容易理解了,如果把O(n)的代码再嵌套循环一遍,它的时间复杂度就是 O(n^2) 了。

for(int i = 1; i <= n; i++)
{for(int j = 1; j <= n; j++){cnt++; } 
}
阶乘阶O(n!)

 指数阶O(2^n)
void f(int n)
{if(n==1){return 1;}else{return f(n-1)+f(n-2);}
}

彩蛋
#include <bits/stdc++.h>
using namespace std;
int main()
{cout<<"O(1):"<<endl;cout<<"int n=100;"<<endl;cout<<"int a=n;"<<endl;cout<<endl;cout<<"O(logn):"<<endl;cout<<"while(i<=n)"<<endl;cout<<"{"<<endl;cout<<"   i*=2;"<<endl;cout<<"}"<<endl;cout<<endl;cout<<"O(n):"<<endl;cout<<"for(int i=1;i<=n;i++)"<<endl;cout<<"{"<<endl;cout<<"   cout<<1;"<<endl;cout<<"}"<<endl;cout<<endl;cout<<"O(nlogn)(logn重复n遍):"<<endl;cout<<"for(int i = 1; i <= n; i++)"<<endl;cout<<"{"<<endl;     cout<<"    for(int j = 1; j <= n; j *= 2)"<<endl;cout<<"    {"<<endl;cout<<"         cnt++;"<<endl;cout<<"    }"<<endl;cout<<"}"<<endl;cout<<endl;cout<<"O(n*n):"<<endl;cout<<"for(int i=1;i<=n;i++)"<<endl;cout<<"{"<<endl;cout<<"   for(int j=1;j<=n;j++)"<<endl;cout<<"   {"<<endl;cout<<"      cout<<1;"<<endl;cout<<"   }"<<endl;cout<<"}"<<endl;cout<<endl;cout<<"O(2^n):"<<endl;cout<<"void f(int n)"<<endl;cout<<"{"<<endl;cout<<"   if(n==1)"<<endl;cout<<"   {"<<endl;cout<<"       return 1;"<<endl;cout<<"   }"<<endl;cout<<"   else"<<endl;cout<<"   {"<<endl;cout<<"       return f(n-1)+f(n-2);"<<endl;cout<<"   }"<<endl;cout<<"}"<<endl;return 0;
}
learn more!!!

Big-O Algorithm Complexity Cheat Sheet (Know Thy Complexities!) @ericdrowell

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

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

相关文章

Python turtle海龟绘制美国队长盾牌

使用Python中的turtle模块绘制美队盾牌 具体思路如下&#xff1a; 导入海龟库第1个圆&#xff1a;半径 200&#xff0c;红色填充第2个圆&#xff1a;半径 150&#xff0c;白色填充第3个圆&#xff1a;半径 100&#xff0c;红色填充第4个圆&#xff1a;半径 50&#xff0c;蓝色…

CSS基础常用属性之字体属性(如果想知道CSS的字体属性知识点,那么只看这一篇就足够了!)

前言&#xff1a;在我们学习CSS的时候&#xff0c;主要学习选择器和常用的属性&#xff0c;而这篇文章讲解的就是最基础的属性之一——文字属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 废话不多说&#xff0c;让我们直…

【C++】C++11 包装器

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 function包装器 fu…

RHCE:网络服务综合项目

基础配置&#xff1a; 1.配置主机名&#xff0c;静态IP地址 2.开启防火墙并配置 3.部分开启SElinux并配置 4.服务器之间使用同ntp.aliyun.com进行时间同步 5.服务器之间实现SSH免密登录 业务需求&#xff1a; 1.Server-NFS-DNS主机配置NFS服务器&#xff0c;将博客网…

【Lattice FPGA 开发】Modelsim与Diamond联合仿真

本文讲解Modelsim与Diamond进行联合仿真步骤&#xff0c;以及对遇到问题的解决与说明。 文章目录 软件版本0. Diamond设置文件为仿真文件特别注意 1. Diamond设置仿真软件为Modelsim2. Modelsim编译Lattice的库文件2.1 新建文件夹存放库文件2.2 Modelsim中建立新的仿真库2.2.1…

千锤百炼之算法Scanner和System.out引起超时解决办法

题外话 觉得这个内容还是很关键的,过来写一下吧 本次内容有点抽象大家试着听一下 正题 做过算法题的人都知道,无论是在力扣还是牛客或者别的网站刷题,很多情况下都会遇到输入输出的情况,当我们用Scanner和System.out.print()就有可能产生超时问题 如下图 接下来会有一段代…

远程计算机或设备将不接受连接_解决方法

重启了下电脑遇到了无法联网的问题&#xff0c;解决方法如下&#xff1a; 打开“控制面板”&#xff1b; 打开Internet选项&#xff1b; 点击“连接”&#xff1b; 点击“局域网设置”&#xff1b; 设置选项为下图&#xff1a; 连接成功了&#xff1a; 原因&#xff1a; 打…

数字化到底具有何种魔力!成为跟上时代的必经之路?

数字化确实具有深远的魔力和吸引力&#xff0c;成为现代企业在跟上时代步伐、实现持续发展和创新的重要驱动力。相较于传统信息化&#xff0c;数字化转型能够为企业带来更为显著和全面的降本增效效应。 首先&#xff0c;数字化转型通过深度融合信息技术和管理标准化&#xff0c…

GPU版本torch使用教程

GPU版本torch使用教程 一、下载配置CUDA和CUDNN &#xff08;1&#xff09;进入cmd使用nvidia-smi.exe查看自己电脑支持的最新CUDA版本&#xff08;可以下载地低版本&#xff09;&#xff0c;如图&#xff1a; 也可以通过NVIDIA控制面板&#xff08;NVIDIA Control Panel&am…

HTML重要标签梳理学习

1、HTML文件的框架 使用VS Code编码时&#xff0c;输入!选中第一个&#xff01;就可以快速生成一个HTML文件框架。 2、标签 <hr> <!--下划线--> <br> <!--换行--> <strong>加粗</strong> &…

C++11——线程库的理解与使用

目录 前言 一、线程库的构造 1.默认构造 2.带参构造 3.拷贝构造与赋值拷贝&#xff08;不支持&#xff09; 4.移动构造 二、线程调用lambda函数 三、线程安全与锁 1.lambda中的线程与锁 2.函数指针中的线程与锁 3.trylock() 4.recursive_mutex 5.lock_gurad守卫锁…

JAVA-服务器搭建-创建web后端项目

首先打开IDEA 点击新建项目 写好名称-模板选择 Web应用程序 -语言选择 Java 构建系统选择 Maven 然后点击下一步 选择版本-选择依赖项 Web Profile 点击创建 点击当前文件-选择编辑配置 选择左上角的加号-选择Tomcat服务器-选择本地 点击配置-选择到Tomcat目录-点击确定 起个…

利用STM32 HAL库实现USART串口通信,并通过printf重定向输出“Hello World“

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 上一篇使用STM32F407的HAL库只需1行代码实现US…

云仓酒庄广西发布会盛启:新老经销商欢聚南宁

原标题&#xff1a;云仓酒庄广西发布会盛启&#xff1a;新老经销商欢聚南宁&#xff0c;共襄精酿啤酒盛宴在夏日的热情与激情中&#xff0c;云仓广西发布会于今日在美丽的南宁盛大开幕。来自各地的经销商们齐聚一堂&#xff0c;共同见证了这一盛况。此次发布会不仅是一次产品的…

2024年汉字小达人活动还有5个月开赛:来做18道历年选择题备考吧

现在距离2024年第11届汉字小达人比赛还有五个多月的时间&#xff0c;如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。阅读理解不需要。②把历年真题刷刷熟&#x…

数电期末复习(一)数制和码制

数制和码制 1.1 概述1.2 几种常用的数制1.2.1 十进制&#xff08;Decimal&#xff09;1.2.2 二进制&#xff08;Binary&#xff09;1.2.3 二-十进制之间的转换1.2.4 十六进制和八进制1.2.5 任意进制之间的转换 1.3 二进制代码1.3.1 二-十进制码(BCD Binary Coded Decimal)1.3.2…

2023年网络安全行业:机遇与挑战并存

2023年全球网络安全人才概况 根据ISC2的《2023年全球网络安全人才调查报告》&#xff0c;全球的网络安全专业人才数量达到了550万&#xff0c;同比增长了8.7%。然而&#xff0c;这一年也见证了网络安全人才短缺达到了历史新高&#xff0c;缺口数量接近400万。尤其是亚太地区&am…

ARM_day6:实现字符串数据收发函数的封装

程序代码&#xff1a; uart4.h&#xff1a; #ifndef __UART4_H__ #define __UART4_H__ #include"stm32mp1xx_gpio.h" #include"stm32mp1xx_rcc.h" #include"stm32mp1xx_uart.h" void uart4_config(); void putchar(char dat); char getchar();…

【电机参数】直流无刷电机机械转速、ud、uq、us、输出功率、相反电动势幅值、载波周期、转矩常数

【电机参数】直流无刷电机机械转速、ud、uq、us、输出功率、相反电动势幅值、载波周期、转矩常数 前言 【电机控制】直流有刷电机、无刷电机汇总——持续更新 使用工具&#xff1a; 1.示波器&#xff1a;PICO2205A 2.电桥LCR&#xff1a;VICIOR4090A 3.电流钳&#xff1a;汉泰…

接口测试相关

接口测试&#xff0c;接口 接口是数据交互的入口和出口 接口是一套规范和标准 统一设计标准 前后端相对独立 扩展型灵活 接口文档。 接口测试 接口测试环境&#xff0c;运行程序&#xff0c;自己搭建环境 接口测试插件 谷歌postman 火狐 restclient java测试工具为j…