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

算法效率的钥匙:从大O看复杂度计算 —— C语言数据结构第一讲

目录

1.数据结构与算法

1.1数据结构介绍

1.2算法介绍 

2.算法效率

2.1复杂度

2.1.1时间复杂度

2.1.1.1时间复杂度计算示例1

 2.1.1.2时间复杂度计算示例2

  2.1.1.3时间复杂度计算示例3

  2.1.1.4时间复杂度计算示例4

   2.1.1.5时间复杂度计算示例5

   2.1.1.6时间复杂度计算示例6

    2.1.1.7时间复杂度计算示例7

2.1.2空间复杂度 

2.1.1.1空间复杂度计算示例1

 2.1.1.2空间复杂度计算示例2

2.2常见复杂度对比

2.3复杂度笔试题 


在之前的博文中,我们基本介绍完了C语言的语法知识,例如分支循环,指针和结构体等知识,今天我们终于要进入到学习数据结构的知识殿堂中,一起加油!!!


1.数据结构与算法

1.1数据结构介绍

数据结构是什么,它对我们有什么用处,我们为什么要学习它?抱着这样的疑问,我们先来介绍数据结构的概念。

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在⼀种或多种特定关系的数据元素的集合。没有⼀种单⼀的数据结构对所有用途都有用,所以我们要学各式各样的数据结构,
如:线性表、树、图、哈希等

数据结构,数据与结构,其实就是各种数据结合形成了不同的结构,数据本身是离散的、无组织的,而通过不同的结构设计,我们可以将数据以特定方式组织起来,从而实现高效的存储、访问和操作。在C语言中,结构体(struct)和指针(*)是实现复杂数据结构的关键工具。我们接下来学习每一种数据结构基本都要用到这两项工具,所以结构体和指针的知识一定要掌握扎实。


1.2算法介绍 

什么是算法?
用通俗的话说,算法就是解决问题的明确步骤。就像烹饪食谱一样,算法规定了一系列操作,将输入(如食材)通过有限步骤转化为输出(如菜肴)。在编程中,程序就是一道道算法的具体体现。

我们之所以学习数据结构就是为了学习优质的算法解决问题,比如数组,他帮助我们将一类数据连续存储在内存中,方便我们查找,修改,销毁。利用结构的优势设计出高效的设计,减少冗余代码。


2.算法效率

如何衡量一个算法的好坏呢?

我们来看一个题:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。这个代码的实现并不难,我们只需要循环 k 次将数组所有元素向后移动一位就行了,代码如下:

