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

 🐓 时间复杂度

常用排序的时间复杂度

时间频度

算法需要花费的时间,和它语句执行的次数是成正比的,所以会把一个算法种语句执行次数称为语句频度和时间频度、记作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ⁿ)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware安装DOS 7.1

VMware安装DOS 7.1 helpfasthelpdoshelp

【重温设计模式】职责链模式及其Java示例

职责链模式的介绍 在开发过程中&#xff0c;我们经常会遇到这样的问题&#xff1a;一个请求需要经过多个对象的处理&#xff0c;但是我们并不知道具体由哪个对象来处理&#xff0c;或者说&#xff0c;我们希望由接收到请求的对象自己去决定如何处理或者是将请求传递给下一个对…

mysql学习笔记7——索引与联合查询,引擎与字符编码

索引相当于给数据库加了个目录&#xff0c;加入索引可以优化查询速度 添加主键可以 增加索引 添加普通索引&#xff0c;普通索引没有其他约束效果 在mysql中可以将查询出的结果插入新表中 联合查询 在mysql对文件读写中存在两种引擎&#xff0c;innodb与myisam&#xff0c;其中…

【自然语言处理】NLP入门(三):1、正则表达式与Python中的实现(3):字符转义符及进制转换

文章目录 一、前言二、正则表达式与Python中的实现1.字符串构造2. 字符串截取3. 字符串格式化输出4. 字符转义符a. 常用字符转义符续行符换行符制表符双引号单引号反斜杠符号回车符退格符 b. ASCII编码转义字符进制转换2 进制8 进制10 进制16 进制进制转换函数 c. Unicode字符\…

关于淘宝的nodejs镜像网址更新后,前端项目出现的一系列问题解决方案。

问题 npm install&#xff0c;之前是成功的&#xff0c;最近不成功。 原因 之前的npm.taobao.org镜像源已经停用 解决方法 把所有的npm.taobao.org替换成npmmirror.com&#xff0c;这个新的淘宝镜像地址 如果使用nvm(没有忽略)需要修改如下&#xff1a; nvm node_mirror…

文字写作困扰?这6款AI写作助手帮你一键解决

有时候写作的时候我们可能会陷入创作困境&#xff0c;思绪纷乱&#xff0c;难以找到合适的表达方式。在此小编特别为大家推荐一些外非常好用的 AI 写作助手&#xff0c;帮助你克服这些问题。让我们来看看其中的6款软件&#xff1a; 1、爱制作AI写作生成器 爱制作AI主要功能是协…

第12届智能计算与无线光通信国际会议(ICWOC 2024)即将召开!

2024年第12届智能计算与无线光通信国际会议&#xff08;ICWOC 2024&#xff09;将于2024年6月21-23日在中国重庆召开。随着深度学习等人工智能技术的不断进步&#xff0c;以自动化、自治为特征的智能应用预计将激增。本届会议主题为“光通信智能链接”&#xff0c;旨在为相关技…

js script中的defer和async

在HTML中&#xff0c;<script>标签可以使用async和defer两个属性来控制外部JavaScript文件的加载和执行方式。这两个属性的目的是优化页面加载时间&#xff0c;但它们以不同的方式工作。下面是每个属性的具体说明&#xff1a; async属性 当你给<script>标签添加a…

经典思路!人参叶际微生物如何发8分文章?

中国中医科学院中药研究所在《Environmental Microbiome》期刊上(IF7.9)发表了关于叶际真菌微生态网络的文章&#xff0c;该研究通过对ITS测序结果和环境因子测定结果以及皂苷含量测定结果进行生信分析&#xff0c;提出了维持微生态网络的稳定性策略和影响皂苷含量的因素。 期刊…

还在用微信截图吗?这2个免费软件你不能错过

大家好&#xff0c;我是知微&#xff01; 说到截图&#xff0c;大家会想到哪款软件呢&#xff0c;是windows系统自带的截图软件&#xff0c;还是登录微信后按AltA触发截图功能&#xff1f; 很多人平时都在使用微信或者QQ截图&#xff0c;但是这种每次都得联网登录才能使用&am…

