进入数据结构的世界
数据结构和算法的概述
- 一、什么是数据结构
- 二、什么是算法
- 三、如何去学习数据结构和算法
- 四、算法的时间复杂度和空间复杂度
- 4.1 算法效率
- 4.2 大O的渐进表示法
- 4.3 时间复杂度
- 4.4 空间复杂度
- 4.5 常见复杂度对比
一、什么是数据结构
数据结构是计算机存储、组织数据的方式。(相互之间存在一种或多种特定关系的数据元素的集合)
二、什么是算法
算法就是一系列的计算步骤,用来吧输入数据转换成输出结果。(算法就是有良好的计算过程,把一个或一组的值输入,并产出一个或一组的值输出)
三、如何去学习数据结构和算法
现在的公司对学生的代码能力越来越高,数据结构和算法的题目越来越难。算法的能力在短期内是不能够快速提升的,需要进行算法训练的积累。校招的时候,笔试很难,为了能够找到工作,还需要对数据结构和算法早早的准备,多去训练算法能力。
数据结构和算法对于初学者来说很难。但 是,古话说的好,世上无难事,只怕有心人。不管数据结构和算法有多难,我们都要硬着头皮去学。我相信,只要多学多练,学习数据结构和算法就会越来越简单。
四、算法的时间复杂度和空间复杂度
时间和空间这两个维度能够衡量算法的好坏,
4.1 算法效率
算法在编写成可执行程序后,运行程序需要耗费空间资源和时间资源。因此,衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,这就是时间复杂度和空间复杂度。
时间复杂度主要是衡量算法的运行快慢,而空间复杂度主要是衡量一个算法运行时所需要的额外空间。(计算机发展的早期,计算机存储的容量很小,我们对空间复杂度很在乎。但是经过计算机行业的快速发展,计算机存储的容量已经达到了很高的地步。所以我们今天已经不需要特别在关注算法的空间复杂度)
4.2 大O的渐进表示法
大O符号(Big O notation):用于描述函数渐进行为的数学符号
大O的渐进表示法的推导方法:
1、用常数1取代运行时间中所以的加法常数。
2、在运行次数函数中,只保留最高阶项。
3、如果最高价项存在且不是1,则去除与这个项相乘的常数,得到的结果就是大O阶。
算法的时间复杂度存在最好、平均和最坏情况:
最好情况:任意输入规模的最大运行次数(上界)
平均情况:任意输入规模的期望运行次数
最坏情况:任意输入规模的最小运行次数(下界)
例如:在一个长度为N的数组中搜索一个数据x
最好情况:1次找到
平均情况:N/2次找到
最坏情况:N次找到
实际中,我们关注的都是算法的最坏情况。所以,数组中搜索数据的时间复杂度为O(N)
4.3 时间复杂度
时间复杂度的定义:
一个算法执行所消耗的时间,从理论上说,是不能够算出来得,只有把程序放在机器上跑,才能够知道消耗的时间。一个算法所花费的时间与其中语句的执行次数成正比,算法的基本操作的执行次数,就是算法的时间复杂度。
案例1:
找到基本语句与问题规模n的数学表达式,算出该算法的时间复杂度。
//计算++count语句执行的次数
#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);int count = 0;for (int i = 0; i < n; i++){for (int j = 0; j < n; j++)++count;}for (int i = 0; i < 2 * n; i++){++count;}int m = 10;while (m--){++count;}printf("%d\n", count);return 0;
}
基本操作次数:
F(n)=n^2+2*n+10
- n=10 F(n)=130
- n=100 F(n)=10210
- n=1000 F(n)=1002010
用大O的渐进表示法,时间复杂度为O(N^2)
- n=10 F(n)=100
- n=100 F(n)=10000
- n=1000 F(n)=1000000
实际中我们计算时间复杂度时,并不一定计算精准的时间复杂度,而只需要大概执行次数,这里我们使用大O的渐进表示法。
通过上面我们可以发现大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。
案例2:
计算Fun2的时间复杂度
void Fun2()
{int N;scanf("%d", &N);int count = 0;for (int i = 0; i < 2 * N; i++){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}
Fun2的时间复杂度为:
F(N)=2*N+10
大O的渐进表示法:时间复杂度为O(N)
案例3:
//计算Fun3的时间复杂度
void Fun3()
{int N, M;scanf("%d%d", &N, &M);int count = 0;for (int i = 0; i < N; i++){++count;}for (int j = 0; j < M; j++){++count;}printf("%d\n", count);
}
Fun2的时间复杂度为:
F(N)=N+M
大O的渐进表示法:时间复杂度为O(N)
案例4:
//二分查找的思想
void Fun4()
{int m = 0;int arr[10] = { 1,2,4,6,8,11,55,66,77,88};int n;printf("请输入要查找的数:\n");scanf("%d", &n);int begin = 0;int end = 9;while (begin <= end){int mid = begin + (end - begin)/2;if (arr[mid] < n)begin = mid + 1;else if (arr[mid] > n)end = mid - 1;else{printf("找到了\n");printf("%d", arr[mid]);m = 1;break;}}if(m==0)printf("没找到\n");
}
区间数据个数:
N
N/2
N/2/2
…………
N/2/2/2……/2=1
最坏的情况,查找区间缩放只剩一个值时,就是坏得,
假设查找x次,2^x=N,所以x=logN。
大O的渐进表示法:时间复杂度为O(logN).
案例5:
//斐波那契递归的复杂度
#include <stdio.h>
int Fun5(size_t n)
{if (n < 3)return 1;return Fun5(n - 2) + Fun5(n - 1);}
int main()
{int n = 7;int sum=Fun5(n);printf("%d\n", sum);return 0;
}
打印结果:
递归展开图:
1次(2^ 0)
2次(2^ 1)
4次(2^ 2)
8次(2^ 3)
……
2^(N-1)次
通过函数递归图分析基本操作递归了2 ^N-1次,
大O的渐进表示法:时间复杂度为O (2 ^N)。
4.4 空间复杂度
空间复杂度的定义:
一个算法在运行过程中临时占用存储空间大小的量度。(空间复杂度算的是变量的个数)
注意:
函数运行时所需要的栈空间(存储函数、局部变量、一些寄存器信息等)在编译期间就已经确定好了,因此,空间复杂度主要就是函数在运行的时候申请的额外空间来确定的。
案例1:
//计算BubbleSort函数的空间复杂度
void BubbleSort(int* a, int n)
{assert(a);for (int end = n; end > 0; end--){int exchange = 0;for (int i = 1; i < n; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);exchange = 1;}}//不需要循环了if (exchange == 0)break;}
}
可以看出使用了常数个额外空间,所以空间复杂度为O(1)
案例2:
//看返回斐波那契数列的前n项,计算Fibonac的空间复杂度
int* Fibonac(int n)
{if (n == 0)return NULL;int* fibar = (int*)malloc(sizeof(int) * (n + 1));fibar[0] = 0;fibar[1] = 1;for (int i = 2; i <= n; i++){fibar[i] = fibar[i - 1] + fibar[i - 2];}return fibar[i];
}
动态开辟了n+1个空间,大O的渐进表示法为O(N);
4.5 常见复杂度对比
相关文章:

