数据结构01——时间复杂度和空间复杂度
一.什么是数据结构数据结构(Data Structure)是计算机存储、组织数据的方式指相互之间存在⼀种或多种特定关系的数据集合。不存在一种通用的数据结构针对于所有应用场景所以产生了多种多样的数据结构来适配不同的环境例如顺序表、链表、堆栈、二叉树、队列等二.算法算法(Algorithim)是定义良好的计算过程指的是针对一个或一组输出经过该算法后产生一个或着多个输出的中间过程。而评判算法优劣的其中一个因素就是时间复杂度和空间复杂度以力扣189旋转数组为例给定了一个需要右旋的数组以及右旋的次数最简单的方法即是将最后一个下标的元素取出放入中间变量tmp其余元素依次右移一个下标共循环k次即可。根据思路写出代码void rotate(int* nums, int numsSize, int k) {int i 0;for(i0;ik;i)//每次往右挪一个数循环k次。{int tmp nums[numsSize-1];int j 0;for(jnumsSize-1;j0;j--){nums[j]nums[j-1];}nums[0]tmp;}}运行可以发现两个测试用例可以通过但是提交却发现检查代码发现没有出现死循环的情况 那应该确实是代码运行时间超出了系统规定的时间。根据此案例引出今天的主题——时间复杂度和空间复杂度三.复杂度在代码写好后运行则需要消耗时间资源和空间(内存)资源因此衡量一个算法的好坏是根据时间和空间来衡量的3.1时间复杂度在计算机科学中定义时间复杂度为函数式T(N)。它描述的是算法的运行时间随变量不同而发生变化的一种趋势它并不是实际的运行时间而是一种趋势。要理解清楚它不是具体的某个值而是一种趋势。首先提出表示时间复杂度的方法然后根据具体案例分析如何应用这个方法计算时间复杂度表示时间复杂度的方法为大O渐进法。其具体规则为1.时间复杂度函数式T(N)中只保留最高阶项去掉那些低阶项因为当N不断变大时低阶项对结果影响越来越⼩当N无穷大时就可以忽略不计了。2.如果最⾼阶项存在且不是1则去除这个项⽬的常数系数因为当N不断变⼤这个系数对结果影响越来越小当N无穷大时就可以忽略不计了。3.T(N)中如果没有N相关的项⽬只有常数项用常数1取代所有加法常数。接下来结合具体代码案例并应用上述的三个规则来计算时间复杂度void Func1(int N){int count 0;for (int k 0; k 2 * N ; k){count;}int M 10;while (M--){count;}printf(%d\n, count);}首先看这个代码的for循环中出现了变量Nwhile循环中虽然也出现了变量M但其为定值循环10次大致可以写为O(N10)而根据第一条规则只保留高阶项最后答案是O(N)。再来看第二个例子void Func2(int N, int M) {int count 0;for (int k 0; k M; k) {count;}for (int k 0; k N; k) {count;}printf(%d\n, count);}这段代码定义了两个变量N和M又进行了两个for循环分别循环N次和M次所以其时间复杂度为O(MN)如果MNN就可以忽略不计O(M)同理如果NMM忽略不计O(N)。void Func3(int N) {int count 0;for (int k 0; k 100; k) {count;}printf(%d\n, count);}在Fun3这个函数例子中并没有出现关于N变量的循环等操作所以其时间复杂度为一个常数而对于常数根据第三条规则将其写作O(1)。const char* strchr(const char* str, int character) {const char* p_begin s;while (*p_begin ! character) {if (*p_begin \0)return NULL;p_begin;}return p_begin;}对于strchr这个函数仔细观看出现的while循环则会发现它的时间复杂度取决于这个while循环而while循环中似乎不是一个可以明确说出循环多少次的变量是根据要查找的character有关。运气好的话第一个是时间复杂度为O(1)运气不好的话最后一个是其时间复杂度为字符串的长度O(N)但 O(N)也就是最坏的情况了如果最坏情怀下都能满足要求那其它情况肯定能满足要求。所以对于分类讨论的情况就按照最坏的情况。void BubbleSort(int* a, int n) {assert(a);for (size_t end n; end 0; --end) {int exchange 0;for (size_t i 1; i end; i) {if (a[i - 1] a[i]) {Swap(a[i - 1], a[i]);exchange 1;}}if (exchange 0)break;}}这段代码的特点是外层循环和内层循环的次数不相同随着循环次数的变化内层循环的次数也会发生相应变化 。先尝试枚举 格式如下 (外层)第n次(内层)循环x次 。 第一次n-1第二次n-2第三次n-3 ------第n-1次1 。把总循环次数加起来则为可看出是等差数列求和则为 根据大O渐进法第二条规则时间复杂度为O(N^2)。void func5(int n) {int cnt 1;while (cnt n) {cnt * 2;}}fun5这段代码较为简单while循环的终止条件是n内部则为每次×2相当于数出来需要2的多少次相乘就会大于n其实就是对数函数的形式。而当n接近无穷大时对数函数的底数对于其影响并不大所以在表示时间复杂度时都将其统一写成。long long Fac(size_t N) {if (N 0)return 1;return Fac(N - 1) * N;}最后考虑到递归的情况递归的时间复杂度 单次时间复杂度*递归次数。对于上述阶乘递归单次时间复杂度为1共递归n次最后时间复杂度为O(n)。3.2空间复杂度空间复杂度的定义为在一个运算执行的过程中有多少额外开辟的空间。计算规则也是大O渐进法的三条规。函数运⾏时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好了因 此空间复杂度主要通过函数在运⾏时候显式申请的额外空间来确定。void BubbleSort(int* a, int n) {assert(a);for (size_t end n; end 0; --end) {int exchange 0;for (size_t i 1; i end; i) {if (a[i - 1] a[i]) {Swap(a[i - 1], a[i]);exchange 1;}}if (exchange 0)break;}}例如这段代码 在函数运行过程中额外开辟的空间只有int exchange 和size_t 为常数所以空间复杂度为O(1)。而对于fun5的递归来说空间复杂度 单次运行的空间复杂度* 递归次数单次递归的空间复杂度为O(1)共有n次所以总的空间复杂度为O(N);下述是两张常见复杂度的图再次回到开头的题目实例如果用依次向后移动的方法其时间复杂度为O(N^2)而题目中提供的元素个数最多为10^5总时间为10^10ms相当于10^7s会超过时间限制。下述提供两种可通过的解题思路1.void rotate(int* nums, int numsSize, int k) {// 把创建一个新数组把要取下来的数放到新数组里排好后整体放入原数组int arr[numsSize];int i 0;for(i0;inumsSize;i){arr[(ik)%numsSize] nums[i];}for(i0;inumsSize;i){nums[i]arr[i];}}整体思路为创建一个新数组将需要移动的元素放入数组的相应位置然后整体将原数组替换。2.void rotate(int* nums, int numsSize, int k) {// 分段旋转整体逆序if (k numsSize)k % numsSize;int left numsSize - k;int right numsSize - 1;while (left right) {int tmp nums[left];nums[left] nums[right];nums[right] tmp;left;right--;}left 0;right numsSize - 1 - k;while (left right) {int tmp nums[left];nums[left] nums[right];nums[right] tmp;left;right--;}left 0;right numsSize - 1;while (left right) {int tmp nums[left];nums[left] nums[right];nums[right] tmp;left;right--;}}这个思路为将最后k个需要移动的元素进行逆序剩下的元素逆序然后整体逆序 。

相关新闻

多头注意力中的张量重塑

多头注意力中的张量重塑

2026/7/8 9:43:36 阅读更多 →
attn_scores注意力分计算-记录

attn_scores注意力分计算-记录

2026/7/8 15:29:19 阅读更多 →
第二周作业wp

第二周作业wp

2026/7/6 8:59:31 阅读更多 →

最新新闻

让ChatBI在企业内可信落地:数据治理专家的五道审查清单

让ChatBI在企业内可信落地:数据治理专家的五道审查清单

导语 同一个季度、同一个"销售额",业务负责人打开ChatBI问了三次,得到了三个答案:财务口径的确认收入、销售口径的签单金额、运营口径的到账流水。三个数字都"没错",但业务方该信哪一个?如果这样的…

2026/7/9 7:51:56 阅读更多 →
Vue Vben Admin 5.0:现代中后台架构的技术深度解析与实战指南

Vue Vben Admin 5.0:现代中后台架构的技术深度解析与实战指南

Vue Vben Admin 5.0:现代中后台架构的技术深度解析与实战指南 【免费下载链接】vue-vben-admin A modern vue admin panel built with Vue3, Shadcn UI, Vite, TypeScript, and Monorepo. Its fast! 项目地址: https://gitcode.com/GitHub_Trending/vu/vue-vben-a…

2026/7/9 7:51:56 阅读更多 →
3分钟开启Unity游戏自动翻译:XUnity Auto Translator完整指南

3分钟开启Unity游戏自动翻译:XUnity Auto Translator完整指南

3分钟开启Unity游戏自动翻译:XUnity Auto Translator完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而放弃了一款优秀的Unity游戏?面对日语、韩语…

2026/7/9 7:49:55 阅读更多 →
IACheck 搭载 AI 报告审核通审 Agent 版:拆解检测报告智能审核两大核心技术,适配 2026 行业强监管合规要求

IACheck 搭载 AI 报告审核通审 Agent 版:拆解检测报告智能审核两大核心技术,适配 2026 行业强监管合规要求

一、行业监管收紧,人工审核模式彻底迎来能力天花板2026 年检验检测行业监管体系迎来系统性升级,市场监管总局 “一单一库” 资质管理落地、《检验检测从业人员监督管理工作指引》正式施行,明确谁签字、谁担责终身追责机制,CNAS 开…

2026/7/9 7:49:55 阅读更多 →
为什么 I2C 必须用 OD 开漏?

为什么 I2C 必须用 OD 开漏?

OD 详细解析(结合你这张 I2C 引脚表) 1. OD 全称:Open Drain,开漏输出 不是单纯 “数字输出”,是特殊的 IO 电路结构,和普通推挽输出(Push-Pull)完全区分开。 核心电路原理 模组内部引脚只做下拉通路:内部 MOS 导通时,引脚拉到 GND(低电平); 内部 MOS 关断时,…

2026/7/9 7:49:55 阅读更多 →
Okbiye|毕业文稿专属创作通道,一站式毕业论文功能全维度拆解

Okbiye|毕业文稿专属创作通道,一站式毕业论文功能全维度拆解

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 一、独立毕业论文专属分区,打造定向学术创作入口 平台左侧导航栏划分多条学术创作赛道,毕业论文板块标注热门标识…

2026/7/9 7:47:55 阅读更多 →

日新闻

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南

3大音乐平台逐字歌词完整解决方案:ESLyric-LyricsSource完全指南 【免费下载链接】ESLyric-LyricsSource Advanced lyrics source for ESLyric in foobar2000 项目地址: https://gitcode.com/gh_mirrors/es/ESLyric-LyricsSource 还在为Foobar2000找不到高质…

2026/7/9 0:01:04 阅读更多 →
ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍

ElegantBook封面定制揭秘:3个步骤打造专业级学术书籍 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook 你是否曾经为学术书籍的封面设计而烦恼?想要一个既专业又美观的封…

2026/7/9 0:03:06 阅读更多 →
如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南

如何高效使用pyodbc:企业级数据库连接终极指南 【免费下载链接】pyodbc Python ODBC bridge 项目地址: https://gitcode.com/gh_mirrors/py/pyodbc 在当今数据驱动的商业环境中,企业级数据库连接已成为现代应用开发的核心需求。pyodbc作为一款强大…

2026/7/9 0:07:11 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/8 16:14:06 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/8 16:59:55 阅读更多 →

月新闻