当前位置: 首页 > news >正文

数据结构---时间复杂度

专栏:数据结构
个人主页:HaiFan.
专栏简介:开学数据结构,接下来会慢慢坑新数据结构的内容!!!!

时间复杂度

  • 前言
  • 1.算法效率
    • 1.1如何衡量一个算法的好坏
    • 1.2算法的复杂度
  • 2.时间复杂度
    • 2.1大O的渐进表示法
    • 2.2实例
      • 1.常数次
      • 2.O(M+N)
      • 3.O(N)
      • 4.logN

前言

在这里插入图片描述

什么是数据结构

数据结构是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关系的数据与元素的集合

什么是算法

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果

1.算法效率

1.1如何衡量一个算法的好坏

比如以下的算区间和的代码

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int s[N];
int main()
{int n, m;cin >> n >> m;for (int i = 1; i <= n; i++){cin >> a[i];}while (m--){int l, r;cin >> l >> r;int sum = 0;for (int i = l; i <= r; i++){sum += a[i];}cout << sum << endl;}for (int i = 1; i <= n; i++){s[i] = s[i - 1] + a[i];}return 0;
}

实现这个区间和很简单,代码也很简洁,但是,简洁一定好吗?如何衡量代码的好与坏呢?

1.2算法的复杂度

举个例子:

小兰写了一个冒泡排序

小张写了一个快速排序

小兰和小张执行同一组数据,小兰花了3s,小张花了5s。

这样能说明冒泡排序的效率比快速排序的效率高吗?

答案是:不能的。


算法在编写成可执行程序后,运行时需要耗费时间资源和空间资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。

时间复杂度主要是用来衡量一个算法的运行快慢,

空间复杂度主要是用来衡量一个算法运行所需要的额外空间。

2.时间复杂度

时间复杂度:在计算机科学中,算法的时间复杂度是一个函数,他定量描述了该算法的运行时间,一个算法执行所耗费的时间,从理论上说是不能算出来的,只有把程序放在机器上跑起来,才知道,但是每个代码都需要进行一次测试吗?虽然可以,但会很麻烦,所以就有了时间复杂度这个分析方式,一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

#include <iostream>using namespace std;int main()
{int n;cin >> n;int ret = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){ret++;}}for (int i = 1; i <= n; i++){ret++;}int m = 100;while (m--){ret++;}cout << ret;return 0;
}

那么,这个代码中的ret共执行了多少次呢?

在代码开始,有一个双重循环,这个时候,ret++就执行了n*n次,后面又有一个循环,这个时候ret++执行了n次,最后又执行了m次ret++;

我们可以推出ret的次数:

F(n) = n*n + n + m

m是一个常数,表达式可以写成

F(n) = n * n + n + 100

  • n = 10 F(n) = 100+10+100=210
  • n = 100 F(n) = 100*100+100+100=1200

依次类推,当n特别大的时候,得到的函数值也是特别大的。


实际中,我们计算时间复杂度时,其实不一定要算执行次数,只需要计算大概执行次数,这就需要使用大O的渐进表示法

2.1大O的渐进表示法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。

推导大O阶方法

  1. 用1来取代运行时间中的所有加法常数
  2. 在修改后的运行次数函数中,只保留最高阶项。
  3. 如果最高阶项存在且不是1,则去除与这个项目相乘的常数,得到的结果就是大O阶

使用大O阶表示上面代码的时间复杂度:

O(N^2)

大O的渐进表示法去掉了那些对结果影响不大的项。


有些算法的时间复杂度存在最好,平均和最坏情况

最坏情况:任意输入规模的最大运行次数(上界)

平均情况:任意输入规模的期望运行次数

最好情况:任意输入规模的最小运行次数(下界) 例如:在一个长度为N数组中搜索一个数据x

最好情况:1次找到

最坏情况:N次找到

平均情况:N/2次找到

在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为O(N)

2.2实例

1.常数次

#include <iostream>using namespace std;int main()
{int cnt = 0;for (int i = 1; i <= 100; i++){cnt++;}cout << cnt;return 0;
}

这个代码非常的简单,时间复杂度也很好求,因为就一个循环,并且是常数次,所以时间复杂度就是O(1)

O(1)不是代表一次,而是常数次

2.O(M+N)