void rotate1(int* arr, int sz, int k)
{for (int i = 0; i < k; i++)//循环k次{int tmp = arr[sz-1];for (int j = sz - 1; j > 0; j--)//数组元素向后移动一位{arr[j] = arr[j - 1];}arr[0] = tmp;}
}int main()
{int arr[5] = { 1,2,3,4,5 };int sz = sizeof(arr) / sizeof(arr[0]);int k = 0;scanf("%d", &k);rorate(arr, sz, k);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

上面这个代码已经可以满足题目的要求,但是有没有感觉这个程序的效率太低了,如果 k 值很大并且数组长度很长,那么这个循环简直不敢想象会进行多少次,有没有办法优化一下,经过观察,我们可以发现,如果 k 值等于数组长度的时候,旋转完后相当于没有旋转,所以我们可以这样改进:

void rotate2(int* arr, int sz, int k)
{int new_arr[5];//将排好的数组先存入新数组中for (int i = 0; i < sz; i++){new_arr[(i + k) % sz] = arr[i];//不管k为多大,(i+k)%sz都不会大于sz}for (int i = 0; i < sz; i++){arr[i] = new_arr[i];}
}

rorate2 和 rorate1 实现效果相同,但在效率上要比 rorate1 强上很多,重复代码运行次数大大减少,那到底好多少呢?有没有一个定义,当然有,接下来我们就要引进复杂度的概念。


2.1复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好 坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
时间复杂度主要衡量⼀个算法的运行快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间。 在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注⼀个算法的空间复杂度。(并不是完全不重重,是相对时间来说的)

2.1.1时间复杂度

定义:在计算机科学中,算法的时间复杂度是⼀个函数式T(N),它定量描述了该算法的运⾏时间。时间复杂度是衡量程序的时间效率,那么 为什么不去计算程序的运行时间呢
1. 因为程序运⾏时间和编译环境和运⾏机器的配置都有关系,⽐如同⼀个算法程序,⽤⼀个⽼编译器进⾏编译和新编译器编译,在同样机器下运⾏时间不同。
2. 同⼀个算法程序,⽤⼀个⽼低配置机器和新⾼配置机器,运⾏时间也不同。
3. 并且时间只能程序写好后测试,不能写程序前通过理论思想计算评估。
那么算法的时间复杂度是⼀个函数式T(N)到底是什么呢?这个T(N)函数式计算了程序的 执行次数 。通过c语⾔编译链接章节学习,我们知道算法程序被编译后⽣成⼆进制指令,程序运⾏,就是cpu执行这些编译好的指令。那么我们通过程序代码或者理论思想计算出程序的执⾏次数的函数式T(N),假设每句指令执⾏时间基本⼀样(实际中有差别,但是微乎其微),那么执行次数和运行时间就是等比正相关,这样也脱离了具体的编译运行环境。执行次数就可以代表程序时间效率的优劣。比如解决⼀个问题的算法a程序T(N) = N,算法b程序T(N) = N^2,那么算法a的效率⼀定优于算法b。
我们来看一个案例:
实际中我们计算时间复杂度时,计算的也不是程序的精确的执行次数,精确执行次数计算起来是很麻烦的(不同的⼀句程序代码,编译出的指令条数都是不⼀样的),计算出精确的执行次数意义也不大,因为我们计算时间复杂度只是想比较算法程序的增长量级,也就是当N不断变⼤时T(N)的差别,上面我们已经看到了 当N不断变大时常数和低阶项对结果的影响很小,所以我们只需要计算程序能代表增长量级的大概执行次数,复杂度的表示通常使用大O的渐进表示法。

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

推导大O阶规则
1. 时间复杂度函数式T(N)中,只保留最高阶项,去掉那些低阶项,因为当N不断变大时,
低阶项对结果影响越来越小,当N无穷大时,就可以忽略不计了。
2. 如果最高阶项存在且不是1,则去除这个项目的常数系数,因为当N不断变大,这个系数
对结果影响越来越小,当N无穷大时,就可以忽略不计了。
3. T(N)中如果没有N相关的项目,只有常数项,⽤常数1取代所有加法常数。

通过以上方法,可以得到 Func1 的时间复杂度为: O(N^2 )

2.1.1.1时间复杂度计算示例1
// 计算Func2的时间复杂度?
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执⾏的基本操作次数:
T ( N ) = 2 N + 10
根据推导规则第2条和第3条得出
Func2的时间复杂度为: O ( N )
 2.1.1.2时间复杂度计算示例2
// 计算Func3的时间复杂度?
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);
}
Func3执⾏的基本操作次数:
T ( N ) = M + N

在这里M和N都是变量,我们并知道它们的大小,所以并不能轻易删去任何一个

Func2的时间复杂度为: O(M+N)

如果M>>N,那么时间复杂度为O(M)

如果M<<N,那么时间复杂度为O(N)

如果M==N,那么时间复杂度为O(M+N)(并不是完全相等,是对计算机来说指M和N的差值并不大)

  2.1.1.3时间复杂度计算示例3
// 计算Func4的时间复杂度?
void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++k){++count;}printf("%d\n", count);
}
Func4执⾏的基本操作次数:
T ( N ) = 100
根据推导规则第1条得出
Func2的时间复杂度为: O (1)
注意:无论这里执行次数是一万还是一亿,最后的时间复杂度都是O(1)
  2.1.1.4时间复杂度计算示例4
// 计算strchr的时间复杂度?
const char* strchr(const char* str, int character)
{const char* p_begin = s;while (*p_begin != character){if (*p_begin == '\0')return NULL;p_begin++;}return p_begin;
}
注意:这个代码的时间复杂度为多少取决于他要找的那个字符在字符串的什么位置。
strchr执⾏的基本操作次数:
1)若要查找的字符在字符串第⼀个位置,则: T ( N ) = 1
2)若要查找的字符在字符串最后的⼀个位置, 则: T ( N ) = N
3)若要查找的字符在字符串中间位置,则: T ( N ) = N/2
因此:strchr的时间复杂度分为:
最好情况: O (1)
最坏情况: O ( N )
平均情况: O ( N )
大O的渐进表示法在实际中⼀般情况取的是算法的上界,也就是最坏运行情况。
所以strchr的时间复杂度为O(N)
   2.1.1.5时间复杂度计算示例5