进入数据结构的世界
数据结构和算法的概述 一、什么是数据结构二、什么是算法三、如何去学习数据结构和算法四、算法的时间复杂度和空间复杂度4.1 算法效率4.2 大O的渐进表示法4.3 时间复杂度4.4 空间复杂度4.5 常见复杂度对比 一、什么是数据结构 数据结构是计算机存储、组织数据的方式。&#x…...

stm32之看门狗
STM32 有两个看门狗,独立看门狗和窗口看门狗,独立看门狗又称宠物狗,窗 口看门狗又称警犬。可用来检测和解决由软件错误引起的故障。两个看门狗的原理都是当计数器达到给定的超时值时,产生系统复位,对于窗口型看门狗同…...

纤维蛋白单体(FM)介绍
纤维蛋白单体(FM)是血栓形成的早期产物,是纤维蛋白原(Fibrinogen,Fbg)在凝血酶(Thrombin)的作用下,脱掉肽A(Fibrinopeptide A,Fp A)与…...

知识图谱实战导论:从什么是KG到LLM与KG/DB的结合实战
前言 本文侧重讲解: 什么是知识图谱LLM与langchain/数据库/知识图谱的结合应用 比如,虽说基于知识图谱的问答 早在2019年之前就有很多研究了,但谁会想到今年KBQA因为LLM如此突飞猛进呢 第一部分 知识图谱入门导论 //待更.. 第二部分 LLM与…...
第5章 会话与会话技术
第5章 会话与会话技术 一. 单选题(共5题,50分)二. 判断题(共5题,50分) 一. 单选题(共5题,50分) (单选题) 阅读下面代码: Book book BookDB.getBook(id)…...

