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

【数据结构】算法的复杂度

前言:经过了C语言的学习,紧接着就步入到数据结构的学习了。在C语言阶段我们在写大多数的oj题的时候会遇到一些问题,就是算法的效率低使用的时间较多,占用的空间也多,数据结构就是来优化算法的。

文章目录

  • 一,数据结构和算法
    • 1,什么是数据结构
    • 2,什么是算法
    • 3,算法的重要性
  • 二,算法的效率
    • 1,时间复杂度的概念
    • 2,时间复杂度
    • 3,大O渐进表示法
    • 4,空间复杂度

一,数据结构和算法

1,什么是数据结构

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

2,什么是算法

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

3,算法的重要性

算法的好坏可以不仅反应一个程序员写代码的水平有多高,在程序运行的时候还能节省空间和时间,所以算法的优化是非常重要的。其次,在找工作的时候企业面试也会考算法。

知道了算法的重要性,就来看看如何来改进算法。

二,算法的效率

算法效率顾名思义,算法越好占用的时间和空间越少,效率越高。算法的越差占用的时间和空间越多,算法效率越差。
我们以一道算法题为例:
旋转数组

void rotate(int* nums, int numsSize, int k) 
{ while(k--) { int tmp = nums[numsSize-1]; for(int i = numsSize - 1;i > 0 ;i--) { nums[i] = nums[i-1]; }nums[0] = tmp; } 
}

思路是将第一个元素保存,再将后面的元素往前移动最后再将前面的元素放到后面的空位,轮转几次就循环几次。

在这里插入图片描述

但是力扣却说超出了时间限制,这就说明我们设计的算法不够好,需要优化。既然是时间超出了限制那么就有人要问了如何优化算法呢?

我们给出一个概念叫时间复杂度。紧接着我们就来介绍一下什么是时间复杂度。

1,时间复杂度的概念

  • 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量⼀个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。
  • 时间复杂度主要衡量⼀个算法的运⾏快慢,⽽空间复杂度主要衡量⼀个算法运⾏所需要的额外空间。
    在早期计算机的内存很小所以人们比较关注内存的占用情况,但如今计算机的内存容量已经可以达到一个很高的程度所以当今人们更加关注时间的效率,更加关注时间复杂度。

2,时间复杂度

定义:在计算机科学中,算法的时间复杂度是⼀个函数式T(N),比如正比例函数f(x)=kx,它定量描述了该算法的运行时间。时间复杂度可以衡量程序的时间效率。

那怎么去计算时间复杂度呢?是计算程序运行的时间,还是程序运行的次数呢? 答案是,通过运行的次数去算时间复杂度。

为什么呢?
由于程序运行的时间受到多种因素的影响比如:编译器的不同,机器的配置不同都会影响程序的运行时间是不好测量的。
我们知道算法程序被编译后生成二进制指令,程序运行,就是cpu执⾏这 些编译好的指令。那么我们通过程序代码或者理论思想计算出程序的执⾏次数的函数式T(N),假设每 句指令执⾏时间基本⼀样(实际中有差别,但是微乎其微),那么执⾏次数和运⾏时间就是等⽐正相关, 这样也脱离了具体的编译运⾏环境。所以执行次数就可以代表程序时间效率的优劣。比如解决⼀个问题的算法a程序T(N) = N,算法b程序T(N) = N^2,那么算法a的效率⼀定优于算法b。

所以我们得出一个等式:程序执行的时间 = 二进制指令运行时间 * 执行次数。二进制指令运行的时间可以假设是一样的。所以时间就看次数。

有了上面的了解,紧接着趁热打铁拿一些程序来练练手:

// 请计算⼀下Func1中++count语句总共执⾏了多少 次?
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; } 
}

通过上面的代码我们能很明显的看出来,count总共执行了NN次+2N次+10次,写成函数表达式就是:T(N)=N^2+2*N+10

3,大O渐进表示法

对于这个式子要怎么看呢?
要看懂这个式子就要明白大O的渐进表示法,什么是大O的渐进表示法呢?