// 计算BubbleSort的时间复杂度?
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;}
}

 BubbleSort执行的基本操作次数:

如果数组是有序数组,只需要进行n-1次比较,T(N)=N

如果数组有序但为降序,则需要进行n-1轮比较,第k轮需要比较n-k次,所以T(N)=(n*(n-1))/2

取平均情况,则进行约n^2/2次比较,T(N)=n^2/2

因此:BubbleSort 的时间复杂度分为:
最好情况: O (N)
最坏情况: O ( N^2 )
平均情况: O ( N^2 )
   2.1.1.6时间复杂度计算示例6
// 计算Func5的时间复杂度?
void func5(int n)
{int cnt = 1;while (cnt < n){cnt *= 2;}
}
当n=2时,执⾏次数为1
当n=4时,执⾏次数为2
当n=16时,执⾏次数为4
假设执⾏次数为 x ,则 2 ^x   = n
因此执⾏次数: x = log2  n
因此:func5的时间复杂度取最差情况为:
O (log 2 n )
注意log2 n 、 log n 、 lg n 的表表示
当n接近无穷大时,底数的大小对结果影响不大。因此,⼀般情况下不管底数是多少都可以省略不 写,即可以表示为 log n 不同书籍的表示方式不同,以上写法差别不大,我们建议使用 log n
    2.1.1.7时间复杂度计算示例7
// 计算阶乘递归Fac的时间复杂度?
long long Fac(size_t N)
{if (0 == N)return 1;return Fac(N - 1) * N;
}
调⽤⼀次Fac函数的时间复杂度为 O (1)
⽽在Fac函数中,存在n次递归调⽤Fac函数
因此:
阶乘递归的时间复杂度为: O ( n )

我们需要掌握一些简单程序的时间复杂度的计算方法,以上示例都比较重要,需要自己能够独立算出。


2.1.2空间复杂度 

空间复杂度也是⼀个数学表达式,是对⼀个算法在运⾏过程中因为算法的需要额外临时开辟的空间。空间复杂度不是计算程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很⼤,所以空间复杂度算的是变量的个数。
空间复杂度计算规则基本跟时间复杂度类似,也使⽤大O渐进表示法。
注意:函数运行时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定
2.1.1.1空间复杂度计算示例1
// 计算BubbleSort的时间复杂度?
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;}
}
函数栈帧在编译期间已经确定好了,只需要关注函数在运行时额外申请的空间。
BubbleSort额外申请的空间有exchange等有限个局部变量,使用了常数个额外空间
因此空间复杂度为 O (1)
 2.1.1.2空间复杂度计算示例2
// 计算阶乘递归Fac的空间复杂度?
long long Fac(size_t N)
{if (N == 0)return 1;return Fac(N - 1) * N;
}
Fac递归调⽤了N次,额外开辟了N个函数栈帧,每个栈帧使⽤了常数个空间
因此空间复杂度为: O ( N )

2.2常见复杂度对比

2.3复杂度笔试题 

 这个题在我们介绍复杂度的时候已经解答过,但是我们看该题的进阶,使用复杂度为O(1)的原地算法解题?这是什么意思呢?我们先将rotate1rotate2两个函数拿过来,根据前面所学的知识,计算一下它们的时间复杂度和空间复杂度。

//申请新数组空间,先将后k个数据放到新数组中,再将剩下的数据挪到新数组中
void rotate2(int* arr, int sz, int k)
{int new_arr[5];//将排好的数组先存入新数组中for (int i = 0; i < sz; i++){new_arr[(i + k) % sz] = arr[i];//不管k为多大,(i+k)%sz都不会大于sz}for (int i = 0; i < sz; i++){arr[i] = new_arr[i];}
}//循环K次将数组所有元素向后移动⼀位
void rotate1(int* arr, int sz, int k)
{for (int i = 0; i < k; i++)//循环k次{int tmp = arr[sz-1];for (int j = sz - 1; j > 0; j--)//数组元素向后移动一位{arr[j] = arr[j - 1];}arr[0] = tmp;}
}

