【软件设计师】通俗易懂的去了解算法的时间复杂度

 🐓 时间复杂度

常用排序的时间复杂度

时间频度

算法需要花费的时间,和它语句执行的次数是成正比的,所以会把一个算法种语句执行次数称为语句频度和时间频度、记作T(n)。

定义

时间复杂度就是找到一个无限接近时间频度T(n)同数量级的函数,当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度

通俗一点就是找到一个和T(n)同一量级的函数F(n),写作O(f(n)),一般在程序中我们会看最内层或者说其执行次数最多的代码行。

时间复杂度计算

时间复杂度中O是受T(n)种n变化次数最多的那一项影响,比如:T(n) = n^3+n^2+n+23 那这个最大的影响项就是O( n^3)

常见的时间复杂度

阶数

执行次数函数举例非正式术语
12O(1)常数阶
2n+3O(n)线性阶
n^2+2n+1O(n^2)平方阶
5log2n+20O(logn)/log2n对数阶
2n+3nlog2n+19O(nlogn)nlogn阶
n^3+n^2+3n+4O(n^3)立方阶
2^nO(2^n)指数阶

大小排序

消耗时间从小到大

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

 🐓 实例

常数阶O(1)

没有任何循环等复杂结构,时间复杂度就是O(1)常量阶

代码示例:

int a = 1; //O(1)
int b = 1; //O(1)
int t = a + b; //该行执行了O(1)次,故O(1)

对数阶O(log₂n)

在while循环里面,每次都将 i 乘以 2,乘完之后,i 距离 n 就越来越近了。假设循环x次之后,i 就大于 2 了,此时这个循环就退出了,也就是说 2 的 x 次方等于 n,那么 x = log2n也就是说当循环 log2n 次以后,这个代码就结束了。因此这个代码的时间复杂度为:O(log2n) 

代码示例:

int i = 1;
while (i <= n){i = i * 2; //该行执行了O(log2n)次,故O(log2n)
}

线性阶O(n)

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

代码示例:

for (int i = 1; i <= n; i++) {System.out.println(1); //该行执行了O(n)次,故O(n)
}

线性对数阶O(nlog₂n)

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