⼤O符号(Big O notation):是⽤于描述函数渐进⾏为的数学符号
在这里插入图片描述
回到这个式子:T(N)=N^2+2*N+10 通过第一条规则我们知道高阶项随着N变大对式子的影响比较大,低阶项随着N变大对式子的影响越来越小所以我们要保留高阶项去掉低阶项。我们在学数学的时候也学过越高阶的项对整个式子越大,也印证了这一点。

所以上面代码最终的时间复杂度为:O(N^2),复杂度的表=示通常使用大O的渐进表示法。

再来看一段代码,计算时间复杂度

 // 计算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); 
}

上面代码执行次数为:T(N)=2N+10 前面我们知道了,高阶项对整个式子的影响较大所以我们因该保留高阶项去掉低阶项。难道这里的时间复杂度是O(2N)吗?

答案是否定的,我们再来看看推导大O阶的第二条规则,当高阶项存在且系数不是1,就取出系数,在这里就相当于去掉2N中的2变成了N。原因也很简单当N不断变大系数对结果的影响越来越小所以可以去掉。

所以上面代码最终的时间复杂度为:O(N)

// 计算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); 
}

上面代码的执行次数为:第一个for循环执行M次+第二个for循环执行N次。
这里不知道M和N到底谁大所以我们分情况讨论:

  1. 当M==N的时候 时间复杂度为O(M)或O(N)
  2. 当M>>N的时候 时间复杂度为O(M)
  3. 当N>>M的时候 时间复杂度为O(N)
// 计算Func4的时间复杂度? 
void Func4(int N) 
{ int count = 0; for (int k = 0; k < 100; ++ k) { ++count; }printf("%d\n", count); 
}

上面代码的执行次数:就为for循环执行的100次,那时间复杂度为O(100)吗?
答案是否定的,再来看看推导大O阶的第三条规则,当T(N)中没有与N有关的项时直接用1来代表所有加法常数.

所以时间复杂度为O(1).

// 计算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; 
}

上面是一个查找字符的代码,那么执行次数由上面决定呢?

答案是由该字符所处在的位置来决定,所以我们还是分类讨论: 当字符在第一个位置,则程序执行一次就能将其找到;所以时间复杂度为O(1)
当字符在中间位置时,假设有N个字符,则程序至少要执行N/2次才能找到;所以时间复杂度为O(N/2)
当字符在最后一个位置时,假设有N个字符,则程序要执行N次才能将其找到;所以时间复杂度为O(N)

计算strchr的时间复杂度分为几种情况:
最好情况:O(1)
最坏请况:O(N)
平均情况:O(N/2)

在这里插入图片描述
接着再来计算一些复杂程序的时间复杂度:

// 计算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; } 
}

我们给出分析:
在这里插入图片描述
本质上其实就是一个等差数列求和,最终得到时间复杂度为O(N^2)。

再看一个代码:

void func5(int n) 
{ int cnt = 1; while (cnt < n) { cnt *= 2; } 
}

在这里插入图片描述
这里可能会有人疑惑,x解出来不是以2为底n的对数吗?怎么省略了底数2了呢?

当n接近无穷打时,底数的大小对结果影响不大。因此,⼀般情况下不管底数是多少都可以省略不 写,即可以表示为 log n
不同书籍的表示方式不同,以上写法差别不大,我们建议使用log n


所以该程序的时间复杂度为O(logN)

最后来看一个递归算法的时间复杂度:

// 计算阶乘递归Fac的时间复杂度? 
long long Fac(size_t N) 
{ if(0 == N) return 1; return Fac(N-1)*N; 
}

在这里插入图片描述
所以该程序时间复杂度为:O(N)

以上就是常见的时间复杂度的计算下面来说说影响算法效率的第二个因素,空间复杂度:

4,空间复杂度

空间复杂度也是⼀个数学表达式,是对⼀个算法在运行过程中因为算法的需要额外临时开辟的空间。
空间复杂度不是程序占用了多少bytes的空间,因为常规情况每个对象大小差异不会很大,所以空间复 杂度算的是变量的个数。 空间复杂度计算规则基本跟实践复杂度类似,也使用大O渐进表示法。

但要注意: 函数运行时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好 了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

下面来看一个例子:

// 计算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; } 
}

我们只需关注哪里创建了变量就好了,看到程序只创建了一个exchang变量,只创建了一次,所以空间复杂度为O(1)

再来看一个空间复杂度为O(N)的情况