经过计算,得出: 

rotate1函数rotate2函数
时间复杂度O(N^2)O(N)
空间复杂度O(1)O(N)

我们可以看到 rotate1 函数的空间复杂度为O(1),但是时间复杂度为O(N^2),而 rotate2 函数的时间复杂度仅为为O(N),但是空间复杂度却为O(N),有没有一种算法可以将时间复杂度控制为O(N),空间复杂度又为O(1)呢?

void reverse(int* arr, int begin, int end)
{while (begin < end) {int tmp = arr[begin];arr[begin] = arr[end];arr[end] = tmp;begin++;end--;}
}void rotate3(int* arr, int sz, int k)
{k = k % sz;reverse(arr, 0, sz - k - 1);reverse(arr, sz - k, sz - 1);reverse(arr, 0, sz - 1);
}
算法思路:
假设数组为arr[5] = {1,2,3,4,5},k==2
前sz-k个逆置: 3 2 1  4 5
后k个逆置 :    3 2 1 5 4
整体逆置 :       4 5 1 2 3
rotate3的时间复杂度为O(N),空间复杂度为 O(1)

相关文章:

算法效率的钥匙:从大O看复杂度计算 —— C语言数据结构第一讲

目录 1.数据结构与算法 1.1数据结构介绍 1.2算法介绍 2.算法效率 2.1复杂度 2.1.1时间复杂度 2.1.1.1时间复杂度计算示例1 2.1.1.2时间复杂度计算示例2 2.1.1.3时间复杂度计算示例3 2.1.1.4时间复杂度计算示例4 2.1.1.5时间复杂度计算示例5 2.1.1.6时间复杂度计算示例6…...

AI赋能守护行车安全新防线,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建驾驶车辆场景下驾驶员疲劳分心驾驶行为智能检测预警系统

在当今社会&#xff0c;随着科技生产力的飞速发展&#xff0c;汽车早已成为人们日常出行不可或缺的交通工具。它不仅极大地提高了人们的出行效率&#xff0c;也为生活带来了诸多便利。然而&#xff0c;随着汽车保有量的不断增加&#xff0c;交通安全问题也日益凸显。疲劳驾驶和…...

HNUST湖南科技大学-嵌入式考试选择题题库(109道纠正详解版)

HNUST嵌入式选择题题库 1.下面哪点不是嵌入式操作系统的特点。(B) A.内核精简 B.功能强大 C.专用性强 D.高实时性 解析&#xff1a; 嵌入式操作系统特点是内核精简、专用性强、高实时性&#xff0c;而"功能强大"通常指的是通用操作系统&#x…...

【音视频】SDL事件

SDL 事件 函数 SDL_WaitEvent()&#xff1a; 等待一个事件SDL_PushEvent()&#xff1a; 发送一个事件SDL_PumpEvents()&#xff1a; 将硬件设备产生的事件放入事件队列&#xff0c;用于读取事件&#xff0c;在调用该函数之前&#xff0c;必须调用SDL_PumpEvents搜集键盘等事件…...

[特殊字符]实战:使用 Canal + MQ + ES + Redis + XXL-Job 打造高性能地理抢单系统

&#x1f4da;目录 项目背景 技术栈总览 详细流程分析 3.1 Canal监听MySQL Binlog 3.2 MQ中转传递订单变化 3.3 Elasticsearch存储并查询附近订单 3.4 Redis高性能抢单Lua防止抢单冲突 3.5 XXL-Job定时任务处理 完整系统流程图 总结 一、项目背景 针对类似外卖、跑…...

FPGA基础之基础语法

一、基本模块结构 Verilog 代码以 模块&#xff08;Module&#xff09; 为单位&#xff0c;每个模块对应一个硬件功能单元&#xff08;如逻辑门、寄存器等&#xff09;。 基本格式&#xff1a; module 模块名 (// 输入输出端口声明input 端口1,input 端口2,output 端口3 );…...

影楼精修-皮肤瑕疵祛除算法解析

注意&#xff1a;本文样例图片为了避免侵权&#xff0c;均使用AIGC生成&#xff1b; 顾名思义&#xff0c;皮肤瑕疵祛除旨在祛除人像照片皮肤区域的痘痘/斑点/痣/胎记等瑕疵&#xff1b;当前主流算法方案可分为传统图像处理方法和基于深度学习的方法&#xff0c;本文重点介绍基…...

