数据结构——概念与时间空间复杂度
目录
前言
一相关概念
1什么是数据结构
2什么是算法
二算法效率
1如何衡量算法效率的好坏
2算法的复杂度
三时间复杂度
1时间复杂度表示
2计算时间复杂度
2.1题一
2.2题二
2.3题三
2.4题四
2.5题五
2.6题六
2.7题七
2.8题八
四空间复杂度
1题一
2题二
3题三
4题四
五轮转数组
前言
数据结构与算法在后期找工作时非常重要(笔试与面试都有,都要求手撕),所以学习时没学完一个知识点要找对应的题去做,反复练习(敲代码)才会使你的认识提升一个档次,下来也要进行归类,画图总结,复习时才轻松点~
一相关概念
1什么是数据结构
数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合;
简单来说数据结构:在内存中管理数据;而与数据库又有什么关系呢?
数据库: 在磁盘中管理数据
在C语言中写过的通讯录其实就是数据结构中的一种(数据结构称为顺序表)
而数据结构中不仅只有顺序表,还有链表,栈,队列,树,图...学好数据结构本质就是对常见的数据结构有一定的认识与使用,在后面工作时这些认识也是非常重要的!
2什么是算法
算法(Algorithm):就是定义良好的计算过程,取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果
二算法效率
1如何衡量算法效率的好坏
对应斐波那契数列:
long long Fib(int N)
{if(N < 3) return 1;return Fib(N-1) + Fib(N-2);
}
斐波那契数列的递归实现方式非常简洁,但简洁一定好吗?这样实现是否效率?
2算法的复杂度
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源(不同电脑消耗与运行速度不同);衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即: 时间复杂度和空间复杂度
时间复杂度主要衡量算法的运行快慢; 空间复杂度主要衡量算法运行所需要的额外空间 在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎;但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经只关心空间复杂度,不再关心时间复杂度
对于面试时的考察主要是写算法题时要求指定的时间复杂度去设计:

三时间复杂度
时间复杂度:算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。
一个算法执行所耗费的时间从理论上说,是算不出来的;只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗? 是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。
一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法
的时间复杂度。
找时间复杂度:找到某条基本语句与问题规模N之间的数学函数,把对函数影响最大的项数找出来
1时间复杂度表示
一般用大O的渐进表示法
大O符号(Big O notation):是用于描述函数渐进行为的数学符号 推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶
另外有些算法的时间复杂度可能存在最好、平均和最坏情况;
一般情况关注的是算法的最坏运行情况
这个道理就好像你中午约别人吃饭,至于要什么时候去,你要想好:正常情况下12:00就下课了,约12:02好?如果下课后有点事(有道题要问老师)岂不是会迟到,约12:15好?那如果最差情况老师拖堂了30分钟呢?所以按照最坏的情况来约时间12:40去吃饭好!其实这也是最好的安排!如果预期老师真的拖堂了,按照约定时间吃饭刚刚好;如果没拖堂的话,我就还有几十分钟的时间来做下一步的打算(回宿舍洗个头换个衣服什么的),按照最坏的情况来说便是最好的打算!
2计算时间复杂度
2.1题一
void Func1(int N)
{int count = 0;for (int i = 0; i < N; ++i){for (int j = 0; j < N; ++j){++count;}}for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}
Fun1实际执行的操作数:

实际中计算时间复杂度时,不是计算精确的执行次数,而只需要大概执行次数即可;
F(N)中N^2对该函数影响最大(当N越大时,N^2呈现线性增长),所以O(N) = N^2
2.2题二
void Func2(int N)
{int count = 0;for (int k = 0; k < 2 * N; ++k){++count;}int M = 10;while (M--){++count;}printf("%d\n", count);
}
Func2的数学函数:O(N) = 2*N + 10 ,但2可以省略,所以O(N) = N
常数项去掉可以理解,为什么也要把2给忽略掉?
你可以这么想:假设当前科技探索到了两颗适合人类居住的星球:一个距离1亿光年,一个距离2亿光年,无论是近的还是远的,当前技术都无法到达那里,所以对于我们来说:无论是近还是远都是无所谓的(方正都到不了),这里省略2也类似的道理~
2.3题三
void Func3(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大?
如果是N大,O(N) = N ;如果是M大,O(N) = M
2.4题四
void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++k){++count;}printf("%d\n", count);
}
N不影响循环的次数,所以:O(N) = 1(常数次)
2.5题五
const char *strchr(const char *str, int character);
该函数是库里面的函数,功能:在str字符串中找到character字符;
所以共有三种情况:
好的情况(第一次就找到了):O(N) = 1 ;
中等情况(在中间位置找到了):O(N) = 2/N
坏的情况(最后一个才找到/找到最后一个后也不是它就是找不到了):O(N) = N;
取最坏的情况作为时间复杂度O(N) = N
2.6题六
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;}
}
如果只是看到两个for循环就判断O(N) = N^2,70%到80%的情况是正确的:分析一般要根据代码思路(本质)来分析得出O(N)(快排实现也是两个循环,但O(N) = N)
以上是实现冒泡函数的代码实现;
第一趟是 n-1 ,第二趟是 n-2,第三趟是 n-3...最后一趟 1;
这刚好就是一个等差数列,进行求和(总的代码执行次数):
n*(a1+an) / 2 = (n-1)*(n-1+1) /2 = (n-1)*n / 1
所以时间复杂度O(N) = N^2
2.7题七
int BinarySearch(int *a, int n, int x)
{assert(a);int begin = 0;int end = n - 1;// [begin, end]:begin和end是左闭右闭区间,因此有=号while (begin <= end){int mid = begin + ((end - begin) >> 1);if (a[mid] < x)begin = mid + 1;else if (a[mid] > x)end = mid - 1;elsereturn mid;}return -1;
}