// 计算阶乘递归Fac的空间复杂度? 
long long Fac(size_t N) 
{ if(N == 0) return 1; return Fac(N-1)*N; 
}

这个程序在计算是将复杂度的时候见到过,当时只关注时间复杂度而现在我们关注的是空间复杂度,空间复杂度怎么计算呢?

将到空间我们就关注函数在运行时候显式申请的额外空间来确定空间复杂度,函数调用了N次,就会创建N个函数栈帧所以空间复杂度为O(N)。

最后再用一张图给出各个时间复杂度的曲线,复杂度越简单曲线越平缓操作次数越小,斜率越小。
在这里插入图片描述

在这里插入图片描述

最后我们再来看看前面我们提出的那道算法题:
轮转数组
我们给出优化后的代码:

//逆置函数void revers(int* nums,int left,int right){while(left<right){int tmp=0;tmp=nums[left];nums[left]=nums[right];nums[right]=tmp;left++;right--;}}void rotate(int* nums, int numsSize, int k) {//注意要处理k超过数组大小的情况k=k%numsSize;revers(nums,0,numsSize-k-1);revers(nums,numsSize-k,numsSize-1);revers(nums,0,numsSize-1);
}

我们给出代码分析:
在这里插入图片描述
该程序的时间复杂度为O(N)空间复杂度为O(1),前面给出的算法时间复杂度为O(N^2)
从O(N^2)变成了O(N)就完成算法的优化。

以上就是本章的全部内容啦!
最后感谢能够看到这里的读者,如果我的文章能够帮到你那我甚是荣幸,文章有任何问题都欢迎指出!制作不易还望给一个免费的三连,你们的支持就是我最大的动力!
在这里插入图片描述

相关文章:

【数据结构】算法的复杂度

前言&#xff1a;经过了C语言的学习&#xff0c;紧接着就步入到数据结构的学习了。在C语言阶段我们在写大多数的oj题的时候会遇到一些问题&#xff0c;就是算法的效率低使用的时间较多&#xff0c;占用的空间也多&#xff0c;数据结构就是来优化算法的。 文章目录 一&#xff…...

Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ

目录 &#xff08;一&#xff09;反转字符串Ⅱ的C实现 写法一&#xff08;s.begin&#xff08;&#xff09;遍历字符&#xff09; &#xff08;二&#xff09;复杂度分析 时间复杂度 空间复杂度 &#xff08;三&#xff09;总结 【题目链接】541. 反转字符串Ⅱ - 力扣&am…...

制造单元智能化改造与集成技术平台成套实训设备

制造单元智能化改造与集成技术平台成套实训设备 一、概述&#xff1a; 本设备以汽车行业的轮毂为产品对象&#xff0c;实现了仓库取料、制造加工、打磨抛光、检测识别、分拣入位等生产工艺环节&#xff0c;以未来智能制造工厂的定位和需求为参考&#xff0c;通过工业以太网完成…...

Vscode 顶部Menu(菜单)栏消失如何恢复

Vscode 顶部Menu(菜单)栏消失如何恢复 https://blog.csdn.net/m0_62964247/article/details/135759655 Vscode 顶部Menu(菜单)栏消失如何恢复&#xff1f; 首先按一下 Alt按键&#xff0c;看一下是否恢复了菜单栏 如果恢复了想了解更进一步的设置&#xff0c;或是没能恢复菜单…...

苍穹外卖--公共字段自动填充

1.问题分析 业务表中的公共字段&#xff1a; 问题&#xff1a;代码冗余、不便于后期维护 2.实现思路 自定义注解AutoFill&#xff0c;用于标识需要进行公共字段填充的方法 自定义切面类AutoFillAspect&#xff0c;统一拦截加入了AutoFill注解的方法&#xff0c;通过反射为公…...

行业 |四大痛点待破:“拆解”DeepSeek一体机

繁荣DeepSeek一体机市场。 2025年开年&#xff0c;DeepSeek大模型掀起的一体机热潮席卷中国AI市场。这款一体机凭借其“开箱即用”的便利性和极低的门槛&#xff0c;吸引了大量企业关注&#xff0c;尤其是在中小企业和行业创新者中&#xff0c;更是成为了新晋“顶流”。 无论…...

