C语言数据结构之算法复杂度
目录
一、数据结构是什么
二、算法是什么
三、算法的效率
3.1 复杂度的概念
四、时间复杂度
4.1 大O渐进表示法
4.2 算法题分析
五、空间复杂度
5.1 复杂度对比
5.2 算法题题分析
正文开始
一、数据结构是什么
每个计算机专业的同学在大学都会接触到一门计算机必修课《数据结构与算法》
在大数据时代,我们要将数据存储、组织起来必须得依靠数据结构,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种数据结构对所有用途都有用,所以我们要学各式各样的数据结构。
二、算法是什么
算法:就是定义良好的计算过程。
比如说:将一个数组升序排序并输出,可以将数组每个元素比较一下看谁小放前面,也可以用冒泡排序对数组进行排序,或者快速排序等等多种解法,你要找到最优的解法,就称为最优算法。
对标大厂的岗位:算法工程师。
三、算法的效率
有那么多种算法,如何衡量一个算法的好坏呢?
通过复杂度衡量
3.1 复杂度的概念
算法在编写成可执行程序后,运行时需要消耗时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量,既时间复杂度和空间复杂度。
时间复杂度主要衡量算法的运行快慢(程序给出结果要多久),而空间复杂度主要衡量一个算法运行所需要的额外空间。经过计算机行业的迅速发展,计算机的内存容量已经达到了很高的程度,所以我们已经不再特别关注一个算法的空间复杂度。
四、时间复杂度
在数学的学习中,求解未知数有一元一次方程ax + b = 0 、二元一次方程ax+by+c=0.....
在计算机科学中,计算算法的时间复杂度用函数式T(N)来表示。时间复杂度用来衡量程序的运行时间效率,接下来我用C语言中clock计算一下某个程序的运行时间:

以上计算的是两个for循环所需要的时间,t1记录开始时间,t2记录结束时间,两个一减就是for循环所需时间

计算出来的时间是13099毫秒,那么13099毫秒就一定是它真实执行时间吗?在运行几次看看

可以发现:程序每次运行的时间都不一样,无法精确给出一个时间,只能给出一个差不多的数字,所以我们无法通过clock函数计算出程序执行的时间复杂度
(1)因为程序运行时间和编译环境和运行机器的配置都有关,比如同一个算法程序,用一个老编译器进行编译和新编译器在同样机器下运行时间不同
(2)同一个算法程序用一个低配置机器和新高配置机器,运行时间不同
(3)并且时间只能程序写好后测试,不能写程序前通过理论思想计算评估(程序写完才能用clock函数计算)
那么算法的时间复杂度是一个函数式T(N)到底是什么呢?
这个函数式计算了程序的执行次数,是写程序前通过理论思想计算评估的一个函数式,用来表示输入条件N对时间的影响趋势。
上面我已经通过clock给大家演示过无法精确计算出程序的时间,那么影响时间复杂度的条件有:每条语句的执行时间*每条语句的执行次数。由于无法给出精确时间数据,所以每条语句的执行时间即使有差别但是微乎其微,我们可以忽略不计,认为每条语句的执行时间是相同的(上面例子13009毫秒和13144毫秒差别不大忽略不计之间差别)
既然每条语句的执行时间忽略不计,那么影响时间复杂度的条件为:每条语句的执行次数

例如以上代码:count=0语句只执行了一次,++count语句在两个for循环内部,第一个for循环循环N次,第二个for循环也循环N次,所以++count语句执行了n^2次。用时间复杂度函数式T(N) = n^2,其中N表示影响时间复杂度的输入条件,N给的值不同,循环的次数不同算法的时间复杂度T(N)也就不同
有同学可能会问:程序时间复杂度除了++count外不是还有个count = 0语句的执行次数吗?怎么不加上为:T(N) = n^2 + 1
实际中我们计算时间复杂度时,计算的也不是程序的精准执行次数,计算出精准次数意义不大,因为我们计算时间复杂度只是想比较算法程序的增长量级,也就是输入条件N不断变大时T(N)的差别。T(N) = n^2+1随着N的增大,加1对整个程序时间复杂度影响不大(它都已经n^2了+-1已经影响不大)所以忽略不计,我们只需要计算程序能代表增长量级的大概执行次数,既然是大概的,我们通常用大O的渐进表示法。
4.1 大O渐进表示法
用于描述函数渐进行为的数学符号,表示算法的复杂度