代码示例:

 for (int i = 1; i <= n; i++) { //该循环执行了n次int j = 1;while (j<=n){j = j * 2; //该行执行了O(nlog2n)次,故O(nlog2n)}}

平方阶O(n²)

平方阶O(n²) 就更容易理解了,就是两层n的循环嵌套,如果把 O(n) 的代码再嵌套循环一遍,它的时间复杂度就是 O(n²),这段代码其实就是嵌套了2层n循环,它的时间复杂度就是 O(nn),即 O(n²) 如果将其中一层循环的n改成m,那它的时间复杂度就变成了 O(mn)。

代码示例:

for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {System.out.println(1);//该行执行了O(n²)次,故O(n²)}
}

立方阶O(n³)

立方阶和平方阶差不多,只是多了一层循环,一共有三层n循环,它的时间复杂度就是O(n*n)。

代码示例:

for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {for (int k = 1; k <= n; k++) {System.out.println(1);//该行执行了O(n³)次,故O(n³)}}
}

n指数阶O(2ⁿ)

很少遇见,尽量少,建议少些这种复杂度的代码。

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

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

相关文章

基于springboot+vue实现校企合作项目管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现校企合作项目管理系统演示 摘要 这是一个计算机的时代&#xff0c;在计算机应用非常广泛的时代中&#xff0c;用计算机来完成对信息的处理有着非常好的使用效果。特别是针对学校而言亦是如此&#xff0c;通过在学校中的信息化建设&#xff0c;能够很好的提升…

S3---FPGA-A7板级电源硬件实战

视频链接 FPGA-A7板级电源硬件实战01_哔哩哔哩_bilibili FPGA-A7板级电源硬件实战 1、基于A7 板级的系统框图 2、基于A7 板级的电源设计细则 2.1、A7 FPGA功耗评估 Artix-7 FPGA电源有VCCINT, VCCBRAM, VCCAUX, VCCO, VMGTAVCC和VMGTAVTT。 2.1.1、A7 FPGA电源管脚 2.1.2…

http 协议深入介绍

一&#xff0c;http 相关概念 &#xff08;一&#xff09;关键名词 1&#xff0c;互联网 是网络的网络&#xff0c;是所有类型网络的母集 2&#xff0c;因特网 世界上最大的互联网网络。即因特网概念从属于互联网概念。习惯上&#xff0c;大家把连接在因特网上的计算机都成…

Matlab|基于Logistic函数负荷需求响应

目录 1 基于Logistic函数的负荷转移率模型 2 程序示例 3 效果图 4 下载链接 负荷需求响应模型种类较多&#xff0c;有电价型和激励型等类型&#xff0c;本次和大家分享一个基于Logistic函数的负荷转移率模型&#xff0c;该模型属于电价型&#xff0c;由于该方法使用的较少&a…

AGM CPLD (AGRV2K )的时钟(外部时钟和片上内部振荡器)

AGM CPLD &#xff08;AGRV2K &#xff09;的时钟(外部时钟和片上内部振荡器) 外部晶振 与 内部振荡器&#xff1a; mcu 和 cpld 联合编程时&#xff0c; 整颗芯片需要一颗外部晶振。 &#xff08;芯片有内部振荡器&#xff0c; 但误差较大&#xff0c; 校准后 5%以内误差&…

二维码门楼牌管理系统技术服务:制作详解

文章目录 前言一、二维码门楼牌制作技术要求二、二维码门楼牌管理系统的优势与应用 前言 随着信息化时代的到来&#xff0c;二维码技术已广泛应用于各个领域。在城市管理中&#xff0c;二维码门楼牌管理系统的应用为城市管理带来了极大的便利。本文将详细探讨二维码门楼牌管理…

STM32CubeMX实战教程: TIM6、TIM7 - 基本定时器

基本定时器的作用 基本定时器&#xff0c;主要用于实现定时和计数功能。作用包括&#xff1a; 定时功能&#xff1a;可以产生周期性的中断&#xff0c;用于实现定时任务。例如&#xff0c;可以设置一个定时器每隔一定时间&#xff08;如1秒&#xff09;产生一次中断&#xff0…

【Android移动开发】helloworld项目文件剖析

本文讨论了一个Android应用的Gradle项目的各个方面。涵盖了Gradle的启动脚本&#xff0c;项目的配置文件&#xff08;如build.gradle和gradle.properties&#xff09;&#xff0c;以及应用的源代码和资源文件。具体内容包括了项目结构、Gradle插件的配置、AndroidManifest.xml文…

mysql5.7配置主从

原理&#xff1a; MySQL主从复制的工作原理如下:1. 主服务器产生Binlog日志当主服务器的数据库发生数据修改操作时,如INSERT、UPDATE、DELETE语句执行,主服务器会记录这些操作的日志信息到二进制日志文件中。2. 从服务器读取Binlog日志 从服务器会向主服务器发送请求,主服务器把…

护眼灯真能护眼吗?保护视力必入的五款护眼台灯

自从入手了护眼台灯后&#xff0c;我深深感受到了它使用的便捷性和舒适性。它不仅为学习和工作环境提供了充足的光线&#xff0c;确保能在明亮的环境中专注于任务&#xff0c;而且其光线柔和&#xff0c;极大地减轻了对眼睛的压力。同时&#xff0c;护眼台灯的防蓝光措施做得相…

uniapp开发android原生插件

一、下载原生开发SDK Android 离线SDK - 正式版 | uni小程序SDK (dcloud.net.cn)、 https://nativesupport.dcloud.net.cn/AppDocs/download/android.html 将开发uniappa原生android的插件解压到ben本地目录&#xff0c;目录结构如下&#xff1a; 接下就可以使用 UniPlugin-Hel…

在 Linux 环境下安装 Kibana

目录 一、Kibana 是什么 二、在 Linux 环境下安装 Kibana 1、下载安装包 2、解压 3、修改 Kibana的配置文件 config/kibana.yml 4、启动 5、浏览器登录 Kibana 6、测试查询 一、Kibana 是什么 Kibana 是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进…