革新锅炉厂智能控制——Ethernet IP转CANopen协议网关的工业互联新方案

锅炉厂智能化转型的必经之路 在工业4.0时代&#xff0c;锅炉厂作为能源供应的核心环节&#xff0c;正面临智能化升级的迫切需求。传统锅炉控制系统往往因协议不兼容、数据孤岛问题导致效率低下、维护成本高昂。如何实现设备间高效协同&#xff1f;如何让老旧设备融入智能网络&…...

基于卷积神经网络和Pyqt5的猫狗识别小程序

任务描述 猫狗分类任务&#xff08;Dogs vs Cats&#xff09;是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集&#xff0c;12500张未标记照片组成的测试集。选手需要在规定时间…...

Baklib知识中台引领服务智能跃迁

智能架构重构服务范式 Baklib 知识中台通过全量数据融合与多模态处理能力&#xff0c;重塑企业服务底层逻辑。基于分布式架构设计&#xff0c;平台将分散在业务系统、文档库及外部渠道的非结构化数据进行智能清洗与语义解析&#xff0c;形成标准化的知识元数据池。通过四库体系…...

【Python】超全常用 conda 命令整理

Conda命令整理文档&#xff0c;结合官方指南与高频使用场景分类说明&#xff0c;每个命令都有对应的解释 一、环境管理 1. 创建环境 基本创建conda create --name my_env # 创建名为my_env的空环境 conda create -n my_env python3.11 # 指定Python版本 conda creat…...

FreeRTOS菜鸟入门(十四)·事件

目录 1. 基本概念 2. 应用场景 3. 运作机制 4. 控制块 5. 事件函数接口 5.1 事件创建函数 xEventGroupCreate() 5.2 事件删除函数 vEventGroupDelete() 5.3 事件组置位函数 xEventGroupSetBits()&#xff08;非中断&#xff09; 5.4 事件组置位函数 xEventGr…...

setData执行后操作方法-微信小程序

在微信小程序中&#xff0c;setData 是异步执行的&#xff0c;如果你需要在 setData 执行完毕后执行某些操作&#xff0c;可以通过以下几种方式实现&#xff1a; 1. 使用 setData 的回调函数 从基础库 2.2.3 开始&#xff0c;setData 支持传入回调函数&#xff0c;回调会在数据…...

SpringAI特性

一、SpringAI 顾问&#xff08;Advisors&#xff09; Spring AI 使用 Advisors机制来增强 AI 的能力&#xff0c;可以理解为一系列可插拔的拦截器&#xff0c;在调用 AI 前和调用 AI 后可以执行一些额外的操作&#xff0c;比如&#xff1a; 前置增强&#xff1a;调用 AI 前改…...

捌拾叁- 量子傅里叶变换

1. 前言 最近公司地震&#xff0c;现在稍微有点时间继续学习。 看了几个算法&#xff0c;都说是基于 量子傅里叶变换 &#xff0c;好&#xff0c;就是他了 Quantum Fourier。 2. 傅里叶变换 大学是学通信的&#xff0c;对于傅里叶变换还是有所理解的。其实就是基于一个 时域…...

SSTI模版注入

1、概念 SSTI是一种常见的Web安全漏洞&#xff0c;它允许攻击者通过注入恶意模板代码&#xff0c;使服务器在渲染模板时执行非预期的操作。 &#xff08;1&#xff09;渲染模版 至于什么是渲染模版&#xff1a;服务器端渲染模板是一种Web开发技术&#xff0c;它允许在服务器端…...

33、前台搜索功能怎么实现?

输入搜索的东西&#xff0c;如果为空 如果有 前端是提交表单&#xff0c;方式是 post 后端接受 调用 mybatisplus的categoryService.getById 用户在搜索框内输入关键字之后&#xff0c;执行 js 中的 load方法&#xff0c;前端提交表单&#xff0c; 后端 controller 中的loa…...

量化解析美英协议的非对称冲击:多因子模型与波动率曲面重构

摘要&#xff1a;基于机器学习算法对市场微观结构的实时监测&#xff0c;黄金价格在3300美元/盎司附近展开技术性反弹。本文通过多因子分析框架&#xff0c;解析美元指数上行、贸易政策突变及资产配置迁移对贵金属市场的复合影响&#xff0c;并构建基于LSTM神经网络的动态支撑位…...