#include <iostream>using namespace std;int main()
{int N;int M;cin >> N >> M;for (int i = 0; i < N; i++){;}for (int i = 0; i < M; i++){;}return 0;
}

这个代码是两个循环,第一个循环次数是N次,第二个循环次数是M次,那么时间复杂度就是O(M+N)。

值得注意的是,如果M和N相等,那么时间复杂度就是O(N)

如果不相等,就要写成O(N+M)

3.O(N)

#include <iostream>using namespace std;int main()
{int N;cin >> N;int cnt = 0;for (int i = 0; i <= N * 2; i++){cnt++;}cout << cnt;return 0;
}

循环次数是N*2,时间复杂度就是O(N)把N前面的2给省略。

4.logN

二分查找又叫折半查找,

int l = 0;
int r = n - 1;
int mid = l + r >> 1;while (l < r)
{mid = l + r >> 1;if (a[mid] >= x){r = mid;}else{l = mid + 1;}
}

二分时间复杂度最好的情况就是第一次就找到了:O(1)

最坏情况:O(logN)(以2为底)

在以2为底的对数中,一般可以写成logN,其他的不能省略

二分的最坏情况时间复杂度为什么是logN呢?

因为每次查找都会缩小区间,查找几次,就除多少个2

N/2/2/2…/2=1

2^x=N

x=logN

相关文章:

数据结构---时间复杂度

专栏&#xff1a;数据结构 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;开学数据结构&#xff0c;接下来会慢慢坑新数据结构的内容&#xff01;&#xff01;&#xff01;&#xff01; 时间复杂度前言1.算法效率1.1如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1大…...

如何保证集合是线程安全的 ConcurrentHashMap如何实现高效地线程安全?

第10讲 | 如何保证集合是线程安全的? ConcurrentHashMap如何实现高效地线程安全&#xff1f; 我在之前两讲介绍了 Java 集合框架的典型容器类&#xff0c;它们绝大部分都不是线程安全的&#xff0c;仅有的线程安全实现&#xff0c;比如 Vector、Stack&#xff0c;在性能方面也…...

C++对象模型和this指针

成员变量和成员函数分开存储&#xff1a;基本概念&#xff1a;在C中&#xff0c;类内的成员变量和成员函数分开存储只有非静态成员变量才属于类的对象上每个空对象都会有一个独一无二的内存地址&#xff0c;所以&#xff0c;空对象占用内存空间的大小为1代码实现&#xff1a;#i…...

kubernetes教程 --Pod调度

Pod调度 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达某…...

功率放大器科普知识(晶体管功率放大器的注意事项)

虽然功率放大器是电子实验室的常用仪器&#xff0c;但是很多人对于它却没有清晰的认识&#xff0c;下面就让安泰电子来为大家介绍功率放大器的科普内容以及使用注意事项&#xff0c;希望大家可以对功率放大器有清晰的认识。功率放大器可以把输入信号的功率放大&#xff0c;以满…...

CentOS 7转化系统为阿里龙蜥Anolis OS 7

转载&#xff1a;原社区CentOS 7迁移Anolis OS 7迁移手册 一、注意事项 Anolis OS 7生态上和依赖管理上保持跟CentOS7.x兼容&#xff0c;一键式迁移脚本centos2anolis.py&#xff0c;实现CentOS7.x到Anolis OS 7的平滑迁移。 使用迁移脚本前需要注意如下事项&#xff1a; 迁…...

【快速复习】一文看懂 Mysql 核心存储 隔离级别 锁 MVCC 机制

一文看懂 Mysql 核心存储 & 隔离级别 & 锁 & MVCC 机制 Mysql InnoDB 引擎下核心存储 数据&索引存储 IBD 文件 mysql 实际存储采用 B 树结构。 B 树是一种多路搜索树&#xff0c;其搜索性能高于 B 树 所有叶节点在同一深度&#xff0c;保证搜索效率仅叶节…...

面试题----集合

概述 从上图可以看出&#xff0c;在Java 中除了以 Map 结尾的类之外&#xff0c; 其他类都实现了 Collection 接⼝。 并且&#xff0c;以 Map 结尾的类都实现了 Map 接⼝List,Set,Map List (对付顺序的好帮⼿)&#xff1a; 存储的元素是有序的、可重复的。 Set (注重独⼀⽆⼆…...

