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

时间复杂度讲解

一、基础概念数据结构是计算机存储、组织数据的方式指相互之间存在一种或多种特定关系的数据元素的集合。而算法是定义良好的计算过程简单来说就是将输入转化为输出的一系列计算步骤。我们用复杂度来衡量算法的优劣。复杂度分为时间复杂度算法在时间上的效率和空间复杂度算法在空间上的效率。我们更加关注时间复杂度因为现在计算机的存储容量很大不需要特别担心空间复杂度。在计算机科学中算法的时间复杂度是一个函数它计算的是算法中基本操作的执行次数。我们用大O的渐进表示法来大概估算算法的时间复杂度。比如O(N)、O(N^2)、O(N^3)等。这个表示方法只表示了最高次项因为最高次项对算法时间复杂度的影响最大。N很小的时候没有比较的意义因为CPU跑得很快。有多快写个程序验证一下#define _CRT_SECURE_NO_WARNINGS #include stdio.h int main() { int begin1 clock(); int n 100000000; int i 0; int x 10; for (i 0; i n; i) { x; } int end1 clock(); printf(%d\n, x); printf(%dms\n, end1 - begin1); int begin2 clock(); n 1000000; i 0; x 10; for (i 0; i n; i) { x; } int end2 clock(); printf(%d\n, x); printf(%dms\n, end2 - begin2); return 0; }可见在Debug模式下循环中的语句执行1亿次只用了26毫秒而执行一百万次只用了不到1毫秒。如果改成Release模式呢可见程序运行速度非常之快。常见的时间复杂度的量级有以下这些5201314O(1)常数阶3n4O(n)线性阶3n^24n5O(n^2)平方阶3log(2)n4O(logn)对数阶2n3nlog(2)n14O(nlogn)nlogn阶n^32n^24n6O(n^3)立方阶2^nO(2^n)指数阶有些算法的事件复杂度存在最好、平均和最坏情况最坏情况指的是任意输入规模的最大运行次数平均情况是任意输入规模的期望运行次数最好情况是任意输入规模下的最小运行次数。比如在一个长度为N的数组中搜索一个数据x最好的情况是1次找到最坏情况是N次找到平均情况是N/2次找到。实际情况中一般关注的是算法的最坏运行情况所以数组中搜索数据的时间复杂度为O(N)。二、例题下面用两道leetcode面试题理解一下时间复杂度的概念。第一个思路是先排序再依次查找如果下一个值不等于前一个值1那么就找到了消失的数据。用冒泡排序肯定是不行因为它的时间复杂度是O(N)。快速排序也不行时间复杂度是O(N*logN)。第二个思路是0-N求和再依次减去数组中的值剩下的那个值就是消失的数字。这一思路是可以让时间复杂度达到O(N)的。这个思路的缺点是如果N太大会发生溢出的情况。int missingNumber(int* nums, int numsSize) { int N numsSize; int ret 0; ret (0N)*(N1)/2; for(int i 0;inumsSize;i) { ret - nums[i]; } return ret; }第三个思路是利用按位异或。0按位异或任何数都是这个数本身任何数按位异或自己都是0按位异或运算符合结合律。所以我们把数组中的所有数都按位异或一遍再把0-N的所有数都按位异或一遍重复出现的数全都变成0最后剩下的就是那个缺失的数字。int missingNumber(int* nums, int numsSize) { int x 0; for(int i 0;inumsSize;i) { x ^ nums[i]; } for(int j 0; j numsSize;j) { x ^ j; } return x; }这样我们就达到了时间复杂度的要求。再来一道这道题如果采用最简单暴力的方法一次轮转1个位置那么最少轮换0次最多轮换(N-1)次时间复杂度是O(N^2)。void rotate(int* nums, int numsSize, int k) { k % numsSize; while(k--) { int tmp nums[numsSize-1]; for(int inumsSize-2;i0;i--) { nums[i1]nums[i]; } nums[0]tmp; } }这样是可以达到目的的但是这个算法超过时间限制在leetcode提交是过不了的。怎么才能过呢我们采用“三段逆置”的思路void swap(int* a, int* b) { int t *a; *a *b; *b t; } void reverse(int* nums, int start, int end) { while (start end) { swap(nums[start], nums[end]); start 1; end - 1; } } void rotate(int* nums, int numsSize, int k) { k % numsSize; reverse(nums, 0, numsSize - k - 1); reverse(nums, numsSize - k, numsSize - 1); reverse(nums, 0, numsSize - 1); }这样时间复杂度就是O(N)是可以通过的。三、一些比较复杂的时间复杂度void fun(int n) { int x 0; for (int i 1; i n; i * 2) { x; } printf(%d\n,x); } int main() { fun(8); fun(1024); return 0; }2^x N 因此以上这段代码的复杂度是O(logN)。为了方便时间复杂度中以2为底时底数可以省略其他底数也很少出现再来看看二分查找算法int binarySearch(int* nums, int x, int n) { assert(nums); int start 0; int end n - 1; while (start end) { int mid start ((end - start) 1); if (x nums[mid]) { start mid1; } else if (x nums[mid]) { end mid-1; } else { return mid; } } return -1; } int main() { int nums[] { 1,2,3,4,5,6,7,8,9 }; int find binarySearch(nums, 5, 9); printf(%d\n, find); return 0; }最坏的情况是缩小到区间只有一个元素或者没有找到此时x log2N。所以这个算法的时间复杂度也是O(logN)。二分查找因为时间复杂度低的特性可以在巨量数据中快速找到要找的那个。但是它只适用于有序数组结构意味着想要插入或删除时需要挪动数据很不方便。因此二分查找在实际中很少使用。END