对PyTorch模块进行性能分析

以下是针对PyTorch模块进行性能分析的完整方法与工具指南&#xff0c;结合了多种优化策略和实际应用场景&#xff1a; 一、PyTorch性能分析工具 PyTorch Profiler • 功能&#xff1a;内置的性能分析工具&#xff0c;支持捕获CPU/GPU操作、内存分配、数据形状及硬件利用率。 …...

lvm详细笔记

LVM简介 逻辑卷管理器&#xff0c;是Linux 系统中用于管理磁盘储存的关键技术。 LVM 则打破了磁盘分区一旦确定&#xff0c;其大小调整往往较为复杂&#xff0c;且难以灵活应对业务变化这种限制&#xff0c;它允许用户将多个物理分区组合卷组。例如&#xff0c;系统中的多个物…...

OpenHarmony 以太网卡热插拔事件接口无效

目录 1.背景 2.解决方案 1.背景 在OpenHarmony中调用以太网热插拔时间&#xff0c;发现热插拔没有任何回调&#xff0c;如下接口 import { ethernet } from kit.NetworkKit;ethernet.on(interfaceStateChange, (data: object) > {console.log(on interfaceSharingStateCha…...

SPDK NVMe of RDMA 部署

使用SPDK NVMe of RDMA 实现多NVMe设备共享 一、编译、安装spdk 1.1、下载 1.1.1 下载spdk源码 首先&#xff0c;我们需要从GitHub上克隆SPDK的源码仓库。打开终端&#xff0c;输入以下命令&#xff1a; git clone -b v22.01 https://github.com/spdk/spdk.git cd spdk1.1.2…...

Go语言的逃逸分析是怎么进行的

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

纯净IP,跨境账号稳定的底层逻辑

在跨境业务快速扩张的背景下&#xff0c;越来越多的卖家、营销人、数据团队都开始使用代理IP来实现全球网络触达。然而&#xff0c;账号封禁问题始终如影随形&#xff0c;而背后的一个“隐性元凶”常常被忽视——纯净IP的缺失。本文将从实战角度出发&#xff0c;带你深入了解什…...

编译日志:关于编译opencv带有ffmpeg视频解码支持的若干办法

编译日志&#xff1a;关于编译opencv带有ffmpeg视频解码支持的若干办法 前言 ​ 笔者这里是封装了简单的OpenCV视频播放抽象&#xff0c;然后却发现移植到Ubuntu和开发板上都罢工的事情&#xff0c;原来是Windows平台下我们是默认下载了ffmpeg的库的&#xff0c;但是在泛Linu…...

djinn: 3靶场渗透

djinn: 3 来自 <https://www.vulnhub.com/entry/djinn-3,492/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.243 3&#xff0…...

WHAT - 简单服务发现

文章目录 简单理解举个例子简单服务发现方式1. 静态配置&#xff08;最简单&#xff0c;但不灵活&#xff09;2. DNS 发现3. 使用服务注册中心&#xff08;稍高级&#xff09; 总结 “简单服务发现”&#xff08;Simple Service Discovery&#xff09;通常指的是一种让系统中的…...

auto推导类型原则

auto 是 C11 引入的类型自动推导关键字&#xff0c;它允许编译器根据表达式的类型来推导变量的确切类型。虽然使用 auto 可以让代码更简洁&#xff0c;但理解它的类型推导规则非常关键&#xff0c;尤其是在涉及指针、引用、const、模板等场景时。 ✅ 一、基本推导原则 auto x …...

44.辐射发射整改简易摸底测试方法

辐射发射整改简易摸底测试方法 1. 正式摸底预测试2. 简易方法预测试3. 分析频谱4. 探查传播路径5. 施加措施6. 与简易方法预测试效果对比 1. 正式摸底预测试 去正式实验室做一次预测试&#xff0c;取得频谱图&#xff1b;确定超标频点和超标量&#xff08;备用&#xff09;。 …...

初识C++:入门基础(二)