时间复杂度O(N) = log N(log默认下面的数是2)
2.8题八
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}

这里可能有人算的时候是将每层进行相乘,这是不对的!!
因为我们计算的是代码执行的次数;
所以时间复杂度O(N) = 2^N
四空间复杂度
空间复杂度是一个数学表达式,是对一个算法在运行过程中临时占用存储空间大小的量度
空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
空间复杂度主要通过函数在运行时候显式申请的额外空间来确定
为了区分时间复杂度与空间复杂度,空间复杂度我们用小写n来表示
1题一
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;}
}
该冒泡排序只是在原来数组进行修改,没有申请额外空间,所以O(n) = 1
2题二
long long *Fibonacci(size_t n)
{if (n == 0)return NULL;long long *fibArray = (long long *)malloc((n + 1) * sizeof(long long));fibArray[0] = 0;fibArray[1] = 1;for (int i = 2; i <= n; ++i){fibArray[i] = fibArray[i - 1] + fibArray[i - 2];}return fibArray;
}
以上函数实现第n个数时返回一个大小为n斐波那契数组(储存的是计算好的值)
申请了临时空间,所以O(n) = n
3题三
long long Fac(size_t N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}
递归的方式计算阶乘,递归层数是N-1层;递归时要计算空间复杂度是用累加的方式进行计算(而时间一去不复返,不能累加),所以O(n) = n
4题四
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}
计算时间复杂度时利用每层递归的层数形成的是一个等比数列的关系后进行累加得到O(N) = 2^N;那么计算空间复杂度也是这样,答案也是O(n) = 2^n?
如果这么想的话,那那就错了!递归的顺序按照下面红线的方式递归

走到Fib(2)返回到Fib(3)时往下再递归时并不是重新开辟空间,而是重复利用Fib(2)递归时的空间,为什么??
因为此时Fib(2)的空间已经还给OS了,而OS对待即将销毁的空间,不是直接进行我们想象中的销毁,而是让后面来的数据进行覆盖!
所以递归层数 N-2 才是该函数的空间复杂度O(n) = n
五轮转数组

