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

学习数据结构(1)算法复杂度

1.数据结构和算法

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

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

(3)算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量⼀个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量⼀个算法的运行快慢,而空间复杂度主要衡量⼀个算法运行所需要的额外空间

2.时间复杂度

(1)概念

在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运行时间。时间复杂度是衡量程序的时间效率

为什么不去计算程序的运行时间?

·程序运行时间与编译环境、运行机器的配置有关,同一个算法程序,用一个老编译器进行编译和用新编译器编译,在同样机器下运行时间不同

·同⼀个算法程序,用⼀个老低配置机器和新高配置机器,运行时间也不同

·运行时间只能程序写好后测试,不能在程序写前通过理论思想计算评估

计算时间复杂度计算的不是程序的精确执行次数,(精确执行次数计算起来很复杂),计算时间复杂度只是想比较算法程序的增长量级,也就是当N不断变大时T(N)的差别,只需要计算程序能代表增长量级的大概执行次数,复杂度的表示通常使用大O的渐进表示法

(2)大O的渐进表示法

大O符号:是用于描述函数渐进行为的数学符号

规则:

·时间复杂度函数式T(N)中,只保留最高阶项,去掉低阶项,因为当N不断变大时,低阶项对结果影响越来越小,当N无穷大时,就可以忽略不计了

·如果最高阶项存在且不是1,则去除这个项目的常数系数,因为当N不断变大,这个系数对结果影响越来越小,当N无穷大时,就可以忽略不计了

·T(N)中如果没有N相关的项目,只有常数项,则用常数1取代常数

(3)实例

例1:计算Fucn1的时间复杂度

T(N)=N^2+2*N+10,只保留最高次项,则时间复杂度为O(N)

例2:计算Fucn2的时间复杂度

T(N)=2N+10,只保留最高次项,系数改为1,则时间复杂度为O(N)

例3:计算Fucn3的时间复杂度

T(N)=M+N,若M和N相差不大,T(N)可看成2N或2M,若M>>N,T(N)=M,若M<<N,T(N)=N,故时间复杂度为O(N)

例4:计算Fucn4的时间复杂度

T(N)=100,只有常数项,用1代替常数,则时间复杂度为O(1)

例5:计算Fucn5的时间复杂度

若要查找的字符在字符串第一个位置,T(N)=1,若要查找的字符在字符串最后一个位置,T(N)=N,若要查找的字符在字符串中间位置,T(N)=N/2或N/2+1(N是偶数),或T(N)=(N+1)/2(N是奇数),因此,Fucn5的时间复杂度分为:最好情况:O(1),最坏情况:O(N),平均情况:O(N)

补充:

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

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

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

最好情况:任意输入规模的最小运行次数(下界)

大O的渐进表示法在实际中一般情况关注的是算法的上界,也就是最坏运行情况

故例5的时间复杂度取O(N)

例6:计算BubbleSort的时间复杂度

若数组有序,则T(N)=N,若数组有序且为降序,则:T (N) = N(N-1)/2,故BubbleSort的时间复杂度取最差情况为O(N^2)

例7:计算Func6的时间复杂度

当n=2时,执行次数为1,当n=4时,执行次数为2,当n=16时,执行次数为4,假设执行次数为x ,则2^x= n, 因此执行次数:x = log (2) n,故Func6的时间复杂度为O(log (2) n),当n接近无穷大时,底数的大小对结果影响不大,因此,一般情况下不管底数是多少都可以省略不写,即可以表示为log n,建议使用log n

例8:计算Fac的时间复杂度

递归算法的时间复杂度=单次递归的时间复杂度*递归次数

单次递归的时间复杂度为O(1),递归次数为N,故Fac的时间复杂度为O(N)

相关文章:

学习数据结构(1)算法复杂度