概述&#xff1a;该篇博客主要介绍C的缺省函数、函数重载、和引用等知识。 目录 1. 缺省参数 2. 函数重载 3. 引用 3.1 引用的概念和定义 3.2 引用的特性 3.3 引用的使用 3.4 const引用 3.5 指针和引用的关系 4. nullptr 5. 小结 1. 缺省参数 缺省参数是声明或定义函…...

我国脑机接口市场规模将破38亿元,医疗领域成关键突破口

当人类仅凭"意念"就能操控无人机编队飞行&#xff0c;当瘫痪患者通过"脑控"重新站立行走&#xff0c;这些曾只存在于科幻电影的场景&#xff0c;如今正通过脑机接口技术变为现实。作为"十四五"规划中重点发展的前沿科技&#xff0c;我国脑机接口…...

笔记,麦克风的灵敏度

麦克风的“灵敏度&#xff08;Sensitivity&#xff09;”决定了它捕捉声音细节的能力。想象麦克风是一只有耳朵的生物。高灵敏度麦克风像长着“超级顺风耳”的精灵&#xff0c;能听见花瓣飘落的声音、远处树叶的沙沙声&#xff0c;甚至你心跳的微弱震动。适合录音棚里捕捉歌手的…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice 在线打开Word文件,并用前端对话框实现填空填表

不管是政府机关、公司企业&#xff0c;还是金融行业、教育行业等单位&#xff0c;在办公过程中都经常需要填写各种文书和表格&#xff0c;比如通知、报告、登记表、计划表、申请表等。这些文书和表格往往是用Word文件制作的模板&#xff0c;比方说一个通知模板中经常会有“关于…...

AKS 支持 Kata Container容器沙盒 -预览阶段

您准备好提升您的云和 DevOps 技能了吗&#xff1f; &#x1f425;《云原生devops》专门为您打造&#xff0c;我们精心打造的数十篇文章库&#xff0c;这些文章涵盖了 Azure、AWS 和 DevOps 方法论的众多重要主题。无论您是希望精进专业知识的资深专业人士&#xff0c;还是渴望…...

Ubuntu通过源码编译方式单独安装python3.12

1、安装依赖 sudo apt-get install zlib1g sudo apt-get install zlib1g-dev sudo apt-get install openssl sudo apt-get install libssl-dev2、编译源码并安装 wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz tar -xvf Python-3.12.0.tar.xz cd Pyth…...

【某OTA网站】phantom-token 1004

新版1004 phantom-token 请求头中包含phantom-token 定位到 window.signature 熟悉的vmp 和xhs一样 最新环境检测点 最新检测 canvas 下的 toDataURL方法较严 过程中 会用setAttribute给canvas 设置width height 从而使toDataURL返回不同的值 如果写死toDataURL的返回值…...

游戏引擎学习第266天:添加顶部时钟概览视图。

简要讨论使用第三方调试工具或在多个项目中复用自己的调试工具 今天的工作主要是在提升调试界面的可用性和美观性。昨天已经整理了布局代码&#xff0c;今天的目标是继续优化调试界面&#xff0c;使其更易用。我们已经为调试工具添加了许多新功能&#xff0c;并且在实现过程中…...

霸王茶姬微信小程序自动化签到系统完整实现解析

霸王茶姬微信小程序自动化签到系统完整实现解析 技术栈&#xff1a;Node.js 微信小程序API MD5动态签名 一、脚本全景架构 功能模块图 #mermaid-svg-0vx5W2xo0IZWn6mH {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…...

AI与自然语言处理(NLP):从BERT到GPT的演进

AI与自然语言处理&#xff08;NLP&#xff09;&#xff1a;从BERT到GPT的演进 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 AI与自然语言处理&#xff08;NLP&#xff09;&#xff1a;从BERT到GPT的演进摘要引言…...

TRO高能预警,Keith律所×Tane Hannah Meets版权两案王炸维权

紧急避雷贴&#xff0c;keith律所代理Tane Hannah Meets 10个版权连发两案突袭跨境圈&#xff01;案件详情如下&#xff1a; 案件基本情况&#xff1a; 起诉时间&#xff1a;2025-5-8 案件号&#xff1a;25-cv-05079、25-cv-05088 品牌&#xff1a;Tane Meets Works 原告&…...

在 Spring Boot 中选择合适的 HTTP 客户端

