数据结构(1)复杂度
一、数据结构概要
1.数据结构
数据结构是计算机存储、组织数据的方式,是数据相互之间存在一种或者多种特定关系的集合。没有一种单一的数据结构可以解决所有问题,因此要学习多种多样的数据结构。如:线性表、图、树等。
2.算法
算法其实就是解决问题的一系列步骤或者说一个计算过程,可以将现实生活中问题的条件(输入的值)转化为理想的目标(输出值)。
比如最简单的计算两个整型的加法,就是输入两个整型,返回两个整型的和。
学好数据结构在一定程度上就是帮助自己写更好的算法,比如计算一系列的整型值,如果单单用基本数据类型int就会非常麻烦,比如说计算100个,1000个,10000个int的和,你要是一个一个去定义,一个一个去初始化,那就太麻烦了,用上数组和循环,就会非常简单,数组就可以说是一个非常简单的数据结构。
那么如何能判断一个算法的好坏呢?
二、算法效率
算法的效率或者算法的好坏该通过什么样的标准来判断呢?
比如这样一道题:
容易想到以这样的方式去解决:
这个思路就是啥吧,你说啥我就干啥,你告诉我说轮转一步是把最后一个数提到最前面,其他的数次序不变依次前移,那我就这么写呗,外层循环是轮转的次数,内层循环想清顺序,数组最后一个数已经保存下来了,接下来就是从最后两个数开始,依次让后面的数等于前面的数,结果,最后弹出来个超出时间限制,这就是算法判断好坏的其中一个标准,时间。
三、复杂度
算法生成可执行程序进而运行的时候是需要向内存申请空间并且耗费一定时间的。因此衡量一个算法的好坏一般从时间和空间两个方面来衡量,即时间复杂度和空间复杂度。
时间复杂度主要就是衡量一个算法运行的快慢,空间复杂度主要衡量一个算法运行时所需要额外申请的内存空间。
1.时间复杂度
详解
在计算机中,时间复杂度并不是具体的几秒了,几分钟了,而是一个函数表达式T(N)。为什么不是具体的时间呢?
原因在于一个算法在不同机器下(想象一下20年前的计算机和现在的计算机运行同一个程序)、不同运行时间、不同编译环境下多可能不同。而且如果要计算时间的话,只能在程序运行后才会出现,但是复杂度在程序写好以后即可算出。
让自己接受了时间快慢就是用时间复杂度来衡量以后就来理解一下函数式T(N)到底是什么:
T(N)这个表达式计算了程序执行的次数,因为我们学习完C语言以后知道了,我们自己编写好的代码在运行前要进行编译和链接,最终转换为二进制指令,每条二进制指令的时间不一定相同,但是也不会相差过大,因此一般情况下我们都看成每条二进制指令所需时间相同,那么一个程序的时间=每条指令执行的时间*执行次数,每条指令执行时间又相同,所以不同算法的区别就在于执行次数的多少。
比如解决同一个问题:
T(N)= N和T(N)= N ^ 2
同样一个N,很明显N^2会耗费更多时间,效率也就更低。
另外,时间复杂度的计算还要进行近似的忽略,比如:
// 请计算⼀下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;
}
}
读读代码,for循环嵌套+count的次数就是N^2,后面又来一for循环,易得执行次数为2N,最后还得执行whie循环的10次,因此T(N)= N ^ 2 + 2N + 10
而代入数值去计算:
T(10)=130
T(100)=10210
T(1000)=1002010
其实很明显能感觉出来对结果影响最大的就是N^2了,次数越多,影响力越大,而我们的计算机每秒可以处理成千上万条二进制指令,N^2下比它次数低的可以忽略不计了。
即我们计算时间复杂度的时候也不是非得计算出它真正的执行次数(其实也算不出来,你count++和count*=最终搞出来的二进制指令都不一定一样多),只是大概看一下不同情况下随N增加算法的量级,所以复杂度的表示常用大O的渐进表示法。
大O的渐进表示法
规则:
1. 时间复杂度函数式 T(N) 中,只保留最高阶项,去掉那些低阶项,因为当 N 不断变大时, 低阶项对结果影响越来越小,当 N 无穷大时,就可以忽略不计了。
2. 如果最高阶项存在且不是 1 ,则去除这个项目的常数系数,因为当 N 不断变大,这个系数对结果影响越来越小,当 N 无穷大时,就可以忽略不计了。
3. T(N) 中如果没有 N 相关的项目,只有常数项,用常数 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);
}
第一个for循环2N次,第二个while循环10次。
因此T(N)= 2N+10
根据规则一,只包含最高次幂的2N,根据规则二,去掉系数。
故最后得到O(N)。
例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);
}
不多bb了,T(N)= M + N
同级加减,光管量级的话就是一次的O(N)
例3
// 计算Func4的时间复杂度?
void Func4(int N)
{
int count = 0;
for (int k = 0; k < 100; ++k)
{
++count;
}
printf("%d\n", count);
}
T(N) = 100
规则三,常数就是O(1)(跟上面说的,计算机一秒处理成千上万个代码,你就几百几千条,一次执行的事)
例4
const char* strchr(const char* str, char character)
{
const char* p_begin = str;
while (*p_begin != character)
{
if (*p_begin == '\0')
return NULL;
p_begin++;
}
return p_begin;
}
这个查找其实就有点说头了,最好的情况,字符串第一个字符就是要找的,那不就是O(1)嘛,最差的就是刚好这个字符在字符串的末尾str有多长就得找多长,假如说为N的话,岂不成O(N)了嘛。
这点就说一下,O(N)一般关注的就是最坏的情况。(后面也有几个经典的算法,根据输入数据的不同,存在最好和最坏情况)
例5
void Bubble_sort(int* arr, size_t sz)
{asserrt(arr);
int i = 0;
int flag = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = arr[j];
flag = 1;
}
}
if (flag == 0)
{
break;
}
}
}
根据数据的不同,肯定排序的次数也就不同,咱直接算最坏的,也就是完全倒序的一个序列,肯定两层循环都得走完了,假设sz是N,第一次内层for循环执行N - 1次,第二次N - 2次知道最后一次,执行1次,即1+2+……+N-1,也不用细算,肯定最后O(N^2)。
例6
void func5(int n)
{
int cnt = 1;
while (cnt < n)
{
cnt *= 2;
}
}
这玩意一下还看不出来到底执行多少次,必须计算设执行次数为x那么cnt每次都*2,也就是2^x次方,最终循环出来跟n比,相等或者大于就跳出循环了,2^x>=n那么 x>= logn。
一般有好几种表示:
O渐进表示法写的是第一个,计算机上,书籍上,资料上这几个都有,归根结底是指数函数对数函数底数和指数,底数和真数不好写出来,人手写当然就没啥问题,知道就行了。
例7
long long Fac(size_t N)
{
if (0 == N)
return 1;
return Fac(N - 1) * N;
}
其实还是看执行了几句,很显然肯定执行次数是一次,最后肯定O(N)。
2.空间复杂度
详解
有了时间复杂度的经验,类比着学。
空间复杂度也是一个数学表达式,是一个算法在运行过程中需要额外临时开辟的空间。不是算程序有多大,一般都是算变量个数(因为函数运行时所需要的栈空间(存储参数、局部变量、⼀些寄存器信息等)在编译期间已经确定好了)。
比如我们的冒泡排序,函数大小不用管,函数内就创建了个flag变量和temp变量还有i变量最后一加,再估算,用O渐进表示法也就是个O(1)
对于上面例7,函数递归,就是说调用函数空间本来准备好了,结果你是递归,不停的申请函数栈帧,也不去具体算了,反正基本就是N次,最后归结成O也就是O(N)。
但是随着我们科技的发展,反正内存不那么关心了相对于时间,一般提复杂度就是说的时间复杂度。但是也不能不管,你别说为了达成O(1)时间复杂度,不用循环,去计算500个数的值,你不嫌累,框框打了500个变量下去,自己手打了那么多个加法语句,你可是给计算机省时间去了,最后给内存干的快枯竭了。
四、常见复杂度对比
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(2^n)<O(n!)<O(n^n)
大概就是这样了,其实类似于高数里面的那个无穷大的比较。
相关文章:
数据结构(1)复杂度
一、数据结构概要 1.数据结构 数据结构是计算机存储、组织数据的方式,是数据相互之间存在一种或者多种特定关系的集合。没有一种单一的数据结构可以解决所有问题,因此要学习多种多样的数据结构。如:线性表、图、树等。 2.算法 算法其实就…...
多分类问题softmax传递函数+交叉熵损失
在多分类问题中,Softmax 函数通常与交叉熵损失函数结合使用。 Softmax 函数 Softmax 函数是一种常用的激活函数,主要用于多分类问题中。它将一个实数向量转换为概率分布,使得每个元素的值在 0 到 1 之间,且所有元素的和为 1。 …...
Java如何获取电脑分辨率?
以下是一个 Java 程序示例,用于获取电脑的主屏幕分辨率: import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 获取默认的屏幕设备 GraphicsDevice device GraphicsEnvironm…...
【NextPilot日志移植】logged_topics.cpp解析
📘 PX4 Logger 模块注册 uORB 主题、实际订阅与数据采集流程 🧭 目的与背景 在 PX4 飞控中,日志记录模块 logger 需要记录多个 uORB 主题的数据(如 IMU、GPS、姿态等)。为了系统统一管理这些记录需求,log…...
CSS vertical-align
这里的小空白就是为了和基线对齐 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&quo…...
“工作区”升级为“磁盘”、数据集统计概览优化|ModelWhale 版本更新
本次更新围绕用户在实际项目中对平台的理解和管理体验进行了多项优化。 “工作区”升级为“磁盘”、及其管理优化 平台“工作区”概念正式更名为“磁盘”,突出其存储功能。原有以目录代称的存储区域划分同步更名,其中“work目录”更改为“个人磁盘”&am…...
mac 电脑如何打开剪切板
mac 不像 Windows 拥有官方的剪贴板应用。所以我们需要使用官方商店中的第三方应用实现剪切板管理的功能。 打开苹果电脑上的 App Store,下载 PasteMe 或 Paste 等复制历史记录的管理工具。(PasteMe 为买断制18元,Paste为订阅制,…...
信息系统项目管理师-软考高级(软考高项)2025最新(十二)
个人笔记整理---仅供参考 第十二章项目质量管理 可能考论文??? 12.1管理基础 12.2项目质量管理过程 12.3规划质量管理 12.4管理质量 12.5控制质量...
Java、javax 和 Jakarta有什么区别?
在 Java 开发中,我们经常会看到 java、javax 和 jakarta 这些包名前缀。本文将详细介绍这三个命名空间的含义、发展历程以及它们之间的关系,帮助你更好地理解 Java 生态系统。 一、Java:核心 API 的基础 ✅ 含义: java 是 Java 标准库的核心包名。所有以 java. 开头的类构…...
LeetCode百题刷002摩尔投票法
遇到的问题都有解决的方案,希望我的博客可以为你提供一些帮助 图片源自leetcode 题目:169. 多数元素 - 力扣(LeetCode) 一、排序法 题目要求需要找到多数值(元素个数>n/2)并返回这个值。一般会想到先…...
【推荐笔记工具】思源笔记 - 隐私优先的个人知识管理系统,支持 Markdown 排版、块级引用和双向链接
Typora 使用Typora好多年了,一直非常的喜欢这个简洁的Markdown编辑工具,低版本的免费且好用。 Typora官网地址: https://typora.io/ https://typoraio.cn/ Typora的文档树如下,细看后,总觉得差点意思! 思源笔记 今…...
ACTF2025 - Web writeup
ACTF2025 - Web writeup ACTF upload 进去后是一个登录界面,输入用户名后登录,然后到一个文件上传的界面。 在 /upload?file_path 处,可以实现任意文件读取,文件内容保存在 img 标签中的 base64 值中。 示例请求:…...
使用Java实现HTTP协议服务:从自定义服务器到内置工具
在Web开发领域,HTTP协议是服务器与客户端(如Web浏览器)通信的核心。Java作为一种多功能且强大的编程语言,提供了多种方法来实现HTTP协议服务,满足从学习实验到生产部署的各种需求。本文将深入探讨在Java中实现HTTP服务的三种主要方法:使用ServerSocket构建自定义HTTP服务…...
【星海随笔】信息安全相关标准
重要的国际信息安全标准> 国际标准化组织(ISO) 该组织成立于1947年2月23日,总部位于瑞士日内瓦 国际电工委员会(IEC) 成立于1906年,最初总部设在英国伦敦,但后来于1948年迁至瑞士日内瓦…...
检查当前 Docker 使用的 默认运行时(default runtime)方法
目录 ✅ 方法一:查看 Docker 配置文件(最准确) ✅ 方法二:使用 Docker info 命令 ✅ 方法三:检查特定容器的运行时 说明:常见的 Docker Runtime ✅ 方法一:查看 Docker 配置文件(…...
【论文阅读】基于客户端数据子空间主角度的聚类联邦学习分布相似性高效识别
Efficient distribution similarity identification in clustered federated learning via principal angles between client data subspaces -- 基于客户端数据子空间主角度的聚类联邦学习分布相似性高效识别 论文来源TLDR背景与问题两个子空间之间的主角(Principa…...
MySQL 性能调优:从执行计划到硬件瓶颈
MySQL 性能调优:从执行计划到硬件瓶颈 一、性能调优的宏观视角与核心挑战 在数字化浪潮下,企业数据量呈指数级增长,MySQL 作为主流关系型数据库,面临着巨大的性能压力。某电商平台日均订单量突破千万,高峰期数据库响…...
a-range-picker 格式化 M2 为正确日期格式
直接打印 range-picker value 是一个满足 dayjs 规则的数组: Reactive<1. Array(2)1. 0:Reactive<1. M2>2. 1: M2 {$L: en, $u: undefined, $d: Fri May 02 2025 14:50:00 GMT0800 (中国标准时间), $y: 2025, $M: 4, …}3. length: 24. [[Prototype]]: Ar…...
shopping mall(document)
shopping mall(document) 商城的原型,学习,优化,如何比别人做的更好,更加符合大众的习惯 抄别人会陷入一个怪圈,就是已经习惯了,也懒了,也不带思考了。 许多产品会迫于…...
【软件设计师:软件】20.软件设计概述
一、软件设计基本原则 一、软件设计基本原则 1. 模块 是指执行某一特定任务的数据结构和程序代码。 将模块的接口和功能定义为其外部特性将模块的局部数据和实现该模块的程序代码称为内部特性。在模块设计时,最重要的原则就是实现信息隐蔽和模块独立。 2 . 信息隐蔽 将每…...
ArcScroll: 弧形滑动控件
一. 什么是ArcScroll? ArcScroll是一种基于Scroll控件实现的弧形滑动控件。可以让Scroll内容项沿着一个圆心的轨迹滑动,从而实现内容弧形滑动的效果。如下图: 水平滑动: 垂直滑动: 二. 实现方案 以下,以水平的方向…...
芋道框架 账号未登录、租户标识未传递
一. 账号未登陆 {"code": 401,"data": null,"msg": "账号未登录" } 将接口中的 PreAuthorize 注解删除, 使用 PermitAll 注解, 设置 PermitAll 无需认证 Spring Security 中的 YudaoWebSecurityConfigurerAdapter 有详细说明 PostM…...
【计算机视觉】OpenCV项目实战:get_inverse_perspective:基于OpenCV的透视图转化为不同平面
get_inverse_perspective:逆透视变换的算法实现与实战指南 一、项目概述与技术背景1.1 核心功能与技术价值1.2 逆透视变换原理1.3 技术指标对比 二、环境配置与算法实现2.1 硬件要求2.2 软件部署依赖安装核心代码结构 2.3 校准参数配置 三、核心算法优化3.1 矩阵运算…...
Jsoup与HtmlUnit:两大Java爬虫工具对比解析
Jsoup:HTML解析利器 定位:专注HTML解析的轻量级库(也就是快,但动态页面无法抓取) 核心能力: DOM树解析与CSS选择器查询 HTML净化与格式化 支持元素遍历与属性提取 应用场景:静态页面数据抽…...
使用 ANSYS AEDT(单向耦合)进行高功率同轴射频滤波器的热分析
电热模拟 当今无线射频设备日益复杂,对大型复杂射频设计的精确高效仿真需求也随之增加。在设计早期识别和预测潜在问题可以节省资源、时间和成本。热量会降低电子设备的性能和可靠性,因此热分析对于确定设备在实际工作条件下是否能达到预期性能至关重要…...
Baklib实战企业内容与中台管理差异解析
企业内容管理中台本质差异 企业内容管理系统(CMS)与内容中台的核心差异在于战略定位与技术路径的本质性区隔。传统CMS聚焦于内容存储与审批流程的线性管理,而内容中台则构建起全域数据服务中枢,通过API接口实现跨系统内容资产调用…...
API请求参数有哪些?
通用参数 app_key:应用的唯一标识,用于验证应用身份,调用API时必须提供。 timestamp:请求时间戳,通常为当前时间的毫秒级时间戳,用于防止请求被重放攻击。 format:返回数据的格式,…...
探秘 InSAR:数据处理与形变信息提取全解析
技术点目录 InSAR技术应用现状分析及其发展InSAR原理、技术方法讲解数据处理环境建立与软件熟悉SAR影像数据获取、DEM数据获取InSAR数据前处理技术InSAR地形三维重建DInSAR形变信息提取时序InSAR技术形变速率与形变时间序列信息获取星地InSAR技术监测案例了解更多 ——————…...
Nginx静态资源增加权限验证
Nginx静态资源增加权限验证 一、前言二、解决思路2.1、方式一2.2、方式二三、代码3.1、方式一3.1.1、前端代码3.1.2、后端代码3.1.3、Nginx调整3.1.4、注意事项3.2.方式二四、参考资料一、前言 在项目开发的过程中,项目初期,及大部分小型项目都是使用共享磁盘进行静态文件的…...
初识MySQL
1. 什么是数据库 2. 什么是MySQL 我们在使用MySQL与Java进行交互时使用的接口为JDBC 3. MySQL安装与SQLyog管理工具 附录将会提供相关绿色版软件,不用从官网下载了 配置环境变量: 双击打开,新建(根据mysql的根目录写pathÿ…...
计算机网络:深度解析基于链路状态的内部网关协议IS-IS
IS-IS(Intermediate System to Intermediate System)路由协议详解 IS-IS(Intermediate System to Intermediate System)是一种基于链路状态的内部网关协议(IGP),最初由ISO为OSI(开放系统互连)模型设计,后经扩展支持IP路由。它广泛应用于大型运营商网络、数据中心及复…...
python---kafka常规使用
安装依赖 在开始之前,需要安装 kafka-python 库。可以通过以下命令安装: pip install kafka-python创建生产者 生产者负责将消息发送到 Kafka 主题。以下是一个简单的生产者示例: from kafka import KafkaProducer import json import ti…...
图像泊松融合(convpyr_small版本)
一、背景介绍 前面已经讲过泊松融合算法和它的fft快速版本实现了,想看下还有没有更快的版本,继续翻了下论文,找到了更快速的版本:Convolution Pyramids 。 找到它的matlab代码跑了下,效果还不错。学习记录,…...
ABP vNext + EF Core 实战性能调优指南
ABP vNext EF Core 实战性能调优指南 🚀 目标 本文面向中大型 ABP vNext 项目,围绕查询性能、事务隔离、批量操作、缓存与诊断,系统性地给出优化策略和最佳实践,帮助读者快速定位性能瓶颈并落地改进。 📑 目录 ABP vN…...
Spark,在shell中运行RDD程序
在hdfs中/wcinput中创建一个文件:word2.txt在里面写几个单词 启动hdfs集群 [roothadoop100 ~]# myhadoop start [roothadoop100 ~]# cd /opt/module/spark-yarn/bin [roothadoop100 ~]# ./spark-shell 写个11测试一下 按住ctrlD退出 进入环境:spar…...
【Python 元组】
Python 中的元组(Tuple)是一种不可变的有序数据集合,用于存储多个元素的序列。与列表(List)类似,但元组一旦创建后无法修改,这种特性使其在特定场景下具有独特优势。 一、核心特性 不可变性&am…...
如何将邮件送达率从60%提升到95%
一、邮件送达率的重要性 邮件送达率是邮件营销效果的关键指标。高送达率能增加邮件被打开、阅读和互动的机会;低送达率则可能导致邮件被误判为垃圾邮件,浪费企业资源。 二、影响邮件送达率的因素及优化策略 1.发件人信誉 建立良好信誉:发…...
【Python】Python单元测试框架unittest总结
1. 本期主题:Python单元测试框架unittest详解 unittest是Python内置的单元测试框架,遵循Java JUnit的"测试驱动开发"(TDD)理念,通过继承TestCase类实现测试用例的模块化组织。本文聚焦于独立测试脚本的编写…...
机器人运动控制技术简介
机器人运动控制详解:从基础原理到技术方案 一、机器人运动控制本质 机器人运动控制是通过算法协调电机、传感器和机械结构,实现精确的位姿(位置姿态)控制。其核心要解决三个问题: 去哪里 - 路径规划&#x…...
在linux系统中,没有网络如何生成流量以使得wireshark能捕获到流量
在没有网络连接的情况下,仍然可以通过生成本地流量来测试Wireshark的捕获功能。以下是一些方法可以在Linux系统中生成本地流量,以便Wireshark可以捕获到这些流量: 1. 使用ping命令 ping命令可以生成ICMP(Internet Control Messa…...
常见图像融合算法(图像泊松融合)
一、背景介绍 上一篇已经讲过alpha和金字塔融合基本实现,这里主要是继续对图像常用的泊松融合算法和他的一些性能版本实现的基本讲解。 二、原始版本 1、基本原理 图像泊松融合也是普遍使用的常规算法,很多小伙伴已经分享过它的基本原理和实现了&#…...
大疆无人机搭载树莓派进行目标旋转检测
环境部署 首先是环境创建,创建虚拟环境,名字叫 pengxiang python -m venv pengxiang随后激活环境 source pengxiang/bin/activate接下来便是依赖包安装过程了: pip install onnxruntime #推理框架 pip install fastapi uvicorn[standard] #网络请求…...
tryhackme——Active Directory Basics
文章目录 一、Windows Domains二、活动目录AD2.1 Active Directory Users and Computers2.2 安全组和组织单位OU 三、管理AD中的用户3.1 删除额外的OUs和用户3.2 委托 四、管理AD中的计算机五、组策略5.1 查看GPO5.2 GPO分发5.3 新建GPO 六、认证方式6.1 Kerberos认证6.2 NetNT…...
Linux基础(关于进程相关命令)
1.查看系统进程 ps -aux 查看所有的系统进程 我们一般配合 | grep 使用,比如 ps -aux | grep bin 就是查看所有bin的进程信息 2.查看系统实时进程 top 和Windows的任务管理器的功能类似 3.结束进程 kill -9 PID 根据上面的进程信息可得,每个进程都有一个…...
切比雪夫不等式详解
切比雪夫不等式详解 一、引言 切比雪夫不等式(Chebyshev’s Inequality)是概率论和统计学中最重要的基本定理之一,由俄国数学家切比雪夫(P. L. Chebyshev,1821-1894)提出。它为我们提供了一个强大工具&am…...
自然语言处理 (NLP) 技术发展:从规则到大型语言模型的演进之路
自然语言处理 (NLP) 技术发展:从规则到大型语言模型的演进之路 自然语言处理(NLP)是人工智能领域中一个极具挑战性和活力的分支,其目标是赋予计算机理解、解释和处理人类语言的能力。从早期的基于规则的系统到当前由大型语言模型(LLM)引领的时代,NLP 技术经历了深刻的演…...
CurrentHashMap的整体系统介绍及Java内存模型(JVM)介绍
当我们提到ConurrentHashMap时,先想到的就是HashMap不是线程安全的: 在多个线程共同操作HashMap时,会出现一个数据不一致的问题。 ConcurrentHashMap是HashMap的线程安全版本。 它通过在相应的方法上加锁,来保证多线程情况下的…...
手撕红黑树的 左旋 与 右旋
一、为什么需要旋转? 在红黑树中,插入或删除节点可能会破坏其五条性质,比如高度不平衡或连续红节点。 为了恢复红黑性质,我们采用局部旋转来“调整树形结构”,保持平衡。 二、旋转本质是“局部变形” 左旋和右旋不会…...
Java——反射
目录 5 反射 5 反射 类信息:方法、变量、构造器、继承和实现的类或接口。反射:反射是 Java 中一项强大的特性,它赋予了程序在运行时动态获取类的信息,并能够调用类的方法、访问类的字段以及操作构造函数等的能力。通过反射&#…...
一文了解Python中的requests库:网络交互的基础
目录 1. 前言 2. requests库的基本概念 3. requests库的适应场景 4. requests库的基本使用 4.1 安装requests 4.2 发送第一个请求 4.3 常见HTTP请求方法 4.4 响应对象的属性 4.5 发送带参数的请求 4.6 处理请求和响应 5. 高级功能 5.1 文件上传 5.2 会话对象 5.3…...