2025蓝桥杯省赛网络安全组wp

文章目录 黑客密室逃脱ezEvtxflowzipEnigma星际xml解析器EBC-TrainAES-CBC 黑客密室逃脱 提示猜文件名&#xff0c;猜几个常见的&#xff0c;app.py读到源码 这里也是脑抽了一下&#xff0c;把密钥看成1236了。。。卡了五分钟左右&#xff0c;解出来的时候已经降到300多分了&a…...

【数据结构】·励志大厂版(复习+刷题):二叉树

前引&#xff1a;哈喽小伙伴们&#xff01;经过几个月的间隔&#xff0c;还是逃脱不了再次复习的命运&#xff01;&#xff01;&#xff01;本篇文章没有冗杂的闲话&#xff0c;全是干货教学&#xff0c;带你横扫二叉树的几种遍历&#xff0c;怎么前序、、中序、后续&#xff1…...

Spark-Streaming2

一&#xff0e;有状态转化操作 1. UpdateStateByKey UpdateStateByKey 原语用于记录历史记录&#xff0c;有时&#xff0c;我们需要在 DStream 中跨批次维护状态(例如流计算中累加 wordcount)。针对这种情况&#xff0c;updateStateByKey()为我们提供了对一个状态变量的访问&…...

《深入浅出Git:从版本控制原理到高效协作实战》​

Git的原理和使用 1、Git初识与安装2、Git基本操作2.1、创建Git本地仓库2.2、配置Git2.3、认识工作区、暂存区、版本库2.4、修改文件2.5、版本回退2.6、撤销修改2.7、删除文件 3、Git分支管理3.1、理解分支3.2、创建、切换、合并分支3.3、删除分支3.4、合并冲突3.5、合并模式3.6…...

内耗型选手如何能做到不内耗?

以下是针对「内耗型选手」的系统性解决方案&#xff0c;结合认知神经科学、行为心理学和效能管理理论&#xff0c;提供可落地的策略框架&#xff1a; 一、建立「内耗熵值」监测系统 1. 绘制内耗热力图 用时间轴记录每日内耗触发点&#xff1a; 时间段内耗场景能量损耗值&…...

pyspark将hive数据写入Excel文件中

不多解释直接上代码&#xff0c;少python包的自己直接下载 #!/usr/bin/env python # -*- encoding: utf-8 -*- from pyspark.sql import SparkSession import pandas as pd import os# 初始化 SparkSession 并启用 Hive 支持 spark SparkSession.builder \.appName("sel…...

Java大师成长计划之第5天:Java中的集合框架

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在 Java 编程中&#xff0c;集合框架…...

rt-linux下的D状态的堆栈抓取及TASK_RTLOCK_WAIT状态

一、背景 在之前的博客 缺页异常导致的iowait打印出相关文件的绝对路径-CSDN博客 里的 2.1 一节里的代码&#xff0c;我们已经有了一个比较强大的抓取D状态和等IO状态超过阈值的waker和wakee的堆栈状态的内核模块。在之前的博客 增加等IO状态的唤醒堆栈打印及缺页异常导致iowa…...

数据结构【堆和链式结构】

堆和链式结构 1.堆的概念和定义1.1堆1.2二叉树的性质 2.堆的实现3.实现链式二叉树3.1链式二叉树的概念3.2前中后遍历3.3遍历&#xff08;举例&#xff09; 1.堆的概念和定义 1.1堆 定义&#xff1a;是特殊的二叉树 #mermaid-svg-vWPNPMGSLe0nGNcd {font-family:"trebuch…...

聊一聊自动化测试

目录 一、自动化测试的定义与核心价值 &#xff08;一&#xff09;什么是自动化测试 &#xff08;二&#xff09;核心价值&#xff1a;从人工到智能的跨越 二、自动化测试的发展阶段 &#xff08;一&#xff09;萌芽阶段&#xff08;早期&#xff09; &#xff08;二&…...

vue2 开发一个实习管理系统电脑端-前端静态网站练习

