数据结构 | 算法的时间复杂度和空间复杂度【详解】
数据结构 | 算法的时间复杂度和空间复杂度【详解】
1. 什么是数据结构?
数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。
2. 什么是算法?
算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。
3. 算法效率
-
算法效率是指算法执行的时间,算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。在现在的计算机硬件环境中,比较少需要考虑这个问题了,特别是pc机的编程,内存空间越来越大,所以被考虑得也越来越少,不过一个好的程序员,都应该对自己的程序有要求,每一个for比别人少一次判断1000个for就能够少掉很多的运行时间。所以能够理解,能够大概的去运用"效率度量"还是有很大意义的。 -
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个
算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算 机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。
4. 时间复杂度
4.1 时间复杂度的概念
- 时间复杂度的定义:
- 在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个 分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为
算法的时间复杂度。
- 在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一 个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个 分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为
即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度。
实际中我们计算时间复杂度的时候其实并不需要计算精确的执行次数,而只需要知道大概执行次数,所以这里我们引入了大O的渐进表示法。其中大O符号是用于描述函数渐进行为的数学符号。
案例1:
请计算一下Func1中++count语句总共执行了多少次?
- 如果用一个函数F(N)来解释的话,怎么解释?【F(N) = N*N + 2N + 10】这是一个
函数式
这并不方便我们进行比较,能不能简化一下?
这里的时间复杂度是要取影响最大的项
大O渐进表示法:估算–>O(N^2)–>O(N)
我们这里不关心硬件,相同的配置N比N^2的程序要快
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);
}
Func1 执行的基本操作次数 :
- N = 10 F(N) = 130
- N = 100 F(N) = 10210
- N = 1000 F(N) = 1002010
实际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要大概执行次数,那么这里我们使用大O的渐进表示法。
4.2 推导大O阶的方法:
大 O 表示法是一种计算机科学和算法分析中常用的渐进表示法,用于描述算法的时间复杂度和空间复杂度。它帮助我们衡量算法在输入规模增加时,运行时间或内存使用的增长趋势,而不需要精确地测量或比较具体的运行时间。
大 O 表示法使用 “O(f(n))” 的形式,其中 “f(n)” 表示输入规模 “n” 的函数。这意味着当输入规模足够大时,算法的运行时间或内存使用将以 “f(n)” 函数的方式增长。以下是一些常见的大 O 表示法及其含义:
- O(1):常数时间复杂度
表示算法的运行时间不受输入规模的影响,无论输入有多大,运行时间都是固定的。 - O(log n):对数时间复杂度
表示算法的运行时间以对数方式增长,通常见于二分查找等分治算法。 - O(n):线性时间复杂度
表示算法的运行时间与输入规模线性增长,随着输入规模增加,运行时间也会线性增加。 - O(n log n):线性对数时间复杂度
表示算法的运行时间随着输入规模的对数线性增加,常见于快速排序和归并排序等算法。 - O(n^2):二次时间复杂度
表示算法的运行时间与输入规模的平方成正比,通常见于嵌套循环等情况。 - O(n^k):多项式时间复杂度
表示算法的运行时间与输入规模的 k 次方成正比,其中 k 为常数。 - O(2^n):指数时间复杂度
表示算法的运行时间随着输入规模的指数级增长,通常表示算法的效率非常低。 - O(n!):阶乘时间复杂度
表示算法的运行时间随着输入规模的阶乘级增长,通常表示算法的效率非常低。 - 大 O 表示法的目的是为了提供算法效率的一种抽象概念,让人们能够更容易比较不同算法的性能,并估计它们在大规模输入下的行为。通过了解算法的大 O 复杂度,开发者可以选择合适的算法来解决问题,以便在实际应用中获得更好的性能。