IDEA2023新UI回退老UI
idea2023年发布了新UI,如下所示 但是用起来真心不好用,各种位置也是错乱,用下面方法可以回退老UI...

ElasticSearch(三)
1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些…...
【LinkedHashMap】146. LRU 缓存
146. LRU 缓存 解题思路 与普通的 HashMap 不同,LinkedHashMap 会保持元素的有序性。这可以在某些情况下提供更可预测的迭代顺序直接获取元素 因为使用到该元素 将该元素重新放入队尾 表示最近使用该元素写入元素,首先如果该元素原来存在 那么需要将ke…...

Opencv-python去图标与水印方案实践
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色ÿ…...

自己写过比较蠢的代码:从失败中学习的经验
文章目录 引言1. 代码没有注释2. 长函数和复杂逻辑3. 不恰当的变量名4. 重复的代码5. 不适当的异常处理6. 硬编码的敏感信息7. 没有单元测试结论 🎉 自己写过比较蠢的代码:从失败中学习的经验 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页&a…...
C语言 cortex-A7核 点LED灯 (附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】)
1 汇编实现 text global _start start: ************** LED1点灯 ---> PE10 **************/ ************** RCC章节初始化 **************/ CC_INIT:1.使能GPIOE组控制器,通过RCC_MP_AHB4ENSETR寄存器设置GPIOE组使能0x50000A28[4] 1ldr r0,0x50000A28 准…...

LABVIEW 实战案例1--温度报警系统
图1 温度报警系统前面板 图2 温度报警系统后面板...
【力扣】292. Nim 游戏
题目描述 你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。你们轮流进行自己的回合, 你作为先手 。每一回合,轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数…...

IAP固件升级分几步?(Qt上位机、)
前言 这周一直想做一个IAP固件升级的上位机,然后把升级流程全都搞懂 有纰漏请指出,转载请说明。 学习交流请发邮件 1280253714qq.com IAP原理 IAP的原理我就不多赘述了,这里贴上几位大佬的文章 STM32CubeIDE IAP原理讲解,及U…...

Otter改造 增加springboot模块和HTTP调用功能
环境搭建 & 打包 环境搭建: 进入 $otter_home/lib 目录执行:bash install.sh 打包: 进入$otter_home目录执行:mvn clean install -Dmaven.test.skip -Denvrelease发布包位置:$otter_home/target 项目背景 阿里…...

Vue.js vs React:哪一个更适合你的项目?
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

Debian环境下搭建STM32开发环境
1. 安装交叉编译工具,解压gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2,并且把交叉编译环境添加到path路径。 2.安装下载工具驱动和下载工具 # 安装下载工具openocd sudo apt -y install openocd 3.下载测试 sudo openocd -f cmsis-dap.cfg -…...

如何防止商业秘密泄露(洞察眼MIT系统商业机密防泄密解决方案)
在当今的商业环境中,保护公司的商业秘密是至关重要的。商业秘密可能包括独特的业务流程、客户列表、研发成果、市场策略等,这些都是公司的核心竞争力。一旦这些信息被泄露,可能会对公司的生存和发展产生重大影响。本文将探讨如何通过使用洞察…...
题目 1062: 二级C语言-公约公倍
输入两个正整数m和n,求其最大公约数和最小公倍数。样例输入 2 3样例输出 1 6 这题一知半解的, 最小公倍数两数の积/最大公约数; 最大公约数通过迭代法求得(见其下), 作为a,b两数有一个属为有一个为0为无效数据时 《-----a%b等…...

【Leetcode】148.排序链表
一、题目 1、题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例1: 输入:head = [4,2,1,3] 输出:[1,2,3,4]示例2: 输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例3: 输入:head = [] 输出:[]提示: 链表中节点的数目在范围 [0, 5 …...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...