为了快速的掌握vue2的所学习到的知识点&#xff0c;最近又使用vue2和element-ui 做了一个实习管理系统来巩固自己的前端技术&#xff0c;我觉得对于新手来说&#xff0c;多写代码&#xff0c;多找一些项目练习&#xff0c;是提供自己编程能力的一个很好的办法&#xff0c;这也是…...

【Hive入门】Hive基础操作与SQL语法:DML操作全面解析

目录 1 Hive DML操作概述 2 数据加载操作 2.1 LOAD DATA语句 2.2 INSERT语句 3 数据导出操作 3.1 INSERT OVERWRITE DIRECTORY 3.2 使用HDFS命令导出 4 数据更新与删除 4.1 UPDATE语句 4.2 DELETE语句 5 MERGE操作&#xff08;Hive 2.2&#xff09; 6 性能优化建议…...

C++类和对象(上)

目录 类的定义类定义格式访问限定符类域 实例化实例化概念对象大小 this指针C和C语言实现Stack对比 类的定义 类定义格式 在下面的代码中&#xff0c;class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c; 注意类定义结束时后面分号不能省…...

LS2K0300龙芯开发板——智能车竞赛

开启 LS2K0300 调车之旅&#xff08;自己写的自己慢慢更&#xff0c;可能写的不好欢迎指教&#xff09; 欢迎大家一起讨论共同进步&#xff01;逐飞科技针对 LS2K0300 MCU 开发的开源库&#xff0c;涵盖多种实用功能&#xff0c;助力竞赛与产品开发。以下是快速上手指南&#…...

电子病历高质量语料库构建方法与架构项目(智能质控体系建设篇)

引言 随着人工智能技术的迅猛发展,医疗信息化建设正经历着前所未有的变革。电子病历作为医疗机构的核心数据资产,其质量直接关系到临床决策的准确性和医疗安全。传统的病历质控工作主要依赖人工审核,存在效率低下、主观性强、覆盖面有限等问题。近年来,基于人工智能技术的…...

超级创新思路:基于CBAM-Transformer的强化学习时间序列预测模型(Python\matlab实现)

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴!需要完整代码可私信或评论! 本方案可用于医疗、金融、交通、零售、光伏功率预测、估计预测、天气预测、流量预测、故障检测等领域! 目录 首先声明,该模型为原创!原创!原创!且该思…...

JVM——垃圾收集策略

GC的基本问题 什么是GC&#xff1f; GC 是 garbage collection 的缩写&#xff0c;意思是垃圾回收——把内存&#xff08;特别是堆内存&#xff09;中不再使用的空间释放掉&#xff1b;清理不再使用的对象。 为什么要GC&#xff1f; 堆内存是各个线程共享的空间&#xff0c…...

从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征

从基础到实战的量化交易全流程学习&#xff1a;1.3 数学与统计学基础——概率与统计基础 | 数字特征 第一部分&#xff1a;概率与统计基础 第2节&#xff1a;数字特征&#xff1a;期望值、方差、协方差与相关系数 一、期望值&#xff08;Expected Value&#xff09;&#xff1a…...

【MySQL】数据类型和表的操作

目录 一. 常用的数据类型 1.数值类型 1.1 整形类型 1.2 浮点型类型 2.字符串类型 char和varchar的区别 如何选择char和varchar 3.日期类型 4.二进制类型 二. 表的操作 1.查看所有表 2.表的创建 3.查看表的结构 4.表的修改 4.1 添加新的列 4.2 修改表中现有的列 4…...

Tauri打包时出现WixTools以及NSIS报错

前言 Tauri构建时会通过github下载Wix和NSIS&#xff0c;由于国内网络限制&#xff0c;所以这个过程基本都会失败&#xff0c;而且你无法使用挂代理的方式解决此问题&#xff0c;唯一的办法就是先下载对于的库&#xff0c;然后把库丢到对应的文件夹内来解决此问题。。。 文章目…...

Linux操作系统学习---进程地址空间

前言: 在学习c,c这些偏底层的语言时,我们常常会对一个变量取地址,一遍对他进行一系列的操作 . 可是 , 这真的是真实的物理地址吗 ? 其实并非如此 , 通过了解进程地址空间,我们就能解开这个困惑. 一、虚拟地址空间的概念: 同地址,不同值的代码示例: 下面通过创建子进程来看一个…...