4.2 算法题分析
案例一:

T(N)用来表示输入条件N对时间的影响趋势。
for循环中++count的执行次数为2N,而while内部++count的循环次数为10
T(N) = 2N+10 根据大O阶规则(1):2N>10,10去掉;规则(2):常量系数2去掉


案例二:

++count执行多少次受 k<100 影响所以T(N)=100,根据大O规则(3):写成O(1)
其中1不是表示程序只执行一次,而是用1取代常量
![]()
案例三:



五、空间复杂度
空间复杂度也是一个数学表达式,是对一个算法在运行过程中因为算法的需要额外临时开辟的空间。也使用大O渐进表示法,规则与其一样。
注意:函数运行时所需的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,空间复杂度计算的是函数运行时所需的额外空间。
案例一:

案例二:

执行一次Fac函数,内部递归调用一次Fac(N-1)*N,函数递归的复杂度取决于函数调用的次数,Fac函数内部调用了n-1次,当N=0时不再调用,O(n-1)根据大O表示法规则,最后为:O(n)
5.1 复杂度对比


从以上表格可以看出数据n的数值不断增大,不同空间复杂度所占用空间的比较
5.2 算法题分析

此处开辟的是一个二维数组,数组有n行,每行分别有1,2,3,...n列,等差数列计算公式是n(n + 1)/2个元素空间,根据大O规则,空间复杂度为n^2
图解:

完
相关文章:
C语言数据结构之算法复杂度
目录 一、数据结构是什么 二、算法是什么 三、算法的效率 3.1 复杂度的概念 四、时间复杂度 4.1 大O渐进表示法 4.2 算法题分析 五、空间复杂度 5.1 复杂度对比 5.2 算法题题分析 正文开始 一、数据结构是什么 每个计算机专业的同学在大学都会接触到一门计算机必修课《数…...
HDU RSA
翻译成中文后: 思路:由题易得,d * e y * f ( n ) 1 ,且gcd ( e , f ( n ) ) 1,所以用扩展欧几里得求出 d ,但要保证 d 是非负的,最有用快速幂求出每个字符即可。 #include<bits/stdc.h> using namespace std;…...
数据仓库建设 : 主题域简介
在数据仓库建设中,主题域是数据模型的一个重要概念,它帮助构建逻辑清晰、层次分明的数据结构。主题域的设计基于企业的业务结构,将业务中的关键部分提炼出来,划分为若干个主题域。每个主题域对应一个特定的业务领域,便…...
开源表单生成器OpnForm
什么是 OpnForm ? OpnForm 是一个开源的表单构建工具,旨在简化创建自定义表单的过程,特别适合无编码知识的用户。它通过人工智能优化表单创建流程,支持多种用途,如联系人表单、调查表等。OpnForm 提供了一个直观的拖放…...
Zookeeper面试整理-Zookeeper的基础概念
Zookeeper的基础概念是理解其作为分布式协调服务的核心要素。以下是一些关键的基础概念: 1. Zookeeper是什么? Zookeeper 是一个开源的分布式协调服务,用于分布式应用中的配置管理、命名服务、分布式锁、集群管理等任务。它提供了一组简单的原语,帮助开发人员构建健壮的分布…...
验证archive_command配置是否正确
要验证 archive_command 配置是否正确,你可以按照以下步骤进行: 检查配置文件: 确保 postgresql.conf(或你的 PostgreSQL 实例使用的任何自定义配置文件)中的 archive_command 已经设置为你想要的命令。 重启 …...
2024.10.19小米笔试题解
第一题数独计数 考虑dfs遍历所有情况 n = int(input())def check(grid, x, y, v):dx = [1, 0, -1, 0]dy = [0, 1, 0, -1]for i in range(4):nx, ny = x + dx[i], y + dy[i]if 0 <= nx < 3 and 0 <= ny < 3:if grid[nx][ny] == 0:continueif abs(grid[nx][ny] - v…...
SQL-SERVER导入excel表格
首先先找到数据源,如上图。我们用的是excel表格。 这里你需要选择excel版本,反正你随便选,应该没什么问题的。 再导入数据 我们需要导入最后那个,也就是OLE DB Provider for SQL SERVER 只有这个才能导入到当前的数据库中 接下来…...
Vue学习笔记(三、v-cloak、v-text、v-html指令)
一、 v-cloak v-cloak 是 Vue.js 提供的一个特殊指令,用于在 Vue 实例准备完毕并开始进行 DOM 编译之前隐藏未编译的模板。它通常用于防止页面闪烁或者展示未编译的 Vue 模板语法。 你可以简单地在 HTML 元素上添加 v-cloak 指令,然后在确保 Vue…...
Java | Leetcode Java题解之第496题下一个更大元素I
题目: 题解: class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Map<Integer, Integer> map new HashMap<Integer, Integer>();Deque<Integer> stack new ArrayDeque<Integer>();for (int i num…...
【ArcGIS微课1000例】0125:ArcGIS矢量化无法自动完成面解决方案
文章目录 一、坐标系统问题二、正确使用自动完成面工具一、坐标系统问题 1. 数据库坐标系 arcgis矢量化的过程中,无法自动完成面,可能是因为图层要素没有坐标系造成的。双击数据库打开数据库属性,可以查看当前数据框的坐标系。 2. 图层坐标系 双击图层,打开图层属性,切…...
slam技术支持下的果园作物估产论文汇总
文章目录 2019ROLS : Robust Object-level SLAM for grape counting(CVPR) 2021PATHoBot: A Robot for Glasshouse Crop Phenotyping and Intervention 2023ORB-Livox: A real-time dynamic system for fruit detection and localization(Com…...
政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行
目录 简介 什么是@gradio/lite? 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例:添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全 限制 尝试一下!…...
Spring 中的 @AUtowire 和 @Resource 用法和原理,以及避坑
🌟 Why:了解 Autowire 和 Resource 的高级用法和原理对于开发大型企业级应用至关重要。这些注解不仅帮助我们实现组件之间的松耦合,还能提高代码的可维护性和可测试性。掌握它们的高级用法可以让我们更灵活地处理复杂的依赖关系。 …...
速盾:cdn能加速游戏吗?
CDN(内容分发网络)是一种通过分布在全球不同地区的服务器来缓存和传输网络内容的技术。它的主要目的是提高内容的传输速度和用户体验。虽然CDN主要用于加速网站的访问和内容传输,但它也可以应用于游戏加速。 在传统的在线游戏中,…...
速盾:高防服务器防火墙的特性是什么?
高防服务器防火墙是一种专业的网络安全设备,用于保护服务器免受各种网络攻击的侵害。它具有许多特性,以确保服务器的安全性和可靠性。 第一个特性是入侵检测系统(IDS)。高防服务器防火墙可以监视服务器上的网络流量,并…...
初识git · 远程操作
目录 前言: 理解分布式版本控制系统 远程仓库 仓库操作 克隆仓库 推送和抓取 特殊文件 取别名 标签管理 前言: 在基本操作,分支管理这几个部分,我们都会在本地仓库操作了,但是目前还没有办法将自己的代码远程…...
深度学习:卷积神经网络(CNN)详解
卷积神经网络(CNN)详解 卷积神经网络(Convolutional Neural Network, CNN)是一种专为处理具有网格结构数据(如图像)的深度学习模型。CNN通过引入卷积层、池化层等独特的操作,能够有效提取局部特…...
软件测试学习笔记丨Pycharm实用技巧
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/23459 PyCharm 应该是大多数 python 开发者的首选 IDE,每天我们都在上面敲着熟悉的代码,写出一个又一个奇妙的功能。它是帮助用户在使用 Python 语言开发时提高其效率的…...
Vue学习笔记(二、Vue.js的引入与对象创建)
一、引入vue 1.通过cdn引入: <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> 2.本地引入: <script src"./lib/vue.js"></script> 二、创建Vue对象 代码参考如下: …...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