1.数据结构和算法 &#xff08;1&#xff09;数据结构是计算机存储、组织数据的方式&#xff0c;指相互之间存在⼀种或多种特定关系的数据元素的集合 &#xff08;2&#xff09;算法就是定义良好的计算过程&#xff0c;取一个或一组的值为输入&#xff0c;并产生出一个或一组…...

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…...

RocketMQ原理—4.消息读写的性能优化

大纲 1.Producer基于队列的消息分发机制 2.Producer基于Hash的有序消息分发 3.Broker如何实现高并发消息数据写入 4.RocketMQ读写队列的运作原理分析 5.Consumer拉取消息的流程原理分析 6.ConsumeQueue的随机位置读取需求分析 7.ConsumeQueue的物理存储结构设计 8.Cons…...

(Halcon)轮廓等分切割(项目分析)

目标&#xff1a;获取绿色圆所在位置&#xff08;可用于点焊/点胶引导&#xff09; 实现思路 一&#xff0c;相机标定板标定&#xff08;如果实战用于点焊/点胶引导需要做图像畸变校正以减小误差&#xff09; 相机标定 如何做一个C#仿Halcon Calibration插件-CSDN博客 二&…...

NIO 和 Netty 在 Spring Boot 中的集成与使用

Netty到底是个啥&#xff0c;有啥子作用 1. Netty 的本质&#xff1a;对 NIO 的封装 NIO 的原生问题&#xff1a; Java 的 NIO 提供了非阻塞 I/O 和多路复用机制&#xff0c;但其使用较为复杂&#xff08;如 Selector、Channel、Buffer 的配置和管理&#xff09;。开发者需要自…...

【更正版】梯级水光互补系统最大化可消纳电量期望短期优化调度模型

目录 1 主要内容 目标函数&#xff1a; 约束条件&#xff1a; 线性化处理&#xff1a; 流程示意&#xff1a; 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《梯级水光互补系统最大化可消纳电量期望短期优化调度模型》&#xff0c;构建了以最大化整体可…...

基于AnolisOS 8.6安装GmSSL 3.1.1及easy_gmssl库测试国密算法

测试环境 Virtual Box&#xff0c;AnolisOS-8.6-x86_64-minimal.iso&#xff0c;4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 cat /etc/selinux/co…...

vue3 实际应用 将一个日期使用 moment.js 实现星期 今天 明天 ...

数据源 ["2025-01-23","2025-01-24","2025-01-25","2025-01-28","2025-01-26","2025-01-27" ] 后端给返回了一个这样的数据 日期数据 实际应用中实现的是这样的显示效果 日期需要这样显示的tabs 栏 我们需要…...

LLM幻觉(Hallucination)缓解技术综述与展望

LLMs 中的幻觉问题&#xff08;LLM 幻觉&#xff1a;现象剖析、影响与应对策略&#xff09;对其可靠性与实用性构成了严重威胁。幻觉现象表现为模型生成的内容与事实严重不符&#xff0c;在医疗、金融、法律等对准确性要求极高的关键领域&#xff0c;可能引发误导性后果&#x…...

Unity入门2 背景叠层 瓦片规则

切割场景 瓦片调色盘 放在Assets里面新建瓦片地图,palettes tile 瓦片 palettes调色板 上下窗口是分开的 拖进这个格子窗 瓦片太碎&#xff0c;要封装 装好之后&#xff0c;只是把瓦片放上去了&#xff0c;但是还没有画布&#xff0c;显示是这样的 no valid target 新建“…...

docker-制作镜像gcc添加jdk运行java程序

最近的项目需要使用java调用c的链接库&#xff0c;.OS文件&#xff0c;一开始准备在jdk的镜像下去安装c的环境&#xff0c;不过安装的内容很多&#xff0c;比较复杂也容易缺很多的包&#xff0c;经过实验&#xff0c;我们决定使用gcc的镜像安装jdk来正确的运行java程序。 基础镜…...

HashTable, HashMap, ConcurrentHashMap 之间的区别