docker compose -p的踩坑经验

刚才启动ragflow解析了几百个文件&#xff0c;再次启动登录时报错 没有这个账户&#xff0c;心疼token几秒。。。 再次回顾之前的启动方式和当前的启动方式&#xff0c;才发现有出入。 问题&#xff1a; 第一次启动sudo docker compose up -d 第二次启动sudo docker compose -…...

深入理解 Linux 用户管理:从基础到实践

在 Linux 操作系统中&#xff0c;用户管理是确保系统安全、合理分配资源的核心环节。无论是个人开发者搭建本地开发环境&#xff0c;还是运维人员管理企业级服务器集群&#xff0c;熟练掌握 Linux 用户管理都是一项必备技能。本文将从用户管理的基础概念出发&#xff0c;结合实…...

Go语言之路————指针、结构体、方法

Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go…...

【漫话机器学习系列】227.信息检索与数据挖掘中的常用加权技术(TF-IDF)

在自然语言处理&#xff08;NLP&#xff09;、信息检索&#xff08;IR&#xff09;和数据挖掘&#xff08;DM&#xff09;领域中&#xff0c;TF-IDF 是一种非常经典且常用的加权技术。 无论是搜索引擎排序、文本挖掘&#xff0c;还是特征工程&#xff0c;TF-IDF都扮演着重要角色…...

【音视频】FFmpeg过滤器框架分析

ffmpeg的filter⽤起来是和Gstreamer的plugin是⼀样的概念&#xff0c;通过avfilter_link&#xff0c;将各个创建好的filter按⾃⼰想要的次序链接到⼀起&#xff0c;然后avfilter_graph_config之后&#xff0c;就可以正常使⽤。 ⽐较常⽤的滤镜有&#xff1a;scale、trim、over…...

硬盘损坏数据恢复后对python程序的影响

最近硬盘突然间坏掉了&#xff0c;让数据商恢复了2个月今天终于拿到了恢复后的数据。 但是一测试问题就来了&#xff1a; PS E:\geosystem> python manage.py runserver 0.0.0.0:5000 Unhandled exception in thread started by <function check_errors.<locals>.…...

Azure Devops - 尝试一下在Pipeline中使用Self-hosted Windows agent

1.简单介绍 Azure Devops是微软提供的辅助软件的开发&#xff0c;测试&#xff0c;部署以及计划和进度跟踪的平台&#xff0c;通过Azure Devops可以使开发者&#xff0c;项目经理&#xff0c;运维人员在软件的整个生命周期中更紧密地合作&#xff0c;同时借助Continuous Integ…...

Linux红帽:RHCSA认证知识讲解(十 四)分区管理、交换分区,创建逻辑卷与调整逻辑卷的大小

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;十 四&#xff09;分区管理、交换分区&#xff0c;创建逻辑卷与调整逻辑卷的大小 前言一、分区管理&#xff0c;使用fdisk管理分区1.1 找到硬盘1.2 使用fdisk分区1.3 格式化分区1.4 挂载分区 二、创建逻辑卷&#xff0c;调整…...

详解 Unreal Engine(虚幻引擎)

详解 Unreal Engine&#xff08;虚幻引擎&#xff09; Unreal Engine&#xff08;简称 UE&#xff09;是由 Epic Games 开发的一款全球领先的实时渲染引擎&#xff0c;自 1998 年随首款游戏《Unreal》问世以来&#xff0c;已发展成为覆盖 游戏开发、影视制作、建筑可视化、汽车…...

【Linux网络】Http服务优化 - 增加请求后缀、状态码描述、重定向、自动跳转及注册多功能服务

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

Docker compose 部署微服务项目(从0-1出发纯享版无废话)

目录 一.Docker安装 &#xff08;1&#xff09;安装依赖 &#xff08;2&#xff09;安装Docker &#xff08;3&#xff09;启动Docker服务 &#xff08;4&#xff09;系统配置 &#xff08;5&#xff09;镜像加速配置 &#xff08;6&#xff09;验证安装 二.编写Docke…...

C#学习第19天:多线程

什么是多线程&#xff1f; 定义&#xff1a;多线程允许一个程序分成多个独立的执行路径来进行并发操作。用途&#xff1a;提高程序的执行效率&#xff0c;特别是在I/O操作、计算密集型任务和用户交互中。 多线程核心概念 1. 创建和管理线程 使用 Thread 类 using System; u…...