XSS注入基础入门篇

XSS注入基础入门篇1.XSS基础概念2. XSS的分类以及示例2.1 反射型XSS2.1.1 示例1&#xff1a;dvwa low 级别的反射型XSS2.1.2 攻击流程2.2 DOM型XSS2.2.1 示例2&#xff1a;DOM型XSS注入1.环境部署2.基础版本3.进阶绕过2.3 存储型XSS2.3.1 示例1&#xff1a;dvwa low示例2.3.2 攻…...

刷题 - 数据结构(二)链表

1. 链表 1.1 题目&#xff1a;合并两个有序链表 链表的建立与插入&#xff1a;关键在于留出头部&#xff0c;创建迭代指针。 ListNode* head new ListNode; // 通过new 创建了一个数据类型为ListNode的数据 并把该数据的地址赋值给ListNodeListNode* p 0; // 再创建一个数据…...

用于隔离PWM的光耦合器选择和使用

光耦合器&#xff08;或光隔离器&#xff09;是一种将电路电隔离的器件&#xff0c;不仅在隔离方面非常出色&#xff0c;而且允许您连接到具有不同接地层或在不同电压电平下工作的电路。光耦合器具有“故障安全”功能&#xff0c;因为如果受到高于最大额定值的电压&#xff0c;…...

面试完阿里,字节,腾讯的测试岗,复盘以及面试总结

前段时间由于某些原因辞职了&#xff0c;最近一直在面试。面试这段时间&#xff0c;经历过不同业务类型的公司&#xff08;电商、酒店出行、金融、新能源、银行&#xff09;&#xff0c;也遇到了很多不同类型的面试官。 参加完三家大厂的面试聊聊我对面试的一些看法&#xff0…...

分享一个外贸客户案例

春节期间一个外贸人收到了客户的回复&#xff0c;但因为自己的处理方式造成了一个又一个问题&#xff0c;我们可以从中学到一些技巧和知识。“上次意大利的客人询价后&#xff0c;一直没回复&#xff08;中间有打过电话&#xff0c;对方说口语不行&#xff0c;我写过邮件跟进过…...

【Kubernetes】第二篇 - 购买阿里云 ECS 实例

一&#xff0c;前言 上一篇&#xff0c;简单介绍了 CI/CD 的概念以及 ECS 服务规划&#xff0c;搭建整套服务需要三台服务器&#xff0c;配置如下&#xff1a; ECS 配置启动服务说明2核4GJenkins Nexus Dockerci-server2核4GDocker Kubernetesk8s-master1核1GDocker Kube…...

数影周报:据传国内45亿条快递数据泄露,聆心智能完成Pre-A轮融资

本周看点&#xff1a;据传国内45亿条快递数据泄露&#xff1b;消息称微软解雇150 名云服务销售&#xff1b;消息称TikTok计划在欧洲再开两个数据中心&#xff1b;衣服长时间放购物车被淘宝客服嘲讽&#xff1b;聆心智能完成Pre-A轮融资......数据安全那些事据传国内45亿条快递数…...

Leetcode力扣秋招刷题路-0073

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;mat…...

遥感数字图像处理

遥感数字图像处理 来源&#xff1a;慕课北京师范大学朱文泉老师的课程 遥感应用&#xff1a;遥感制图、信息提取 短期内了解知识结构–>有选择的剖析经典算法原理–>系统化知识结构、并尝试实践应用 跳出算法&#xff08;尤其是数学公式&#xff09; 关注原理及解决问…...

深度学习常用的python函数(一)

由于我只简单的学过python和pytorch&#xff0c;其中有很多函数的操作都还是一知半解的&#xff0c;其中有些函数经常见到&#xff0c;所以就打算记录下来。 1.zip zip(*a):针对单个可迭代对象压缩成n个元组&#xff0c;元组数量n等于min(a中元素的最小长度) a [(1, 2), (3…...

2023年美国大学生数学建模A题:受干旱影响的植物群落建模详解+模型代码(一)

目录 前言 一、题目理解 背景 解析&#xff1a; 要求 二、建模 1.相关性分析 2.相关特征权重 只希望各位以后遇到建模比赛可以艾特认识一下我&#xff0c;我可以提供免费的思路和部分源码&#xff0c;以后的数模比赛只要我还有时间肯定会第一时间写出免费开源思路&…...