使用大O的渐进表示法以后,Func1的时间复杂度为:
- N = 10 F(N) = 100
- N = 100 F(N) = 10000
- N = 1000 F(N) = 1000000
4.3 常见时间复杂度计算举例:
接下来就看看下面这几个案例,相信你看完就有一定的了解
实例2:
计算Func2的时间复杂度?
- 我们前期就一点一点的算,
F(N) = 2N + 10 - 时间复杂度是什么?【O(N)】
- 就是取最大的那一项,当N无限大的时候
N和2N没有区别,所以系数要去掉 - 时间复杂度不是算次数,是算量级
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);
}
实例3:
计算Func3的时间复杂度?
- 如果不确定M和N的关系,可能M很大,可能N很大–>
O(M+N)或者O(max(M,N)) - 如果N远大于M–>
O(N) - 如果M远大于N–>
O(M) - 如果N和M差不多大–>
O(N)orO(M)
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);
}
实例4:
计算Func4的时间复杂度?
- 这里可以看到k循环了100次,那么他是
O(100)吗?【不是!】是O(1)
注意: O(1)并不是代表一次,而是常数次!
void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++k){++count;}printf("%d\n", count);
}
小结一下:
- 大O阶的方法:
- 用常数1取代运行时间中的所有加法常数
- 在修改后的运行次数函数中,只保留最高阶项,取决定性的那一项
- 如果最高阶项存在且系数是不唯1的常系数,则去除最高项的系数,得到的结果就是大O阶
- 如果最终结果是O(1),则表示常数次,并不是代表一次
- 还有就是没有小o阶~~
实例5:
计算strchr的时间复杂度?
const char* strchr(const char* str, int character);
while (*str) {if (*str == character)return str;++str;
}
- 这个函数有可能有的同学没有见过,这是C语言库里面的一个函数strchr,是定位字符串中出现的第一个字符
- 可能在前面的位置找到了(最好),肯在中间的位置找到了(平均),还有肯在最后的位置找到了(最坏)

小结一下:
-
最坏情况:
- 任意输入规模的最大运行次数(上界)
-
平均情况:
- 任意输入规模的期望运行次数
-
最好情况:
- 任意输入规模的最小运行次数(下界)
- 一般我们比较关心的是一个算法的最坏情况
-
如果有最好,最坏,平均,那么时间复杂度是一个保守的估算,是取
最坏,这是最好的!!!
实例6:
计算BubbleSort的时间复杂度?
- 很多同学一眼看他是
O(N^2),那么他是O(N^2)吗?接下来接着看
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^2),它是O(N^2)吗?–>继续接着往下看!
int PartSort1(int* a, int left, int right) {int keyi = left;while (left < right) {while (left < right && a[right] >= a[keyi]) {--right;}while (left < right && a[left <= a[keyi]]) {++left;}Swap(&a[left], &a[right]);}Swap(&a[left], &a[right]);
}
我们上面都是看的循环,但是我们要看思想,不能只看循环,第一个是–>O(N^2)第二个是O(N)
你算对了吗?
- 首先我们先看第一个冒泡排序的时间复杂度,如图:

- 再来看第二个
PartSort1,当left和right相遇时,时间复杂度是O(N)

小结一下:
- 时间复杂度不能数代码中的循环
- 而是需要根据思想进行灵活计算!!!
实例7:
计算BinarySearch的时间复杂度?
- 这里一眼看就是一个二分查找~~
- 我们这里的是不是复杂度数
O(N)?
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(logN),我们这里看代码是看不出来的,要看思想~~ - 首先二分查找的前提是
有序

-
这个数组假设有n个值
-
n/2/2/…/2 = 1(最坏的情况~~)
-
我们这里除了多少个2?
找了多少次就除了多少个2 -
假设找了x次–>
2^x = N-->x = logN

我们这里的这个以2为底的logN是不是很不好写…我们平时就可以不写了~~,直接写成
O(logN)
但是有的书或者博客上面写成O(lgN),我们不建议~~,和我们数学里面是有些混淆的
学了复杂度我们要指定
O(logN)是一个很腻害的算法我们下面进行对照~~
- 这里对应的有暴力查找(数组过一遍查找):
O(N) - 二分查找:
O(logN)
比如:

- 如果我把中国所有人的信息放到一个数组中,我们要找多少次?
我们就只需要找
31次,是不是很厉害~~
- 我们这里前提是要有序,有序是要有代价的,需要排序,如果有一个新生儿出生了,就要插入,如果有人离世了,就要删除了,这就很难~~
- 这里有更好的数据结构,有:AVL树,红黑树,哈希表,这些我们后面都会讲解~~
实例8:
计算阶乘递归Fac的时间复杂度?
- 首先来看这是一个阶乘,很多同学肯一看是
O(1),又不太敢确认 - 我们先说结论—>
O(N)
long long Fac(size_t N)
{if (0 == N)return 1;return Fac(N - 1) * N;
}

- 阶乘是不是有多次函数的调用,每次调用是常数次
O(N),有N次调用就是O(N)~~
我们再来变一下形~~,我们来看下面,这个的时间复杂度是多少呢?
- 我们先说结果–>
O(N^2),然后我们进行分析~~
long long Fac(size_t N)
{if (0 == N)return 1;for (size_t i = 0; i < N; ++i){//....}return Fac(N - 1) * N;
}
- 这里是咋算的?
- 每次递归走了一次循环,递归计算的是多次调用累加,多少次调用?N次调用,每次调用多少趟?这不是N,每次都在变化,当N为10时,循环走10次,当N是9时,循环走9次
- 递归次数累加是一个等差数列
(0~N)的等差数列 - 所以就是
O(N^2)~~
实例9:
计算斐波那契递归Fib的时间复杂度?
- 斐波那契数列类似于细胞分裂,一个分裂成两个,两个分裂成4个…
long long Fib(size_t N)
{if (N < 3)return 1;return Fib(N - 1) + Fib(N - 2);
}
- 这里仔细看,这是一个等比数列和~~

- 这里可以用到错位相减法,如图:

- 根据大O渐进表示法,时间复杂度也就是
O(2^N),这是一个成指数增长的~~
5.空间复杂度
- 空间复杂度也是一个数学表达式,是对一个算法在运行过程中临时
额外占用存储空间大小的量度。空间复杂度不是程序占用了多少bytes的空间,因为这个也没太大意义,所以空间复杂度算的是变量的个数。 - 空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。
- 注意: 函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。
案例1:
计算BubbleSort的空间复杂度?
- 这里的这个空间复杂度是多少?—>>
O(N)还是O(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(1)
下面这种算法是经典的
O(N)
案例2:
计算Fibonacci的空间复杂度?
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;
}
- 这里我们
malloc了·n+1·个空间 - 其他的都忽略掉,所以就是O(N)
案例3:
计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}
- 这里递归空间复杂度计算,也是空间累加,但是不同的是空间可以重复利用
- 所以这里就是
O(N)
6.复杂度的oj练习
6.1 消失的数字
OJ链接
- 这里题目要求在时间复杂度上
O(n)我们介绍三种方法,看看哪种方法适合这道题~~

方法一:
- 先冒泡排序
- 遍历,当前值+1,不等于下一个数
这个时间复杂度是
O(N^2)
方法二:
- 将数组的每个元素异或0
- 遍历,再将异或出来的结果每个再异或
这个时间复杂度是
O(N)
方法三:
- 0到n等差数列公式计算和
((首项 + 尾项) * 项数)/2 - 依次减掉数据中的值,剩下的就是消失的数字
这个时间复杂度是
O(N)
- 可见只有方法二和方法三符合题目要求,下面我们就写一下这个代码
方法二的代码:
int missingNumber(int* nums, int numsSize){int N = numsSize;int sum = ((0+N)*(N+1))/2;for(int i= 0;i<numsSize;i++){sum-=nums[i];}return sum;
}
方法三的代码:
int missingNumber(int* nums, int numsSize){int x = 0;for(int i = 0;i<numsSize;i++){x^=nums[i];}for(int i = 0;i<=numsSize;i++){x^=i;}return x;
}
6.2 旋转数组
OJ链接

- 我们这个题肯有些同学在C语言的时候做过
我们先来看思路一:

- 思路一的时间复杂度是多少?
- 可能有的同学算出来的是
O(N*K),不完全正确~~
- 可能有的同学算出来的是
- 最好的情况:k % N = 0,k = 7,旋转0次!!!是
O(1)。k是N的倍数时,不需要旋转~~ - 最坏的情况:k % N = N - 1时,比如13次旋转的最多,20次最多…
- 所以这个题的真正复杂度是
O(N*(N-1))—>O(N^2)
那么我们要求时间复杂度是
O(N),那么我们怎么优化呢?
我们这里就要看思路二:

- 这里很明显是
O(N)
代码如下:
void reverse(int* nums,int left,int right){while(left<right){int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;left++;right--;}
}
void rotate(int* nums, int numsSize, int k){if(k>numsSize){k %=numsSize;}reverse(nums,0,numsSize-1);reverse(nums,0,k-1);reverse(nums,k,numsSize-1);
}
- 注意这里k一定要%numsSize,否则会报错~~
思路三:
空间换时间

- 这里的时间复杂是
O(N),空间复杂度是O(N)
代码如下:
void rotate(int* nums, int numsSize, int k) {k %= numsSize;int tmp[numsSize];int j = k;//拷贝前n-k个for (int i = 0; i < numsSize - k; i++) {tmp[j++] = nums[i];}//拷贝后k个j = 0;for (int i = numsSize - k; i < numsSize; i++) {tmp[j++] = nums[i];}//拷贝回原数组for (int i = 0; i < numsSize; i++) {nums[i] = tmp[i];}
}
好了,数据结构的算法的时间复杂度和空间复杂度到这里就结束了~~
如果有什么问题可以私信我或者评论里交流~~
感谢大家的收看,希望我的文章可以帮助到正在阅读的你🌹🌹🌹
相关文章:
数据结构 | 算法的时间复杂度和空间复杂度【详解】
数据结构 | 算法的时间复杂度和空间复杂度【详解】 1. 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 2. 什么是算法? 算法(Algorithm):就是定义良好的计算过…...
高级篇之ENC编码器多机位帧同步配置详解
高级篇之ENC编码器多机位帧同步配置详解 一 帧同步方案多样性1. 配合vMIX导播的帧同步方案3. 配合硬件导播的帧同步方案3. 配合芯象导播的帧同步 二 帧同步方案1实现步骤1. 准备设备2. 搭建环境3 配置设备3.1 配置固定机位3.2 配置帧同步转发端3.3 配置vMIX 三 效果对比1 不开帧…...
matlab simulink 四旋翼跟拍无人机仿真
1、内容简介 略 7-可以交流、咨询、答疑 2、内容说明 四旋翼跟拍无人机仿真 四旋翼、无人机 需求分析 背景介绍 无人飞行机器人,是无人驾驶且具有一定智能的空中飞行器。这是一种融合了计算机技术、人工智能技术、传感器技术、自动控制技术、新型材料技术、导航…...
jenkins、ant、selenium、testng搭建自动化测试框架
如果在你的理解中自动化测试就是在eclipse里面讲webdriver的包引入,然后写一些测试脚本,这就是你所说的自动化测试,其实这个还不能算是真正的自动化测试,你见过每次需要运行的时候还需要打开eclipse然后去选择运行文件吗ÿ…...
【阅读和学习代码】VoxelNet
文章目录 将点特征 转换为 voxel 特征稀疏张量 到 稠密张量,反向索引参考博客 将点特征 转换为 voxel 特征 https://github.com/skyhehe123/VoxelNet-pytorch/blob/master/data/kitti.py 【Python】np.unique() 介绍与使用 self.T : # maxiumum numbe…...
【23种设计模式】接口隔离原则
个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…...
【Python机器学习】零基础掌握PartialDependenceDisplay检验、检查
如何更好地理解模型对特定特征的依赖性?如何使用历史数据来预测明天股票市场的走势? 想象一下,作为一名数据分析师,面对海量的数据,如何准确地预测明天股票市场的走势?这是一个复杂且具有挑战性的问题。但别担心,有一种神奇的工具可以帮助解析模型对各种因素(特征)的…...
Jmeter的接口自动化测试
在去年实施了一年的三端(PC、无线M站、无线APP【Android、IOS】)后,今年7月份开始,我们开始进行接口自动化的实施,目前已完成了整个框架的搭建以及接口的持续测试集成。今天做个简单的分享。 在开始自动化投入前&#…...
windows c++获取开机启动项
#include <iostream> #include <Windows.h> #include <string> #define RUN_LOCATION "Software\\Microsoft\\Windows\\CurrentVersion\\Run" int main() { HKEY hKey; LONG result; // 打开注册表键 result = RegOpenKeyExA(HKEY_CU…...
【C++初阶】类和对象——构造函数析构函数拷贝构造函数
个人主页点击直达:小白不是程序媛 C系列专栏:C头疼记 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构造函数 概念 拷贝构造函数特性 总结 前言 上篇文章我们对于C中的类有了初步的认识和…...
Java实现SQL分页
在日常开发需要对数据进行分页,配置如下 <!-- baomidou --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency> 在控…...
软件测试进阶篇----自动化测试脚本开发
自动化测试脚本开发 一、自动化测试用例开发 1、用例设计需要注意的点 2、设计一条测试用例 二、脚本开发过程中的技术 1、线性脚本开发 2、模块化脚本开发(封装线性代码到方法或者类中。在需要的地方进行调用) 3、关键字驱动开发:selen…...
rust std
目录 一,std基本数据结构 1,std::option 2,std::result 二,std容器 1,vector 三,std算法 1,排序 2,二分 (1)vector二分 (2)…...
SpringMVC(下)
1、拦截器: 1、拦截器的配置: SpringMVC中的拦截器用于拦截控制器方法的执行 SpringMVC中的拦截器需要实现HandlerInterceptor <!--配置拦截器--><mvc:interceptors><!--对所有的请求进行拦截--><!--<bean class"com.songzhishu.m…...
分布式操作系统的必要性及重要性
总有人在各个平台留言或者私信问LAXCUS分布式操作系统的各种问题,尤其是关于分布式操作系统的应用市场、价值、意义之类的问题。我们团队做LAXCUS分布式操作系统,也不是头脑凭空发热,是基于我们之前的大量产品设计、经验逐渐一步步做起来。当…...
【Javascript】定时器
目录 延迟执行 定时执行 清除定时任务 延迟执行 setTimeout(function(){}, 毫秒) console.log(1); console.log(2); console.log(3); setTimeout(function (){console.log(5) },5000) console.log(4);setTimeout(function (){ console.log(5) },5000) 设定了一个任务&…...
基于stm32的ADC读取烟雾报警器的数值
本文想要设计一个设计一个有stm32控制的烟雾报警系统。通过MQ-2烟雾报警器将获取模拟的数值传递给stm32的ADC外设并在串口助手上显示对应的电压值。烟雾报警器浓度越高,他的电压就越高,但是不会超过3.3V。设置一个电压临界值,当传输回来的电压…...
无需更换vue-cli 脚手架 uniapp-搭建项目-H5-低版本安卓IOS兼容问题(白屏)(接口请求异常)
✨求关注~ 💻博客:www.protaos.com I. 简介 A. UniApp项目概述 B. 白屏和接口请求异常问题的背景 II. 白屏问题 A. 问题描述 1、uniapp 打包H5内嵌入APP内、低版本手机系统访问白屏问题 B. 问题根本原因 1、低版本手机系统 自带的webview内核不支持ES6语…...
【IO面试题 四】、介绍一下Java的序列化与反序列化
文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:介绍一下Java的序列化与…...
M1本地部署Stable Diffusion
下载安装 参考博客: 在Mac上部署Stable Diffusion(超详细,AI 绘画入门保姆级教程) 安装需要的依赖库 brew install cmake protobuf rust python3.10 git wget 可能中途会存在下载报错或者下载卡主的问题,需要切国内源 brew进行替换源: …...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...


