常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析
常见集合篇:算法复杂度分析,从理论到业务场景的深度解析
- 常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析
- 一、为什么要进行复杂度分析
- (一)事后统计法的局限性
- (二)复杂度分析的优势
- 二、时间复杂度
- (一)案例:不同算法在业务场景中的时间表现
- (二)大 O 表示法
- (三)常见复杂度表示形式
- 1. 时间复杂度 O (1)
- 2. 时间复杂度 O (n)
- 3. 时间复杂度 O (logn)
- 4. 时间复杂度 O (n logn)
- 三、空间复杂度
- (一)空间复杂度的定义与意义
- (二)空间复杂度案例分析
- (三)空间复杂度与时间复杂度的权衡
常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析
一、为什么要进行复杂度分析
(一)事后统计法的局限性
在算法优化与选择的过程中,部分开发者可能会想到通过事后统计法来分析算法性能,即编写代码运行,记录其在实际运行中的时间和空间消耗。然而,这种方法存在明显的缺陷。首先,它依赖于具体的运行环境,不同的硬件配置(如 CPU 性能、内存大小)、软件环境(如操作系统、编译器)会导致结果差异巨大。例如,同一算法在高性能服务器上运行耗时极短,在老旧手机上却可能明显卡顿。其次,事后统计法无法在算法实现前对其性能进行预测,若算法在大规模数据下表现糟糕,待实现后才发现问题,会造成资源浪费。
(二)复杂度分析的优势
- 预测算法性能
通过复杂度分析,我们能在算法设计阶段就预估其在不同数据规模下的表现。以电商平台的促销活动为例,在 “双 11” 大促时,订单量会呈指数级增长。假设某订单处理算法的时间复杂度为 O (n²),当订单量 n 从 1 万增长到 10 万时,其处理时间会从 1 万 ²(1 亿次操作)增长到 100 亿次操作,这显然无法满足实时处理的需求。而提前进行复杂度分析,若能选择时间复杂度为 O (n logn) 的算法,就能更好地应对高流量场景,确保订单处理的高效性。 - 比较算法优劣
面对同一问题的多种算法实现,复杂度分析能提供客观的比较依据。例如,在实现一个数据排序功能时,冒泡排序的时间复杂度为 O (n²),而快速排序平均时间复杂度为 O (n logn)。通过复杂度分析,我们可以明确在处理大规模数据时,快速排序在性能上远超冒泡排序,从而做出更优的算法选择。 - 指导算法优化方向
当算法在实际应用中性能不佳时,复杂度分析能帮助定位问题。如果发现某算法的时间复杂度较高,可针对性地优化其核心循环部分或数据结构。比如,将嵌套循环的 O (n²) 结构优化为 O (n logn),提升算法效率。
二、时间复杂度
(一)案例:不同算法在业务场景中的时间表现
以物流行业的路径规划为例,假设需要为快递员规划访问多个配送点的最优路径。若采用暴力枚举法,计算所有可能路径的数量为 n!(n 为配送点数量),其时间复杂度极高,当 n=10 时,计算量就已达到 3628800 次,这在实际业务中几乎不可行。而采用优化的启发式算法,如 A * 算法,其时间复杂度相对较低,能在合理时间内为快递员规划出较优路径,满足实时配送的需求。
(二)大 O 表示法
大 O 表示法是一种描述算法时间复杂度的形式化方法,它忽略常数、系数和低阶项,专注于算法执行时间随数据规模增长的趋势。例如,对于算法的执行次数表达式 T (n)=3n²+2n+10,在大 O 表示法中,我们只关注最高阶项 n²,其时间复杂度表示为 O (n²)。
在社交 APP 的消息处理中,假设某算法用于对用户发送的消息进行排序。若其执行次数与消息数量 n 的关系为 T (n)=5n+100(处理固定数量的系统消息),按照大 O 表示法,忽略常数 100 和系数 5,其时间复杂度为 O (n)。这意味着随着用户消息数量的增加,算法处理时间将线性增长,开发者可据此评估系统在高并发消息场景下的性能。
(三)常见复杂度表示形式
1. 时间复杂度 O (1)
定义与原理:
O (1) 表示算法的执行时间与数据规模无关,无论数据量是多少,算法执行固定次数的操作即可完成。其核心特点是操作步骤为常量级,不随 n 的变化而变化。
业务场景案例:
- 数据库查询:在数据库中,通过唯一索引查询一条记录。例如,电商平台的用户信息查询,已知用户 ID(唯一索引),数据库可直接定位到对应的记录,操作时间固定。代码示例:
// 假设userDao通过用户ID查询用户信息,内部基于唯一索引实现
User user = userDao.queryUserById("user_123");
- 缓存取值:在应用的缓存系统中,通过键值对获取数据。如 Redis 缓存中,根据商品 ID 获取商品详情,由于哈希表的底层实现,其查找时间为 O (1)。代码示例:
# 从Redis缓存中获取商品详情
product_detail = redis.get("product:123")
2. 时间复杂度 O (n)
定义与原理:
O (n) 表示算法的执行时间与数据规模 n 成正比,通常需要遍历数据一次。随着 n 的增大,操作次数线性增加。
业务场景案例:
- 订单遍历检查:电商平台的订单系统中,需要遍历用户的所有订单,检查是否存在未支付的订单。假设用户有 n 笔订单,算法需逐一检查,时间复杂度为 O (n)。代码示例:
List<Order> orderList = user.getOrderList();
boolean hasUnpaidOrder = false;
for (Order order : orderList) {if (order.getStatus() == OrderStatus.UNPAID) {hasUnpaidOrder = true;break;}
}
- 日志文件分析:在运维场景中,分析日志文件查找特定错误信息。假设日志文件有 n 行记录,需逐行扫描,时间复杂度为 O (n)。代码示例:
error_lines = []
with open('app.log', 'r') as f:for line in f.readlines():if 'ERROR' in line:error_lines.append(line)
3. 时间复杂度 O (logn)
定义与原理:
O (logn) 的算法中,数据规模以对数级减少,常见于二分操作。每次操作都能将问题规模缩减一半,效率极高。
业务场景案例:
- 搜索引擎的关键词查找:搜索引擎的索引系统中,使用二分查找算法在有序的关键词列表中查找用户输入的关键词。假设关键词列表有 n 个元素,每次比较都能排除一半的元素,时间复杂度为 O (logn)。代码示例:
public int binarySearch(String[] sortedKeywords, String target) {int low = 0;int high = sortedKeywords.length - 1;while (low <= high) {int mid = low + (high - low) / 2;int cmp = sortedKeywords[mid].compareTo(target);if (cmp == 0) {return mid;} else if (cmp < 0) {low = mid + 1;} else {high = mid - 1;}}return -1;
}
- 电商商品价格区间筛选:在电商平台中,对商品价格进行区间筛选。假设商品价格已排序,使用二分法快速定位价格区间的边界,时间复杂度为 O (logn)。例如,从百万级商品中筛选价格在 100-200 元的商品,通过二分法快速确定起始和结束位置。
4. 时间复杂度 O (n logn)
定义与原理:
O (n logn) 是 O (n) 和 O (logn) 的结合,常见于一些高效的排序算法。算法整体上需要对 n 个元素进行处理,每个元素的处理涉及 O (logn) 的操作。
业务场景案例:
- 电商商品排序:电商平台的商品列表展示,需要对商品按价格、销量等维度排序。使用快速排序(平均时间复杂度 O (n logn))算法,能在较短时间内完成大规模商品数据的排序。假设平台有 n 个商品,快速排序通过分治策略,每次将数据分成两部分,每部分的处理时间为 O (logn),整体时间复杂度为 O (n logn)。代码示例:
public void quickSort(int[] arr, int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}public int partition(int[] arr, int low, int high) {int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, high);return i + 1;
}public void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}
- 物流车辆路径优化:物流企业对多辆配送车辆的路径进行优化,涉及对多个配送点的排序和规划。使用时间复杂度为 O (n logn) 的算法,能在合理时间内处理大量配送点数据,为每辆车规划最优路径。
三、空间复杂度
(一)空间复杂度的定义与意义
空间复杂度用于衡量算法在运行过程中占用的额外空间(除输入数据本身占用空间外)随数据规模的增长趋势。与时间复杂度类似,它关注的是空间占用的增长趋势,而非具体数值。在资源有限的场景中,如嵌入式系统、移动应用等,空间复杂度的分析尤为重要,能帮助开发者合理分配内存资源,避免内存溢出等问题。
(二)空间复杂度案例分析
- O (1) 空间复杂度
业务场景:在一个简单的数值计算中,如计算两个数的和。无论输入的数值多大,算法只需要固定的额外空间(用于存储中间结果和变量)。代码示例:
public int add(int a, int b) {int sum = a + b; // 仅占用固定空间存储sumreturn sum;
}
原理:算法执行过程中,额外占用的空间不随输入数据规模变化,始终为常量级。
- O (n) 空间复杂度
业务场景:在图像处理中,将一张图片的像素数据进行复制。假设图片有 n 个像素点,需要创建一个大小为 n 的数组来存储复制的像素数据,空间复杂度为 O (n)。代码示例:
def copy_pixels(pixels):n = len(pixels)copied_pixels = [0] * n # 占用O(n)空间for i in range(n):copied_pixels[i] = pixels[i]return copied_pixels
原理:额外空间的占用与输入数据规模 n 成正比,随 n 的增大而线性增长。
- O (n²) 空间复杂度
业务场景:在矩阵运算中,创建一个 n×n 的二维数组来存储矩阵数据。例如,在图形渲染的矩阵变换中,若处理一个 n×n 的像素矩阵,其空间复杂度为 O (n²)。代码示例:
public int[][] createMatrix(int n) {int[][] matrix = new int[n][n]; // 占用O(n²)空间for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {matrix[i][j] = i * n + j;}}return matrix;
}
原理:额外空间的占用与数据规模 n 的平方成正比,常用于二维数据结构的存储。
(三)空间复杂度与时间复杂度的权衡
在实际算法设计中,常常需要在空间复杂度和时间复杂度之间进行权衡。例如,斐波那契数列的计算:
- 递归实现(时间复杂度高,空间复杂度低):
public int fibonacciRecursive(int n) {if (n <= 1) {return n;}return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}
此方法时间复杂度为 O (2ⁿ),空间复杂度为 O (n)(递归调用栈的深度)。
- 迭代实现(时间复杂度低,空间复杂度低):
public int fibonacciIterative(int n) {if (n <= 1) {return n;}int prev = 0;int curr = 1;for (int i = 2; i <= n; i++) {int next = prev + curr;prev = curr;curr = next;}return curr;
}
此方法时间复杂度为 O (n),空间复杂度为 O (1)。
在资源充足的服务器环境中,可能更倾向于选择时间复杂度低的迭代实现;而在对空间要求极高的嵌入式系统中,需综合评估两种实现的优劣,甚至采用更优化的存储方式(如仅存储必要的中间结果)来降低空间占用。
相关文章:
常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析
常见集合篇:算法复杂度分析,从理论到业务场景的深度解析 常见集合篇(一):算法复杂度分析,从理论到业务场景的深度解析一、为什么要进行复杂度分析(一)事后统计法的局限性(二…...
SpringCould微服务架构之Docker(9)
Docker的基本操作之数据卷 容器跟数据耦合的问题: 1、不便于修改:当我们要修改Nginx的html内容时,需要进入容器内部修改,很不方便。 2、数据不可复用:在容器内部 的修改对外是不可见的,所有的修改对新创…...
探索 Gaggol:理解 10^^^100 的宇宙级常数
一、常数概述: Gaggol 是一个极其巨大的数学常数,其数值表示为 10^^^100。这个常数是通过对数字 10 进行超递归幂运算得到的结果。 二、Gaggol 的定义: Gaggol 被定义为 10 的超多层超递归幂,即 10 被连续地提升到自身幂的层次达…...
【C++】STL库_stack_queue 的模拟实现
栈(Stack)、队列(Queue)是C STL中的经典容器适配器 容器适配器特性 不是独立容器,依赖底层容器(deque/vector/list)通过限制基础容器接口实现特定访问模式不支持迭代器操作(无法遍历…...
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例13,TableView16_13 键盘辅助拖拽示例
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加行拖拽排序功能示例13,TableView16_13 键…...
Python的概论
免责声明 如有异议请在评论区友好交流,或者私信 内容纯属个人见解,仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示:: 提示:以下是本篇文章正文内容,…...
AI 数字人短视频数字人口播源码:短视频内容生产的新引擎
在当下信息爆炸的时代,短视频已成为主流的信息传播与娱乐方式之一。在如此庞大的市场需求下,如何高效、创新地生产短视频内容成为了行业关注的焦点。AI 数字人短视频数字人口播源码应运而生,为短视频内容生产带来了全新的变革。 一、行业背…...
数字人训练数据修正解释
数字人训练数据修正和查看 不需要GPU也能运行的DH_live-案例 : I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To t…...
VRRP虚拟路由器冗余协议
一、VRRP介绍 VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)是一种用于提高网络可靠性的协议,旨在通过冗余机制解决默认网关单点故障问题。 核心思想:将多个物理路由器虚拟成一个逻辑路由器…...
微前端 - 以无界为例
一、微前端核心概念 微前端是一种将单体前端应用拆分为多个独立子应用的架构模式,每个子应用可独立开发、部署和运行,具备以下特点: 技术栈无关性:允许主应用和子应用使用不同框架(如 React Vue)。独立部…...
Python与图像处理
目录 一、认识图像 1、图像的构成 2、图像模式 二、处理图像 1、图像缩放 2、图像的旋转和翻转 3、滤镜效果 4、图片剪裁 5、图片素描 6、图片加水印 在众多的Python的第三方的库中,Pillow库是一个强大且方便的库,它能够处理图像,比…...
Lua语言脚本环境配置
参考地址:Lua 教程 | 菜鸟教程 Windows等直接下载安装地址:Lua Binaries 上面也是会跳转下载:https://sourceforge.net/projects/luabinaries/ 下载解压后在“环境变量”中添加路径,添加后如果cmd中还是无法使用lua命令&#x…...
JavaScript的异步编程
目录 目标 实战 回调函数 (Callback) Promise 目标 了解异步编程实现方式。 实战 回调函数 (Callback) 当某个任务完成后,调用回调函数来处理结果。它通常会导致回调地狱,即嵌套多个回调函数,官方不推荐使用。 function fetchData(call…...
Ubuntu里安装Jenkins
【方式1】:下载war包,直接运行,需提前搭建Java环境,要求11或17,不推荐,war包下载地址,将war包上传到服务器,直接使用命令启动 java -jar /data/jenkins/jenkins.war【方式2】&#…...
qt介绍tcp通信
服务器端代码 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);setWindowTitle("服务器");ui->port->setText("…...
elementui的默认样式修改
今天用element ui ,做了个消息提示,发现提示的位置总是在上面,如图: 可是我想让提示的位置到下面来,该怎么办? 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码 效…...
【Windows】win10系统安装.NET Framework 3.5(包括.NET 2.0和3.0)失败 错误代码:0×80240438
一、.NET3.5(包括.NET 2.0和3.0)安装方式 1.1 联网安装(需要联网,能访问微软,简单,很可能会失败) 1.2 离线安装-救急用(需要操作系统iso镜像文件,复杂,成功几率大) 二、联网安装 通过【控制面板】→【程序】→【程序和功能】→【启用或关闭Windows功能】 下载过程…...
leetcode 53.Maximum Subarray
分治法 //lSum表示[left,right]内以left为左端点的最大子段和 //rSum表示[left,right]内以right为右端点的最大字段和 //iSum表示[left,right]的区间和 int divide_conquer(int* nums,int left,int right,int *lSum,int *rSum,int *iSum){int maxSum;//表示[left,right]内的最…...
手机零售行业的 AI 破局与创新降本实践 | OceanBase DB大咖说
OceanBase《DB 大咖说》第 20 期,我们邀请了九机与九讯云的技术总负责人,李远军,为我们分享手机零售企业如何借力分布式数据库OceanBase,赋能 AI 场景,并通过简化架构实现成本管控上的突破与创新。 李远军于2016年加入…...
基于MCU实现的电机转速精确控制方案:软件设计与实现
本文将详细介绍一篇基于微控制器(MCU)的电机转速精确控制的软件方案。通过采样PWM信号控制和ADC采样技术,结合PID闭环控制算法,实现了电机转速的高效、稳定调节。以下是软件方案流程图,下文将对其进行展开讲解。 原图太…...
【力扣hot100题】(026)合并两个有序链表
可以创建一个新链表记录答案: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *…...
从代码学习深度学习 - 使用块的网络(VGG)PyTorch版
文章目录 前言一、VGG网络简介1.1 VGG的核心特点1.2 VGG的典型结构1.3 优点与局限性1.4 本文的实现目标二、搭建VGG网络2.1 数据准备2.2 定义VGG块2.3 构建VGG网络2.4 辅助工具2.4.1 计时器和累加器2.4.2 准确率计算2.4.3 可视化工具2.5 训练模型2.6 运行实验总结前言 深度学习…...
程序化广告行业(46/89):竞价结算规则、底价策略与内部排名解析
程序化广告行业(46/89):竞价结算规则、底价策略与内部排名解析 大家好!在之前的几篇博客中,我们已经深入探讨了程序化广告的多个重要方面,从基础概念到实际操作流程。我写这些博客的目的,就是希…...
C/C++ 基础 - 回调函数
目录 前言 回调函数预备知识 函数指针 什么是函数指针 函数指针的语法 如何用函数指针调用函数 函数指针作为函数的参数 函数指针作为函数返回类型 函数指针数组 回调函数 什么是回调函数 为什么要用回调函数 怎么使用回调函数 总结 前言 在写项目的时候&#x…...
【Node.js入门笔记12---npm包】
Node.js入门笔记12 Node.js---npm包一、什么是npm包?二、npm 基础使用三、包管理配置文件(package.json)四、提升下载速度 五、包的分类 Node.js—npm包 一、什么是npm包? 定义 npm(全称 Node Package Manager&#x…...
黑盒测试的正交实验法
背景: 利用因果图法、判定表法可以帮助我们对于输入数据的组合情况进行用例设计,但当输入数据的组合数量巨大时,由于不太可能覆盖到每个输入组合的测试情况,因果图法或判定表法可能就不太适用了,可以采用正交实验法、来合理地减少…...
链表算法的技巧和方法
常用技巧: 1、画图 2、引入虚拟的头节点 3、不要害怕浪费空间,要勇于定义变量,eg:当链表的插入和删除的时候,为了便于结构体指针的连续性,就需要定义一个新的结构体指针,能更加方便; 4、使用快慢…...
Upload-labs 靶场搭建 及一句话木马的原理与运用
1、phpstudy及upload-labs下载 (1)下载phpstudy小皮面板 首先需要软件phpstudy 下载地址 phpStudy下载-phpStudy最新版下载V8.1.1.3 -阔思亮 (2)然后到github网址下载源码压缩包 网址 https://github.com/c0ny1/upload-labs 再…...
基于PX4和Ardupilot固件下自定义MAVLink消息测试(QGroundControl和Mission Planner)
在无人机行业,MAVLink(Micro Air Vehicle Link)协议已经成为了通信的标准协议。MAVLink协议定义了一种轻量级的消息传输格式,广泛应用于PX4和ArduPilot等开源无人机飞控固件中。通过自定义MAVLink消息,我们可以为无人机…...
Maven快速上手
在前面我们学习了许多关于JAVA的知识,从今天这个博客开始我们就要进入到JAVAEE进阶的学习中了,在这里你们可以学到项目是怎么被我们一步步写出来。让我们为之加油吧!!!! 本期讲解: 1.了解Maven…...
【Django】教程-5-ModelForm增删改查+规则校验【正则+钩子函数】
【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 11. ModelForm 11.1 models.py from django.utils import timezone from django.db import models# 数据库ÿ…...
JavaScript中 == 和 === 区别
== 运算符 它是相等运算符,用于比较两个 值 是否相等 ( 如果两个值的类型不同,它会尝试将它们转换为相同的类型,然后再比较。) 示例: console.log(1 == 1); // true,因为1被转换为数字1,所以相等 console.log(1 == true); // true,因为true被转换为数字1,所以相等…...
使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI
使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI 本篇摘要16. 使用LangChain Agents构建Gradio及Gradio Tool16.3 使用Langchain agents构建Gradio UI16.3.1 创建代理16.3.2 创建Gradio UI16.3.3 运行demo参考文献本章目录如下: 《使…...
scikit-surprise 智能推荐模块使用说明
目录 1、前言 2、算法 3、数据集 3.1 three built-in datasets are available: 3.2 Load a dataset from a pandas dataframe. 3.3 Load a dataset from a (custom) file. 3.4 Load a dataset where folds (for cross-validation) are predefined by some files. 4、pre…...
基于python开发的邮箱合并群发工具
智能邮件群发系统 一个基于Python和PyQt5开发的智能邮件群发工具,支持Word模板和Excel数据源的自动匹配,具有现代化UI界面和友好的用户体验。 Github项目地址:https://github.com/liugang926/Auto-mail-sent.git dist目录有编译好的exe程序&…...
分治算法之凸包问题
1. 算法思路 基本思想 利用分治策略解决凸包问题主要分为两大步骤: 分解(Divide): 将所有点按照 x 坐标排序,并将点集分为左右两部分。 递归地对左右两部分分别求解凸包。 合并(Conquer/Merge…...
OpenBMC:BmcWeb 处理http请求3 字典树查找节点
OpenBMC:BmcWeb 处理http请求2 查找路由对象-CSDN博客 findRouteByPerMethod实际上是调用了perMethod.trie.find(url);来查找路由对象的 class Trie {struct FindResult{unsigned ruleIndex;std::vector<std::string> params;};FindResult findHelper(const std::string…...
音频进阶学习二十五——脉冲响应不变法实现低通滤波器
文章目录 前言一、脉冲响应不变法1.定义2.模拟系统冲激响应的周期采样3.模拟系统和数字系统的频域响应关系1)S域和Z域的关系2)幅频响应的关系 4.通过有理函数设计滤波器5.总结 二、低通滤波器的设计实例1.给定数字滤波器指标2.转换模拟滤波器指标3.模拟滤…...
Linux中输入输出管理技巧
一、输入输出使用到的系统资源 1、字符设备(Character Devices) 什么是字符设备 字符设备是 Linux 中的一类设备,支持以字符为单位进行数据传输。与块设备不同,字符设备不需要缓 冲区,即数据是逐字节直接传递的。典…...
wireshark抓包工具的使用
下载地址:https://www.wireshark.org/#downloadLink 安装方式,一路next。 使用方式 第一步启动后选择你要抓包的网卡,ipconfig 可以查看你的默认网卡,我的是 以太网 双击进入。 筛选操作(快速筛选方式)…...
javaweb自用笔记:文件上传案例、登录(统一拦截)案例
文件上传 或者说新建一个类配置好信息,然后到aliOssUtils里面用getter、setter方法获取到配置项 登录(统一拦截) 前端要json格式的数据,捕获到异常后前端可以显示错误(对不起,操作失败,请联系管…...
【区块链安全 | 第十七篇】类型之引用类型(一)
文章目录 引用类型数据存储位置分配行为 数组特殊数组:bytes 和 string 类型bytes.concat 和 string.concat 的功能分配 memory 数组数组字面量(Array Literals)二维数组字面量数组成员(Array Members)悬空引用&#x…...
2025国内DevOps新手突围指南:从Gitee零门槛入门到工具链深度对比
对于刚接触DevOps的新手,推荐优先选择Gitee DevOps平台,其次是Jenkins和GitLab。Gitee DevOps作为国内领先的一站式研发效能平台,深度融合代码托管、持续集成/持续交付(CI/CD)、项目协作等功能,不仅界面简洁…...
【C语言】文件操作(2)
一、文件的随机读写 在前面我们学习了文件的顺序读写的函数,那么当我们要读取某个指定位置的内容的时候,是否只能顺序的读取到这个内容?还有在对文件进行输入的时候,需要对指定的位置进行写入,那么此时应该怎么办呢&a…...
将内网的IP地址映射到外网的几种方案
文章目录 1. 背景与目标2. 核心方案选型3. 方案A:路由器端口映射(详细步骤)3.1 前置条件3.2 配置流程3.3 验证访问 4. 方案B:云平台NAT网关配置(以阿里云为例)4.1 前置条件4.2 配置流程4.3 验证访问 5. 方案…...
基于深度学习的图像超分辨率技术研究与实现
一、引言 在数字图像处理领域,图像超分辨率技术一直是一个备受关注的热点话题。随着人们对图像质量要求的不断提高,如何将低分辨率图像提升到高分辨率,同时保持图像的细节和清晰度,成为了一个极具挑战性的问题。传统的图像超分辨率技术主要依赖于插值方法,如双线性插值、双…...
A股复权计算_权息数据整理
目录 前置: 步骤: 1 以通达信为参照 2 从优矿获取所需数据 2.1 股票配股信息 2.2 股票分红信息 2.3 股票拆股信息 3 合并数据,制成权息数据表 权息数据截止20250329.7z 视频 前置: 1 本系列将以 “A股复权计算_” 开头…...
如何进行Prompt调优?
一. 神奇的咒语 在输入prompt前,加入下面这一段“神奇的咒语”,中文或者英文,就能帮你优化提示词。 I want you to become my Expert Prompt Creator. Your goal is to help me craft the best possible prompt for my needs. The prompt yo…...
Git Tag 详解:版本管理与实战指南
文章目录 Git Tag 详解:版本管理与实战指南1. Git Tag 的类型2. Git Tag 的常见操作(1) 创建标签① 创建轻量标签② 创建附注标签③ 给指定的提交打标签 (2) 查看标签(3) 删除标签(4) 推送标签到远程① 推送单个标签② 推送所有标签 (5) 删除远程标签 3. 使用 Tag 的…...
从零开始打造HTML5拼图游戏:一个Canvas实战项目
从零开始打造HTML5拼图游戏:一个Canvas实战项目 先看效果: 你是否曾经被那些精美的网页拼图游戏所吸引?用 HTML5 的 Canvas 技术,从零开始,教你怎么画图、处理鼠标事件,还有游戏的核心逻辑,…...