class Solution
{
public:void rotate(vector<int> &nums, int k){// O(N) = N O(n) = 1// int n=nums.size();// k%=n;//一定要%// reverse(nums.begin(),nums.begin()+n-k);//前n-k个数翻转// reverse(nums.begin()+n-k,nums.end());//后k个数翻转// reverse(nums.begin(),nums.end());// o(N) = N O(n) = N 空间换时间int n = nums.size();k %= n;vector<int> ret;for (int i = n - k; i < n; i++)ret.push_back(nums[i]);for (int i = 0; i < n - k; i++)ret.push_back(nums[i]);nums = ret;}
};
以上便是全部内容,有问题欢迎在评论区指正,感谢观看!
相关文章:
数据结构——概念与时间空间复杂度
目录 前言 一相关概念 1什么是数据结构 2什么是算法 二算法效率 1如何衡量算法效率的好坏 2算法的复杂度 三时间复杂度 1时间复杂度表示 2计算时间复杂度 2.1题一 2.2题二 2.3题三 2.4题四 2.5题五 2.6题六 2.7题七 2.8题八 四空间复杂度 1题一 2题二 3…...
浅谈在AI时代GIS的发展方向和建议
在AI时代,GIS(地理信息系统)的发展正经历着深刻的变革,随着人工智能技术的进步,GIS不再仅仅是传统的地图和空间数据处理工具,而是向更加智能化、自动化、精准化的方向发展。作为一名GIS开发工程师ÿ…...
牛客周赛 Round 78 A-C
A.时间表查询! 链接:https://ac.nowcoder.com/acm/contest/100671/A 来源:牛客网 题目描述 今天是2025年1月25日,今年的六场牛客寒假算法基础集训营中,前两场比赛已经依次于 20250121、20250123 举行;而…...
Java I/O 流介绍
Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java 编程中,I/O(Input/Output)流是处理输入和输出操作的核心机制。它允许程序与外部设备(如文件、网络连接、键盘、显示器等)进行数据交互。通过使用 I/O 流&…...
linux 内核学习方向以及职位
### 学习路径 1. 基础阶段: - C语言高级特性 - 指针和内存管理 - 数据结构实现 - 位操作 - 多线程编程 - Linux系统编程 - 文件I/O操作 - 进程管理 - 信号处理 - IPC机制 - Socket编程 - 必备知识 - 操作系统原理 - 计算机体系结构 - …...
HTML-新浪新闻-实现标题-样式1
用css进行样式控制 css引入方式: --行内样式:写在标签的style属性中(不推荐) --内嵌样式:写在style标签中(可以写在页面任何位置,但通常约定写在head标签中) --外联样式…...
【电磁兼容】CE 传导骚扰
一。是什么? 传导骚扰是指电气或电子设备产生的不需要的电磁能量,这些能量通过导线或其他金属路径传播到其他设备或者系统中。这种类型的干扰通常发生在同一电源线路连接的不同装置之间,或者是共享相同布线系统的组件间。 传导骚扰可以分为两…...
能说说MyBatis的工作原理吗?
大家好,我是锋哥。今天分享关于【Redis为什么这么快?】面试题。希望对大家有帮助; 能说说MyBatis的工作原理吗? MyBatis 是一款流行的持久层框架,它通过简化数据库操作,帮助开发者更高效地与数据库进行交互。MyBatis…...
詳細講一下RN(React Native)中的列表組件FlatList和SectionList
1. FlatList 基礎使用 import React from react; import { View, Text, FlatList, StyleSheet } from react-native;export const SimpleListDemo: React.FC () > {// 1. 準備數據const data [{ id: 1, title: 項目 1 },{ id: 2, title: 項目 2 },{ id: 3, title: 項目 3…...
LabVIEW进行可靠性测试时有哪些常见的问题
在进行LabVIEW开发和测试时,尤其是用于可靠性测试,可能会遇到一些常见的问题。以下是一些常见问题及其解决方法: 1. 数据采集卡与硬件兼容性问题 问题描述:某些数据采集卡(DAQ)与硬件设备的兼容性问题可能…...
MFC程序设计(四)窗口创建机制
钩子函数 钩子属于win32技术,具有优先勾取消息的权利:当一个消息产生时,钩子勾取消息进行处理,然后消息才送回程序 接下来以一个勾取窗口创建消息的钩子为例进行讲解 钩子类型有键盘钩子,鼠标钩子,WH_CBT…...
【JavaEE进阶】Spring留言板实现
目录 🎍预期结果 🍀前端代码 🎄约定前后端交互接口 🚩需求分析 🚩接口定义 🌳实现服务器端代码 🚩lombok介绍 🚩代码实现 🌴运行测试 🎄前端代码实…...
Unity开发一个单人FPS游戏的教程总结
这个系列的前几篇文章介绍了如何从头开始用Unity开发一个FPS游戏,感兴趣的朋友可以回顾一下。这个系列的文章如下: Unity开发一个FPS游戏_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个FPS游戏之二_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个F…...
论文速读|Is Cosine-Similarity of Embeddings Really About Similarity?WWW24
论文地址: https://arxiv.org/abs/2403.05440 https://dl.acm.org/doi/abs/10.1145/3589335.3651526 bib引用: inproceedings{Steck_2024, series{WWW ’24},title{Is Cosine-Similarity of Embeddings Really About Similarity?},url{http://dx.doi.o…...
71.在 Vue 3 中使用 OpenLayers 实现按住 Shift 拖拽、旋转和缩放效果
前言 在前端开发中,地图功能是一个常见的需求。OpenLayers 是一个强大的开源地图库,支持多种地图源和交互操作。本文将介绍如何在 Vue 3 中集成 OpenLayers,并实现按住 Shift 键拖拽、旋转和缩放地图的效果。 实现效果 按住 Shift 键&#…...
PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(上.文章部分)
一、引言 1.1 研究背景与意义 在数字化时代,医疗行业正经历着深刻的变革,智能化技术的应用为其带来了前所未有的发展机遇。随着医疗数据的指数级增长,传统的医疗诊断和治疗方式逐渐难以满足现代医疗的需求。据统计,全球医疗数据量预计每年以 48% 的速度增长,到 2025 年将…...
250125-package
1. 定义 包就是文件夹,作用是在大型项目中,避免不同人的编写的java文件出现同名进而导致报错;想象一个场景,在一个根目录中,每一个人都有自己的一个java文件夹,他可以将自己编写的文件放在该文件夹里&…...
左右互博02-unidbg主动调用外层so函数
unidbg 代码 ` package com.koohairev.demo;import com.github.unidbg.AndroidEmulator; import com.github.unidbg.LibraryResolver; import com.github.unidbg.Module; import com.github.unidbg.Symbol; import com.github.unidbg.arm.backend.DynarmicFactory; import com.…...
FastExcel的使用
前言 FastExcel 是一款基于 Java 的开源库,旨在提供快速、简洁且能解决大文件内存溢出问题的 Excel 处理工具。它兼容 EasyExcel,提供性能优化、bug 修复,并新增了如读取指定行数和将 Excel 转换为 PDF 的功能。 FastExcel 的主要功能 高性…...
均值(信息学奥赛一本通-1060)
【题目描述】 给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。 【输入】 输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过1000的…...
Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)
redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…...
python3+TensorFlow 2.x(三)手写数字识别
目录 代码实现 模型解析: 1、加载 MNIST 数据集: 2、数据预处理: 3、构建神经网络模型: 4、编译模型: 5、训练模型: 6、评估模型: 7、预测和可视化结果: 输出结果ÿ…...
基础项目——扫雷(c++)
目录 前言一、环境配置二、基础框架三、关闭事件四、资源加载五、初始地图六、常量定义七、地图随机八、点击排雷九、格子类化十、 地图类化十一、 接口优化十二、 文件拆分十三、游戏重开 前言 各位小伙伴们,这期我们一起学习出贪吃蛇以外另一个基础的项目——扫雷…...
记录备战第十六届蓝桥杯的过程
1.学会了原来字符串也有比较方法,也就是字符串987 > 98 等等,可以解决拼最大数问题 题目链接:5.拼数 - 蓝桥云课 (lanqiao.cn) 2.今天又复习了一下bfs,感觉还是很不熟练,可能是那个过程我些许有点不熟悉ÿ…...
[操作系统] 深入进程地址空间
程序地址空间回顾 在C语言学习的时,对程序的函数、变量、代码等数据的存储有一个大致的轮廓。在语言层面上存储的地方叫做程序地址空间,不同类型的数据有着不同的存储地址。 下图为程序地址空间的存储分布和和特性: 使用以下代码来验证一下…...
JAVA(SpringBoot)集成Kafka实现消息发送和接收。
SpringBoot集成Kafka实现消息发送和接收。 一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者 君子之学贵一,一则明,明则有功。 一、Kafka 简介 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台,最初由 Link…...
OpenCV:图像处理中的低通滤波
目录 简述 什么是低通滤波? 各种滤波器简介与实现 方盒滤波 均值滤波 中值滤波 高斯滤波 双边滤波 各种滤波的对比与应用场景 相关阅读 OpenCV基础:图像变换-CSDN博客 OpenCV:图像滤波、卷积与卷积核-CSDN博客 简述 低通滤波是一…...
99.17 金融难点通俗解释:归母净利润
目录 0. 承前1. 简述2. 比喻:小明家的小卖部2.1 第一步:计算收到的所有钱2.2 第二步:减去各种支出2.3 第三步:计算能带回家的钱 3. 生活中的例子3.1 好的经营情况3.2 一般的经营情况3.3 不好的经营情况 4. 小朋友要注意4.1 为什么…...
32、【OS】【Nuttx】OSTest分析(1):stdio测试(二)
背景 接上篇wiki 31、【OS】【Nuttx】OSTest分析(1):stdio测试(一) 继续stdio测试的分析,上篇讲到标准IO端口初始化,单从测试内容来说其实很简单,没啥可分析的,但这几篇…...
OpenAI掀桌子!免费版ChatGPT,提供o3-mini模型!
逆天免费用 今天凌晨,OpenAI联合创始人兼首席执行官Sam Altman宣布了一个大消息——免费版ChatGPT,将提供o3-mini模型! 网页们纷纷不淡定了 看来OpenAI,这o3-mini还没正式上线呢,就免费开放使用了。 不过还是要感谢…...