在现代的 Spring Boot 应用程序中&#xff0c;与外部服务进行 HTTP 通信是一个常见的需求。Spring Boot 提供了多种方式来实现 HTTP 请求&#xff0c;包括 Java 的 HttpClient、Spring 的 RestTemplate、WebClient&#xff0c;以及第三方库如 Apache HttpClient。本文将详细介绍…...

Go语言中 源文件开头的 // +build 注释的用法

// build注释主要用于实现条件编译。借助设置不同的构建标签&#xff08;build tags&#xff09;&#xff0c;我们能够指定在特定的操作系统、架构或者其他自定义条件下才编译某个文件 1、基本规则 格式要求&#xff1a; 这种注释必须出现在文件的开头部分。注释与包声明之间至…...

C++八股 —— map/unordered_map

1. 底层数据结构 map —— 红黑树 随处可见的红黑树&#xff1a;原理、实现及应用场景 - 知乎 unordered_map —— 散列表 [C] 哈希表&#xff08;散列表&#xff09;详解_c哈希表-CSDN博客 2. 常见面试题 底层为红黑树的容器有哪些 mapmultimapsetmultiset 红黑树和AVL树…...

PostgreSQL创建只读账号

环境说明 部署环境&#xff1a;linux服务器docker容器部署 数据库&#xff1a;PostgreSQL 成果 只读账号/密码&#xff1a;read_only/xxx123 授权可读库&#xff1a;xxx、xxxdata 操作过程 #进入PostgreSQL容器&#xff08;如果你没有用docker容器忽略这一步就可以了&#xff…...

DVWA靶场保姆级通关教程--06不安全验证机制

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 原理详解 1. 前后端验证逻辑不一致 2. 验证码值保存在客户端 3. 验证码可预测或重复 4. 验证码验证与逻辑解耦 一、处理关卡报错 二、low级别源…...

【日撸 Java 三百行】Day 7(Java的数组与矩阵元素相加)

目录 Day 7&#xff1a;Java 的数组与矩阵元素相加 一、基本知识 二、矩阵的建立与基本计算 三、代码及测试 拓展&#xff1a;Arrays类详解 小结 Day 7&#xff1a;Java 的数组与矩阵元素相加 Task&#xff1a; 矩阵的赋值.二重循环. 一、基本知识 在学习 Java 中的数组与矩…...

【递归、搜索和回溯】递归、搜索和回溯介绍及递归类算法例题

个人主页 &#xff1a; zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 递归、搜索和回溯递归搜索VS 深度优先遍历 VS 深度优先搜索 VS 宽度优先遍历 VS 宽度优先搜索 VS 暴搜回溯与剪枝 1 面试题 08.06. 汉诺塔问题1.1 分析…...

2025最新精选5款3DMAX建筑可视化插件

在3DMAX建筑可视化领域&#xff0c;各类工具如同繁星般璀璨&#xff0c;它们为设计师们搭建起通往理想作品的桥梁。今天&#xff0c;就让我们一同走进几款极具特色的工具——RetailStore插件、2Dto3D插件、DrawFloorPlan插件、MaxToCAD插件以及EXR透视贴图技术&#xff0c;探寻…...

麒麟系统使用-个性化设置

文章目录 前言一、个性化设置-背景二、个性化设置-主题三、个性化设置-锁屏四、个性化设置-屏保五、个性化设置-字体总结 前言 与windows系统相比&#xff0c;麒麟系统中的个性化设置大体相似&#xff0c;在细节上稍有不同。本文将讲述麒麟系统中的个性化设置中的各个模块。 一…...

flask开启https服务支持

目录 一、背景 二、开启https支持 三、自签名 1、安装openssl 2、验证安装 3、自签名 四、编写代码 五、访问https接口 一、背景 最近在做自动化业务&#xff0c;需要兼容现在主流的框架开发的前端页面&#xff0c;于是到github找到了几个项目&#xff0c;clone下来项目并…...

CNN处理图片

In [5]: 123456789101112131415161718192021222324252627282930313233import tensorflow as tf​import matplotlib.pyplot as plt​import numpy as np​​​​# 平滑均值滤波#KaTeX parse error: Expected EOF, got _ at position 14: \text {filter_̲{arg}np.}.full (sha…...