一、HashTable 只是将关键方法加上了锁&#xff08;synchronized关键字&#xff09;。 缺点&#xff1a;1.如果多线程访问同一个HashTable就回直接造成锁冲突。 2.HashTable的size属性也是通过 synchronized来控制同步的&#xff0c;效率比较低。 3.在扩容时会涉及大量的拷贝…...

vue2和vue3组件之间的通信方式差异

Vue2 vs Vue3 组件通信方法对比 1. 父子组件通信 1.1 Props 传递 Vue2 <!-- 父组件 --> <template><child-component :message"message"></child-component> </template><script> export default {data() {return {message:…...

报错:MC1000未知的生成错误Invalid number of sections declared in PE header

报错&#xff1a;MC1000未知的生成错误Invalid number of sections declared in PE header 报错问题&#xff1a; MC1000未知的生成错误Invalid number of sections declared in PE header 开发环境&#xff1a;vs2022&#xff0c;编译C#工程时报错, 解决办法&#xff1a;重新…...

FPGA实现任意角度视频旋转(二)视频90度/270度无裁剪旋转

本文主要介绍如何基于FPGA实现视频的90度/270度无裁剪旋转&#xff0c;旋转效果示意图如下&#xff1a; 为了实时对比旋转效果&#xff0c;采用分屏显示进行处理&#xff0c;左边代表旋转前的视频在屏幕中的位置&#xff0c;右边代表旋转后的视频在屏幕中的位置。 分屏显示的…...

Linux(Centos 7.6)命令详解:wc

1.命令作用 打印文件的行数、单词数、字节数&#xff0c;如果指定了多个文件&#xff0c;还会打印以上三种数据的总和(Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified) 2.命令语法 Usage: wc [OPTION]... [FIL…...

centos7执行yum操作时报错Could not retrieve mirrorlist http://mirrorlist.centos.org解决

**原因&#xff1a;**CentOS 7 的官方仓库在 2024 年 6 月 30 日之后已经停止维护&#xff0c;不需要再去检查什么网络、DNS等乱七八糟的&#xff0c;因为这玩意都停止维护了&#xff0c;就算其他配置正常也照样不通。 **解决&#xff1a;**将CentOS-Base.repo文件替换成下面的…...

C语言程序设计:算法程序的灵魂

文章目录 C语言程序设计&#xff1a;算法程序的灵魂算法数据结构程序数据结构算法数值运算算法非数值运算算法 简单的算法举例【例2.1】求12345【例2.2】有50个学生&#xff0c;要求输出成绩在80分以上的学生的学号和成绩 简单的算法举例【例2.3】判定2000—2500年中的每一年是…...

openlayer getLayerById 根据id获取layer图层

背景&#xff1a; 在项目中使用getLayerById获取图层&#xff0c;这个getLayerById()方法不是openlayer官方文档自带的&#xff0c;而是自己封装的一个方法&#xff0c;这个封装的方法的思路是&#xff1a;遍历所有的layer&#xff0c;根据唯一标识【可能是id&#xff0c;也可能…...

在 vscode + cmake + GNU 工具链的基础上配置 JLINK

安装 JLINK JLINK 官网链接 下载安装后找到安装路径下的可执行文件 将此路径添加到环境变量的 Path 中。 创建 JFlash 项目 打开 JFlash&#xff0c;选择新建项目 选择单片机型号 在弹出的窗口中搜索单片机 其他参数根据实际情况填写 新建完成&#xff1a; 接下来设置…...

OWL ADVENTURE助力在线教育:AI自动批改绘图作业实践

OWL ADVENTURE助力在线教育&#xff1a;AI自动批改绘图作业实践 想象一下&#xff0c;一位在线美术老师&#xff0c;面对上百份刚刚提交的手绘作业。他需要一份份打开&#xff0c;仔细查看学生的构图、线条、比例&#xff0c;然后写下针对性的评语。这个过程不仅耗时费力&…...

别再死磕ECharts了!试试这个Vue关系图谱插件relation-graph,上手快效果好

从ECharts到relation-graph&#xff1a;Vue关系图谱开发的效率革命 如果你正在使用Vue开发需要展示复杂关系网络的应用&#xff0c;可能已经尝试过ECharts的关系图功能。但当你需要更专业的交互体验、更直观的数据表达时&#xff0c;relation-graph这个专为Vue设计的关系图谱插…...

嵌入式系统调试常见问题与解决方案

嵌入式系统调试中的典型问题分析与解决策略1. 常见调试问题案例分析1.1 程序文件版本错误在嵌入式开发过程中&#xff0c;一个常见的低级错误是使用了错误的程序文件版本。某工程师在调试时发现单片机完全不执行程序&#xff0c;即使是最基本的GPIO控制也无法实现。经过以下排查…...

基于SpringBoot+Vue的疫情物资管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 近年来&#xff0c;全球范围内突发公共卫生事件频发&#xff0c;疫情物资的高效管理与调配成为保障社会稳定的重要环节。传统物资管理方式依赖人工操作&#xff0c;存在效率低、数据不透明、响应速度慢等问题&#xff0c;难以满足紧急情况下的物资调度需求。尤其在新冠疫情…...

量子行走:从理论到Python实现——3. 量子门、电路与编程基础

目录 3. 量子门、电路与编程基础 3.1 单量子比特门 3.1.1 泡利门与旋转门 3.1.2 哈达玛门与相位门 3.2 多量子比特门 3.2.1 受控门 3.2.2 纠缠门与SWAP操作 3.3 量子电路构建与优化 3.3.1 电路表示与DAG结构 3.3.2 变分电路 3. 量子门、电路与编程基础 量子计算体系的…...

nli-distilroberta-base代码实例:Python调用DistilRoBERTa实现Entailment识别

nli-distilroberta-base代码实例&#xff1a;Python调用DistilRoBERTa实现Entailment识别 1. 项目概述 自然语言推理(Natural Language Inference, NLI)是自然语言处理中的一项重要任务&#xff0c;用于判断两个句子之间的逻辑关系。nli-distilroberta-base是基于DistilRoBER…...

SPIRAN ART SUMMONER优化指南:如何调整参数让生成的图片更符合预期

SPIRAN ART SUMMONER优化指南&#xff1a;如何调整参数让生成的图片更符合预期 1. 理解SPIRAN ART SUMMONER的核心参数 SPIRAN ART SUMMONER作为一款基于Flux.1-Dev模型的图像生成工具&#xff0c;其参数设置直接影响最终输出效果。与普通AI绘画工具不同&#xff0c;它融入了…...

2026年3月27日NSSCTF之[SWPUCTF 2021 新生赛]ez_unserialize

[SWPUCTF 2021 新生赛]ez_unserialize 开启环境&#xff0c;进入并查看&#xff0c;可以看到一个动图&#xff0c;选择查看网页源码&#xff0c;得到 看到有隐藏信息&#xff0c;根据隐藏信息可以猜测&#xff0c;可以利用robots协议查看相关信息&#xff0c;访问得到 可以得…...

reyax_lora轻量级LoRa模块串口驱动库设计与应用

1. 项目概述reyax_lora是一个面向嵌入式平台的轻量级串口驱动库&#xff0c;专为控制 Reyax 公司 RYLR998&#xff08;433/470/868/915 MHz&#xff09;与 RYLR498&#xff08;2.4 GHz&#xff09;LoRa 透传模块而设计。该库不依赖操作系统抽象层&#xff0c;以裸机&#xff08…...

提升嵌入式代码注释质量的工具与技术方案

提升代码注释质量的实用工具与技术方案1. 代码注释工具概述1.1 代码注释的重要性在嵌入式系统开发中&#xff0c;良好的代码注释是保证项目可维护性的关键因素。专业的注释工具能够帮助开发者&#xff1a;创建可视化注释&#xff0c;提升代码可读性生成标准化的文档结构维护代码…...