相关文章:

时间复杂度讲解

一、基础概念数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。而算法是定义良好的计算过程,简单来说就是将输入转化为输出的一系列计算步骤。我们用复杂度来衡量算法的优劣。复杂度分为时间复杂度(…...

Oumuamua-7b-RP惊艳表现:在用户插入英语单词时自动切换混合语应答模式

Oumuamua-7b-RP惊艳表现:在用户插入英语单词时自动切换混合语应答模式 1. 项目概述 Oumuamua-7b-RP 是一款基于Mistral-7B架构的日语角色扮演专用大语言模型Web界面,专为沉浸式角色对话体验设计。这个模型最令人惊艳的功能是能够智能识别用户输入中的英…...

写代码时频繁打喷嚏?别信“有人想你”,这是身体系统的预警日志

写代码时频繁打喷嚏?别信“有人想你”,这是身体系统的预警日志 专栏链接:匠身颐和 作者:培风图南以星河揽胜 技以匠心,身以颐和。穷源溯流,昂霄耸壑;至道嘉猷,静水流深。 前言 作为…...

Oumuamua-7b-RP步骤详解:Web UI中调整Top-k=30提升角色专注度实操

Oumuamua-7b-RP步骤详解:Web UI中调整Top-k30提升角色专注度实操 1. 项目概述 Oumuamua-7b-RP 是一款专为日语角色扮演对话设计的Web界面大语言模型,基于Mistral-7B架构开发。这个工具特别适合想要体验沉浸式日语角色对话的用户,通过简单的…...

终极指南:3步掌握哔哩下载姬,轻松获取8K超清B站视频

终极指南:3步掌握哔哩下载姬,轻松获取8K超清B站视频 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印…...

RISC-V微架构侧信道攻击检测技术解析

1. RISC-V微架构侧信道攻击检测技术解析 在开源指令集架构RISC-V快速普及的背景下,其微架构安全问题日益凸显。最近我在使用gem5仿真器研究RISC-V处理器时,发现了一种名为FlushFault的微架构侧信道攻击,这种攻击通过操纵指令缓存状态和异常处…...

给汽车电子工程师的AURIX安全手册:ISO 26262 ASIL D合规,从硬件锁步到软件库的实战指南

AURIX安全架构深度实战:从硬件锁步到软件库的ASIL D合规指南 对于汽车电子工程师而言,功能安全从来不是选择题,而是必答题。当你的项目需要满足ISO 26262 ASIL D这一汽车行业最高安全等级时,英飞凌AURIX™ TC2xx/TC3xx系列MCU提供…...

双目客流统计摄像头,优化效率!

客流统计是食堂/餐厅优化运营效率的关键,但传统的人工统计方式不仅易出错,而且统计维度单一,像顾客停留时间、动线轨迹等无法统计出来。如今,食堂/餐厅双目客流统计摄像头系统,已经成了众多现代餐厅的标配,…...

SPIFFS 组件介绍

简介 在嵌入式应用中,将文件(如配置文件、网页资源或固件数据)存储在 Flash 中是一种非常常见的需求。基于原始 SPIFFS 项目,ESP-IDF 中的 SPIFFS 组件为 SPI NOR Flash 提供了一个轻量级文件系统:它支持磨损均衡、一…...

WeDLM-7B-Base模型微调入门:使用自定义数据集提升领域表现

WeDLM-7B-Base模型微调入门:使用自定义数据集提升领域表现 1. 前言:为什么要微调大模型? 大语言模型虽然能力强大,但在特定领域的表现往往不尽如人意。比如让通用模型处理医疗报告或法律文书时,它可能会产生不够专业…...

论文排版神器Paperidea,一键搞定格式烦恼

Paperidea 论文自动改格式工具重磅登场,全程免费、高效便捷、格式精准,以创新的“范文复刻”逻辑,帮你一键搞定论文排版,实现 100%“范文化”。毕业季最让人头疼的事,莫过于论文内容过关,却栽在格式上——熬…...

Windows Subsystem for Android技术架构解析与开发者实践

Windows Subsystem for Android技术架构解析与开发者实践 【免费下载链接】WSA Developer-related issues and feature requests for Windows Subsystem for Android 项目地址: https://gitcode.com/gh_mirrors/ws/WSA Windows Subsystem for Android(WSA&am…...

PyTorch实现LeNet5手写数字识别实战指南

1. 项目概述:手写数字识别与LeNet5的经典组合在计算机视觉领域,手写数字识别一直被视为"Hello World"级别的入门项目。这个看似简单的任务背后,却涵盖了图像分类问题的完整技术链条。我选择用经典的LeNet5架构配合PyTorch框架实现这…...

uniapp支付宝 H5 开发踩坑,hash模式下取参要规范!

一、背景在 uni-app 开发支付宝内嵌 H5 业务时,由于页面获取参数不规范导致页面跳转异常、参数丢失或解析报错,测试表现为白屏//❌错误写法 let tmp decodeURIComponent(location.href) let dataObj JSON.parse(tmp.split()[1])这种取法非常基础,没有考虑到多个参…...

TI AWR1843点云数据太稀疏?手把手教你调优cfg参数,让雷达‘看得’更清楚

TI AWR1843点云数据调优实战:从稀疏到密集的毫米波雷达参数配置指南 毫米波雷达在自动驾驶、工业检测和智能安防等领域展现出独特优势,而TI AWR1843作为业界热门设备,其点云数据质量直接影响感知算法的效果。很多开发者在初步跑通Demo后&…...

微信小程序中实现趋势(折线)面积组合图

一、小程序中实现,面积图的绘制,使用canvas进行绘制渲染(从左到右的渲染动画)二、面积图封装组件【完整代码】 Component({properties: {title: {type: String,value: },chartData: {type: Object,value: {xAxis: [],yAxis: [],va…...

099_神经渲染之NeRF:其概念,其实现原理,其适用的场景,常见的应用,以及未来布局的产业和市场,以及涉及

神经渲染革命:一文读懂NeRF的核心原理、应用与未来 引言 想象一下,仅用几张普通照片,就能生成一个可以从任意角度浏览、光影逼真的3D场景。这不再是科幻电影的桥段,而是神经辐射场(NeRF) 技术带来的革命。…...

PyTorch 2.8镜像代码实例:调用torch.compile加速ViT模型推理实测

PyTorch 2.8镜像代码实例:调用torch.compile加速ViT模型推理实测 1. 环境准备与快速验证 在开始之前,让我们先确认环境是否正常工作。这个PyTorch 2.8镜像已经预装了所有必要的深度学习组件,包括CUDA 12.4和cuDNN 8,专为RTX 409…...

Gemma-4-26B-A4B-it-GGUF实操手册:GPU温度监控+功耗限制+llama_cpp推理线程数调优指南

Gemma-4-26B-A4B-it-GGUF实操手册:GPU温度监控功耗限制llama_cpp推理线程数调优指南 1. 项目概述 Gemma-4-26B-A4B-it-GGUF是Google Gemma 4系列中的高性能MoE(混合专家)聊天模型,具备256K tokens的超长上下文处理能力&#xff…...

real-anime-z GPU算力适配教程:低显存(6GB)设备部署与量化方案

real-anime-z GPU算力适配教程:低显存(6GB)设备部署与量化方案 1. 模型简介 real-anime-z是基于Z-Image的LoRA版本的真实动画图片生成模型,专注于生成高质量的动漫风格图像。该模型特别针对低显存设备进行了优化,使其…...

神经渲染新范式:体素渲染技术全解析与实战指南

神经渲染新范式:体素渲染技术全解析与实战指南 引言 从《阿凡达》的奇幻世界到元宇宙的数字分身,高质量三维内容的创建正经历一场由神经渲染驱动的革命。其中,体素渲染(Voxel-based Neural Rendering)作为神经辐射场…...

Blender3mfFormat:Blender专业3D打印格式转换终极指南

Blender3mfFormat:Blender专业3D打印格式转换终极指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat Blender3mfFormat是一个功能强大的Blender插件&#xf…...

JetBrains IDE试用期重置工具:开发者必备的高效解决方案

JetBrains IDE试用期重置工具:开发者必备的高效解决方案 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter 在当今快速发展的软件开发领域,JetBrains系列IDE凭借其卓越的代码智能提示、强大的…...

YC 总裁开源了自己亲手写的 AI Agent 大脑,1 周就 1 万点赞。

还记得之前那个特别火的 GStack 吗?我前几天也发过文章介绍过。就是 Y Combinator 现任总裁兼 CEO Garry Tan 开源的那套专门给 AI 写代码用的 Skill 工作流,目前 7 万 Star。每天有 3 万开发者在用,在 Claude Code 圈子里基本算是贼火模板了。就在前几…...

MCMC方法解析:从蒙特卡洛到吉布斯采样与Metropolis-Hastings

1. 概率推断的挑战与蒙特卡洛方法的局限在机器学习和统计建模中,我们经常需要从概率模型中估计期望值或概率密度。想象你是一位数据分析师,面对一个包含数十个变量的复杂数据集,需要预测某个事件发生的概率。直接计算这个概率往往如同在迷宫中…...

HsMod:基于BepInEx的炉石传说插件开发框架深度解析

HsMod:基于BepInEx的炉石传说插件开发框架深度解析 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx插件框架的炉石传说游戏修改工具,通过50多…...

哔哩下载姬DownKyi:5分钟掌握B站视频下载的终极免费方案

哔哩下载姬DownKyi:5分钟掌握B站视频下载的终极免费方案 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&…...

ChatGPT在学术研究中的高效应用与数据分析技巧

1. ChatGPT在学术研究中的革命性应用作为一名长期从事数据分析和学术研究的实践者,我见证了AI工具如何逐步改变我们的研究方式。ChatGPT这类大型语言模型的出现,为研究者提供了一个前所未有的智能助手。它不仅能快速处理海量文献,还能协助进行…...

跳出“暴力美学”:一个模块化、类脑的大模型架构构想(大模型的思考:三)

跳出“暴力美学”之后:一次模块化大模型构想的自我纠偏与落地思考从“同步振荡”到“语法骨架”,从“词不达意”到失语症证据——一场关于解耦智能的思想实验如何走向严谨写在前面之前,我发表了一篇《跳出“暴力美学”:一个模块化…...

基于安卓的农产品价格实时监测系统毕设源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓平台的农产品价格实时监测系统以解决传统农产品价格信息获取方式存在的时效性不足与信息不对称问题。当前农产品市场存在价格波…...