unity-1

创建游戏对象&#xff08;游戏物体&#xff09; 可通过unity中的菜单栏中的Gameobject创建&#xff1b;也可在Hierarchy&#xff08;层级&#xff09;中创建&#xff0c; 双击即可居中看到。 在Hierarchy空白处右键即可看到&#xff0c;能创建游戏对象。 在Scene框中&#x…

驱动开发面试复习

创建字符设备 1 创建设备号 alloc_chrdev_region 2.创建cdev cdev_init 3.添加一个 cdev,完成字符设备注册到内核 cdev_add 4.创建类 class_create 5.创建设备 device_create 1.内核空间与用户空间数据 copy_from_user 和copy_to_user 俩个函数来完成。 copy_from_user 函数…

论文阅读-高效构建检查点

论文标题&#xff1a;On Efficient Constructions of Checkpoints 摘要 高效构建检查点/快照是训练和诊断深度学习模型的关键工具。在本文中&#xff0c;我们提出了一种适用于检查点构建的有损压缩方案&#xff08;称为LC-Checkpoint&#xff09;。LC-Checkpoint同时最大化了…

C#,机器学习的KNN(K Nearest Neighbour)算法与源代码

1 K最邻近法 KNN&#xff08;K- Nearest Neighbor&#xff09;法即K最邻近法&#xff0c;最初由 Cover和Hart于1968年提出&#xff0c;是一个理论上比较成熟的方法&#xff0c;也是最简单的机器学习算法之一。该方法的思路非常简单直观&#xff1a;如果一个样本在特征空间中的…

ET系列手持如何在仓储管理精准出彩!

在仓储行业&#xff0c;公司一般依靠纸质文档来纪录和追踪出入的货品&#xff0c;以员工的记忆力来执行库房管理。这种非自动化管理方式很容易因为人为失误而造成生产率低下&#xff0c;同时也大大浪费人力资源。另外&#xff0c;伴随着货品数量的a增加和出入库房頻率的大幅度提…

模糊搜索小案例

C#窗体实现数据录入与模糊搜索小案例 记录一下 主要代码 private void button1_Click(object sender, EventArgs e){string name textBox1.Text;string hometown textBox4.Text;string school textBox6.Text;string sex textBox5.Text;string lat textBox3.Text;string …

【Git】深入理解 Git 分支合并操作:git merge dev 命令详解

深入理解 Git 合并操作&#xff1a;git merge dev 命令详解 摘要&#xff1a;本文将深入探讨 Git 中的合并操作&#xff0c;以及如何使用 git merge dev 命令将dev 分支的修改合并到当前分支&#xff08;假设当前分支为main 分支&#xff09;中。通过详细的解释和示意图&#x…

A Brief Introduction of the Violin Plot and Box Plot

DateAuthorVersionNote2024.03.03Dog TaoV1.0Release the note. 文章目录 A Brief Introduction of the Violin Plot and Box PlotBox PlotViolin PlotHistogram with Error BarComparisonExample 1Example 2 A Brief Introduction of the Violin Plot and Box Plot Box Plot …

java-幂等性

幂等性 1.1幂等性定义&#xff1a; 在计算机领域中&#xff0c;幂等&#xff08;Idempotence&#xff09;是指任意一个操作的多次执行总是能获得相同的结果&#xff0c;不会对系统状态产生额外影响。在Java后端开发中&#xff0c;幂等性的实现通常通过确保方法或服务调用的结…

智慧城市中的数字孪生:数字孪生技术助力智慧城市提高公共服务水平

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、智慧交通管理 2、智慧能源管理 3、智慧环保管理 4、智慧公共安全 四、数字孪生技术助力智慧城市提高公共服务水平的价值 五、挑战与前景 六、结论 一、引言 随着信息技术的飞速发展&…