day7 python针对心脏病数据集预处理

在数据科学与机器学习领域&#xff0c;数据预处理与可视化是挖掘数据价值的关键前置步骤。本文以 heart1.csv 心脑血管疾病数据集为例&#xff0c;借助 Python 中的 pandas、matplotlib、seaborn 以及 scikit-learn 库&#xff0c;详细演示数据加载、缺失值处理、特征相关性分析…...

树莓派学习专题<9>:使用V4L2驱动获取摄像头数据--设定分辨率和帧率

树莓派学习专题&#xff1c;9&#xff1e;&#xff1a;使用V4L2驱动获取摄像头数据--设定分辨率和帧率 1. 设定分辨率2. 设定帧率3. 设定分辨率代码解析4. 获取与设定帧率代码解析5. 实测 1. 设定分辨率 使用如下代码设定摄像头的分辨率&#xff1a; #define CAMERA_RESOLUTI…...

模态链:利用视觉-语言模型从多模态人类视频中学习操作程序

25年4月来自谷歌 DeepMind 和斯坦福大学的论文“Chain-of-Modality: Learning Manipulation Programs from Multimodal Human Videos with Vision-Language-Models”。 从人类视频中学习执行操作任务&#xff0c;是一种很有前景的机器人教学方法。然而&#xff0c;许多操作任务…...

JAVAEE初阶01

个人主页 JavaSE专栏 JAVAEE初阶01 操作系统 1.对下&#xff08;硬件&#xff09;管理各种计算机设备 2.对上&#xff08;软件&#xff09;为各种软件提供一个稳定的运行环境 线程 运行的程序在操作系统中以进程的形式存在 进程是系统分配资源的最小单位 进程与线程的关…...

【网络安全】用 Linux 命令行 CLI 日志文件处理指南

Linux 命令行 CLI 神技回忆录&#xff1a;日志文件处理指南&#xff08;以 Zeek Logs 为例&#xff09; 1. CLI简介2. 基础操作3. 文件读取4. 查找与筛选5. 进阶操作6. Zeek 日志骚操作7. 结语 1. CLI简介 在数据分析的世界里&#xff0c;图形界面&#xff08;GUI&#xff09;…...

[C++] 高精度乘法

目录 引入: 大整数比较比较方法例题1-青蛙计数题目描述 输入描述输出描述输入输出样例AC代码 高精度乘法模版高精度运算小合集(这集乘法上集加法) 注意: 若还没有学过高精度运算的话先去看高精度加法 引入: 大整数比较 比较方法 大整数比较可以使用此方法比较(注释有讲解): …...

反事实——AI与思维模型【82】

一、定义 反事实思维模型是一种心理认知模型,它指的是人们在头脑中对已经发生的事件进行否定,然后构建出一种可能性假设的思维活动。简单来说,就是思考“如果当时……,那么就会……”的情景。这种思维方式让我们能够超越现实的限制,设想不同的可能性和结果,从而对过去的…...

Java学习手册:Java开发常用的内置工具类包

以下是常用 Java 内置工具包。 • 日期时间处理工具包 • java.time包&#xff08;JSR 310&#xff09;&#xff1a;这是 Java 8 引入的一套全新的日期时间 API&#xff0c;旨在替代陈旧的java.util.Date和java.util.Calendar类。其中的LocalDate用于表示不带时区的日期&…...

JAVA多线程(8.0)

目录 线程池 为什么使用线程池 线程池的使用 工厂类Executors&#xff08;工厂模式&#xff09; submit 实现一个线程池 线程池 为什么使用线程池 在前面我们都是通过new Thread() 来创建线程的&#xff0c;虽然在java中对线程的创建、中断、销毁、等值等功能提供了支持…...

通过门店销售明细表用Python Pandas得到每月每个门店的销冠和按月的同比环比数据

假设我在本地有Excel销售表&#xff0c;包含ID主键、门店ID、日期、销售员姓名和销售额&#xff0c;需要用Pandas统计出每个月所有门店和各门店销售额最高的人&#xff0c;不一定是一个人&#xff0c;以及他所在的门店ID和月总销售额。 步骤1&#xff1a;导入数据并处理日期 …...