PPS文件如何转换成PPT?附两种方法

在工作中&#xff0c;PPS文件的使用还是很广泛的&#xff0c;因为作为幻灯片放映文件&#xff0c;点击后就能直接播放&#xff0c;十分方便。但如果想要修改PPS里的内容&#xff0c;PPS是无法编辑的&#xff0c;我们需要把文件转换成PPT&#xff0c;再进行修改。 那PPS文件如何…...

如何让经典游戏完美运行在现代Windows系统:DDrawCompat高效解决方案全指南

如何让经典游戏完美运行在现代Windows系统&#xff1a;DDrawCompat高效解决方案全指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/g…...

4个强力技巧:Squirrel-RIFE开源工具视频增强全指南

4个强力技巧&#xff1a;Squirrel-RIFE开源工具视频增强全指南 【免费下载链接】Squirrel-RIFE 项目地址: https://gitcode.com/gh_mirrors/sq/Squirrel-RIFE Squirrel-RIFE&#xff08;简称SVFI&#xff09;是一款基于AI技术的开源视频补帧工具&#xff0c;通过在原始…...

小米多看电纸书刷机全攻略:从墨案系统回退到原厂固件的保姆级教程

小米多看电纸书系统恢复指南&#xff1a;从第三方固件回归官方体验 作为一名长期使用电子墨水设备的深度用户&#xff0c;我完全理解那种尝试新系统后又怀念原厂体验的矛盾心理。去年冬天&#xff0c;我的小米多看电纸书也经历了从墨案系统回退到官方固件的完整过程&#xff0c…...

Windows 10下Cesium Terrain Builder编译踩坑实录(VS2015+GDAL环境配置)

Windows 10下Cesium Terrain Builder编译实战指南&#xff08;VS2015GDAL环境配置&#xff09; 在三维GIS开发领域&#xff0c;Cesium Terrain Builder&#xff08;CTB&#xff09;作为生成量化网格地形瓦片的核心工具&#xff0c;其编译过程却常让开发者望而生畏。特别是在Win…...

2026最新Java岗位从P5-P7的成长面试进阶资源分享!

Java岗位从P5到P7的成长路径P5到P7是Java开发者从初级到高级的关键阶段&#xff0c;需要技术深度、系统设计能力和项目经验的全面提升。以下是分阶段的资源推荐和成长建议。P5&#xff08;初级工程师&#xff09;阶段核心能力要求&#xff1a;基础语法、框架使用、简单业务开发…...

vue-sonner:轻量级Vue通知组件的高效集成方案

vue-sonner&#xff1a;轻量级Vue通知组件的高效集成方案 【免费下载链接】vue-sonner &#x1f514; An opinionated toast component for Vue. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-sonner 项目概述 vue-sonner是一个为Vue和Nuxt应用设计的轻量级通知组…...

QMCDecode:免费解锁QQ音乐加密文件的终极解决方案

QMCDecode&#xff1a;免费解锁QQ音乐加密文件的终极解决方案 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结…...

STM32WU55蓝牙开发避坑指南:从官方例程到8通道肌电信号传输实战

STM32WU55蓝牙开发避坑指南&#xff1a;从官方例程到8通道肌电信号传输实战 当肌电信号采集遇上低功耗蓝牙&#xff0c;工程师们往往面临一个尴尬的平衡&#xff1a;既要满足医疗级数据精度&#xff0c;又要兼顾穿戴设备的续航需求。STM32WU55系列以其双核架构和集成射频模块&a…...

绝区零一条龙自动化工具:从机械操作到智能游戏的进化指南

绝区零一条龙自动化工具&#xff1a;从机械操作到智能游戏的进化指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon 当你第…...

照着用就行:全学科适配的降AIGC工具 千笔·专业降AI率智能体 VS PaperRed 一站式解决降重难题

随着AI技术的迅猛发展&#xff0c;学术写作中对AI生成内容的识别能力也在不断提升&#xff0c;许多学生和研究者发现&#xff0c;原本依赖AI辅助撰写的论文&#xff0c;如今在查重系统中频频被标记出高AIGC率&#xff0c;甚至影响最终成绩。这种现象不仅让许多人措手不及&#…...