【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读
【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读
文章目录
- 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读
- 前言
- autopad函数
- Conv类
- __init__成员函数
- forward成员函数
- forward_fuse成员函数
- Bottleneck类
- __init__成员函数
- forward成员函数
- Concat类
- __init__成员函数
- forward成员函数
- 总结
前言
在详细解析YOLOV3网络之前,首要任务是搭建Ultralytics–YOLOV3【Windows11下YOLOV3人脸检测】所需的运行环境,并完成模型的训练和测试,展开后续工作才有意义。
本博文对models/common.py代码进行解析,common.py文件存放着YOLOV3网络搭建常见的通用模块。其他代码后续的博文将会陆续讲解。这里只做YOLOV3相关模块的代码解析,其他的通用模块是YOLO后续系列中创新和提出的。
autopad函数
用于自动计算卷积层的填充值(padding),以确保当步幅为1时卷积操作后的输出特征图尺寸保持不变。
def autopad(k, p=None): # kernel, padding"""用于自动计算卷积层的填充值:param k:卷积核大小:param p:填充值:return:计算得到的填充值"""if p is None: # 检查是否需要自动计算填充值,否则用户指定填充值# 正方形卷积核:isinstance(k, int)表示k是一个整数,卷积核是正方形,填充值p被为k//2,即卷积核大小的一半向下取整# 非正方形卷积核: 是一个列表或元组,则对每个维度分别计算填充值,同理计算填充值pp = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn p
理论基础: 在二维卷积中,输出特征图的尺寸可以通过以下公式计算:
O u t p u t S i z e = I n p u t S i z e + 2 p − k s + 1 OutputSize = \frac{{InputSize + 2p - k}}{{\rm{s}}} + 1 OutputSize=sInputSize+2p−k+1
其中: I n p u t S i z e InputSize InputSize是输入特征图的尺寸; p p p是填充大小; k k k是卷积核大小; s s s是步长。
根据上述方程,当 s = 1 s=1 s=1且输出尺寸等于输入尺寸时,解出 p p p的值:
p = ⌈ k − 1 2 ⌉ = ⌊ k 2 ⌋ p = \left\lceil {\frac{{k - 1}}{2}} \right\rceil = \left\lfloor {\frac{k}{2}} \right\rfloor p=⌈2k−1⌉=⌊2k⌋
由于填充大小 p p p必须是整数,因此使用向下取整除法(//),即 p = k / / 2 p=k//2 p=k//2 来自动计算填充值,确保了无论卷积核大小 k k k是奇数还是偶数,都可以正确计算出合适的填充大小,使得在步长为1的情况下,输出尺寸尽可能接近输入尺寸。对于非对称的卷积核,分别对每个维度应用此规则以保证各自的输出尺寸匹配相应的输入尺寸。
Conv类
__init__成员函数
构造函数,初始化自定义的卷积模块,通常包含卷积层、批量归一化层和激活函数。调用了【models/common.py】的autopad函数
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): # ch_in, ch_out, kernel, stride, padding, groups"""构造函数,初始化自定义的卷积模块:param c1:输入通道数:param c2:输出通道数:param k:卷积核大小,默认为 1:param s:步幅,默认为 1:param p:填充,默认为None(不指定为None会自动计算填充值):param g:分组卷积的分组数,默认为 1(标准卷积):param act:是否使用激活函数,默认为True(使用nn.SiLU()),False则使用nn.Identity()(相当于没使用任何函数),提供了指定激活函数对象则使用指定的激活函数"""super().__init__()# 创建一个二维卷积层self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)# 创建一个批量归一化层self.bn = nn.BatchNorm2d(c2)# 设置激活函数self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
本博文讲解的代码原论文的源码,是YOLOV5团队复现改进后的YOLOV3代码,因此自定义的卷积模块的结构与原论文的结构在激活函数的选择上有所不同。
在YOLOV5中,SiLU替换了早期版本中的Leaky ReLU,显著提升了模型的性能。在EfficientNet系列中,SiLU成为了默认激活函数。
forward成员函数
前向传播,执行自定义的卷积模块。
def forward(self, x):"""前向传播,执行模块:param x:输入数据张量:return:卷积块的输出"""return self.act(self.bn(self.conv(x)))
forward_fuse成员函数
融合前向传播,跳过了批量归一化层,推理阶段使用可以提高计算效率。
def forward_fuse(self, x):"""融合前向传播,跳过了批量归一化层,推理阶段使用可以提高计算效率:param x:输入数据张量:return:卷积块的输出"""return self.act(self.conv(x))
Bottleneck类
__init__成员函数
自定义的瓶颈模块,通常用于构建类似残差网络的残差块。
def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): # ch_in, ch_out, shortcut, groups, expansion"""构造函数,构建类似残差网络的残差块:param c1:输入通道数:param c2:输出通道数:param shortcut:是否使用残差连接,默认为 True:param g: 分组卷积的分组数,默认为1(标准卷积):param e:扩展比例,用于计算中间隐藏层的通道数默认为 0.5"""super().__init__()c_ = int(c2 * e) # 计算中间隐藏层的通道数self.cv1 = Conv(c1, c_, 1, 1) # 第一层1×1卷积层self.cv2 = Conv(c_, c2, 3, 1, g=g) # 第二层3×3卷积层self.add = shortcut and c1 == c2 # 判断是否添加残差连接:使用残差连接且输入通道数等于输出通道数
原论文中YOLOV3的瓶颈模块都是带有残差连接的,同时YOLOV3的结构中有很多1×1卷积+3×3卷积这种顺次排列的情况,与残差连接的瓶颈模块相似(但不是瓶颈模块)。因此,Ultralytics-YOLOV3代码为了yaml配置文件的简洁明了,将二则结合起来成了新的瓶颈模块,即可以选择是否激活残差连接。
如下图标记的配置文件部分,假设不结合在一起,每个Bottleneck就要单独写俩个Conv,分别是1×1 Conv和3×3 Conv。
forward成员函数
前向传播,执行自定义的瓶颈模块。
def forward(self, x):"""前向传播,执行模块:param x:输入数据张量:return:瓶颈模块的输出"""# 如果进行残差连接,则将输入x和瓶颈模块的输出结果相加return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))
Concat类
__init__成员函数
用于在深度学习模型中实现张量的拼接操作。
def __init__(self, dimension=1):"""构造函数,用于实现张量在指定维度上的拼接操作:param dimension: 指定拼接的维度,默认为 1"""super().__init__()self.d = dimension
forward成员函数
前向传播,执行拼接。
def forward(self, x):"""前向传播,执行拼接:param x:输入数据张量列表:return:拼接后的张量"""# 将输入张量列表沿着指定维度拼接成新的单一张量return torch.cat(x, self.d)
总结
尽可能简单、详细的介绍了核心文件common.py文件的作用:存放着YOLOV3网络搭建常见的通用模块。
相关文章:
【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读
【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读前言autopad函数Conv类__init__成员函数forward成员函数forward_fuse成员函数 Bottleneck类__init__成员…...
PDF转excel+json ,vue3+SpringBoot在线演示+附带源码
在线演示地址:Vite Vuehttp://www.xpclm.online/pdf-h5 源码gitee前后端地址: javapdfexcel: javaPDF转excelhttps://gitee.com/gaiya001/javapdfexcel.git 盖亚/vuepdfhttps://gitee.com/gaiya001/vuepdf.git 后续会推出 前端版本跟nestjs版本 识别复…...
LeetCode 热题 100_乘积最大子数组(88_152_中等_C++)(动态规划)
LeetCode 热题 100_乘积最大子数组(88_152) 题目描述:输入输出样例:题解:解题思路:思路一(暴力破解法(双重循环)):思路二(动态规划): …...
Nvidia显卡架构演进
1 简介 显示卡(英语:Display Card)简称显卡,也称图形卡(Graphics Card),是个人电脑上以图形处理器(GPU)为核心的扩展卡,用途是提供中央处理器以外的微处理器帮…...
TCP/IP、UDP、HTTP、HTTPS、WebSocket 一文讲解
在当今互联网世界中,数据通信是所有应用运行的基础。无论是打开网页、发送消息还是视频通话,背后都依赖于各种网络协议的协同工作。其中,TCP/IP、UDP、HTTP、HTTPS 和 WebSocket 是最为核心的几种协议。本文将围绕它们的概念、特性和适用场景…...
[密码学基础]密码学发展简史:从古典艺术到量子安全的演进
密码学发展简史:从古典艺术到量子安全的演进 密码学作为信息安全的基石,其发展贯穿人类文明史,从最初的文字游戏到量子时代的数学博弈,每一次变革都深刻影响着政治、军事、科技乃至日常生活。本文将以技术演进为主线,…...
包含物体obj与相机camera的 代数几何代码解释
反余弦函数的值域在 [0, pi] 斜体样式 cam_pose self._cameras[hand_realsense].camera.get_model_matrix() # cam2world# 物体到相机的向量 obj_tcp_vec cam_pose[:3, 3] - self.obj_pose.p dist np.linalg.norm(obj_tcp_vec) # 物体位姿的旋转矩阵 obj_rot_mat self.ob…...
【C++算法】65.栈_删除字符中的所有相邻重复项
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 1047. 删除字符串中的所有相邻重复项 题目描述: 解法 利用string模拟栈 元素依次进栈,当进栈元素和栈顶元素一样的时候,就弹出栈顶字符…...
【java实现+4种变体完整例子】排序算法中【插入排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
以下是插入排序的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格: 一、插入排序基础实现 原理 将元素逐个插入到已排序序列的合适位置,逐步构建有序序列。 代码示例 public class InsertionSort {void…...
神经网络的数学之旅:从输入到反向传播
目录 神经网络简介神经元激活函数神经网络 神经网络的工作过程前向传播(forward)反向传播(backward)训练神经网络 神经网络简介 神经元 在深度学习中,必须要说的就是神经⽹络,或者说是⼈⼯神经⽹络&#…...
软件测试的页面交互标准:怎样有效提高易用性
当用户遇到"反人类"设计时 "这个按钮怎么点不了?"、"错误提示完全看不懂"、"我输入的内容去哪了?"——这些用户抱怨背后,都指向同一个问题:页面交互的易用性缺陷。作为软件测试工程师&a…...
Linux419 三次握手四次挥手抓包 wireshark
还是Notfound 没连接 可能我在/home 准备配置静态IP vim ctrlr 撤销 u撤销 配置成功 准备关闭防火墙 准备配置 YUM源 df -h 未看到sr0文件 准备排查 准备挂载 还是没连接 计划重启 有了 不重启了 挂载准备 修改配置文件准备 准备清理缓存 ok 重新修改配…...
玩转Docker | 使用Docker部署tududi任务管理工具
玩转Docker | 使用Docker部署tududi任务管理工具 前言一、tududi介绍Tududi简介核心功能特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署tududi服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问tududi服务访问tududi首页登录tu…...
ueditorplus编辑器已增加AI智能
之前功能请参考:https://www.geh3408.top/blog/76 下载:https://gitee.com/mo3408/ueditorplus 注意:key值需要单独获取,默认为DeepSeek,默认key有限制,请更换为自己的。 演示地址:https://www.geh3408.top/ueditorplus/dist 更多体验:ueditorplus编辑器已增加AI智…...
深度学习数据预处理:Dataset类的全面解析与实战指南
前言 在深度学习项目中,数据预处理是模型训练前至关重要的一环。一个高效、灵活的数据预处理流程不仅能提升模型性能,还能大大加快开发效率。本文将深入探讨PyTorch中的Dataset类,介绍数据预处理的常见技巧,并通过实战示例展示如何…...
【机器学习-周总结】-第4周
以下是本周学习内容的整理总结,从技术学习、实战应用到科研辅助技能三个方面归纳: 文章目录 📘 一、技术学习模块:TCN 基础知识与结构理解🔹 博客1:【时序预测05】– TCN(Temporal Convolutiona…...
高可靠 ZIP 压缩方案兼容 Office、PDF、TXT 和图片的二阶段回退机制
一、引言 在企业级应用中,经常需要将多种类型的文件(如 Office 文档、PDF、纯文本、图片等)打包成 ZIP 并提供给用户下载。但由于文件路径过长、特殊字符或权限等问题,Go 标准库的 archive/zip 有时会出现“压缩成功却实际未写入…...
【HDFS入门】HDFS数据冗余与容错机制解析:如何保障大数据高可靠存储?
目录 1 HDFS冗余机制设计哲学 1.1 多副本存储策略的工程权衡 1.2 机架感知的智能拓扑算法 2 容错机制实现原理 2.1 故障检测的三重保障 2.2 数据恢复的智能调度 3 关键场景容错分析 3.1 数据中心级故障应对 3.2 数据损坏的校验机制 4 进阶优化方案 4.1 纠删码技术实…...
06-libVLC的视频播放器:推流RTMP
创建媒体对象 libvlc_media_t* m = libvlc_media_new_path(m_pInstance, inputPath.toStdString().c_str()); if (!m) return -1; // 创建失败返回错误 libvlc_media_new_path:根据文件路径创建媒体对象。注意:toStdString().c_str() 在Qt中可能存在临时字符串析构问题,建议…...
【DT】USB通讯失败记录
项目场景: DT小板 USB通讯失败 问题描述 V1.1 板子含有降压电路、电容充电电路、姿态传感电路,语音电路、电弧电路、TF卡电路 焊接完成:功能正常 V1.2 为方便数传模块拔插,把座子缩小并做在了背面,下载口反向方便狭…...
【笔记】网路安全管理-实操
一、系统安全防护-Windows 开始-》管理工具-》本地安全策略-》账户策略-》密码策略-》 1.密码必须符合复杂性要求。双击打开-》勾选已启用-》单击:应用-》单击:确定 2.密码长度最小值。双击打开-》设置密码长度最小值为:?个字符 3.密码最短使用期限。双击打开-》设置密码…...
FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)
本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…...
LDR、MOV和STR指令详解
文章目录 前言 一、LDR指令详解 1.基本语法 2.寻址方式 3.伪指令形式 二、MOV指令详解 1.基本语法 2.常见用法 3.特殊变体 三、STR指令详解 1.基本语法 2.寻址方式 四、三者区别与联系 1.基本语法 2.操作效率 3.大数值处理 总结 前言 ARM汇编中的LDR、MOV和STR是三个最基础也最…...
MATLAB 控制系统设计与仿真 - 41
鲁棒控制的其他函数 - 回路成型函数 loopsyn 灵敏度问题由鲁棒控制工具箱中的loopsyn就可以直接求解,该函数采用H无穷回路成型算法设计控制器,函数的调用格式为: [K,CL,gamma,info] loopsyn(G,Gd) % G为受控对象模型% Gd为期望的回路传递函…...
Scade 语言词法介绍
Scade 6 是一种具备形式化语法与形式化语义的领域特定语言(注1)。自2008年发布(注5)起,在 Scade Suite 产品系列中语言定义方面到目前未产生重要的改变(注2)。在下面的内容中将介绍Scade 语言的词法(注3)。 注1&#x…...
Replicate Python client
本文翻译整理自:https://github.com/replicate/replicate-python 文章目录 一、关于 Replicate Python 客户端相关链接资源关键功能特性 二、1.0.0 版本的重大变更三、安装与配置1、系统要求2、安装3、认证配置 四、核心功能1、运行模型2、异步IO支持3、流式输出模型…...
LLM做逻辑推理题 - 如何找出不标准的球?
题目: 有80个外观一致的小球,其中一个和其它的重量不同,(不知道更轻还是更重)。现在给你一个天平,允许你称四次,把重量不同的球找出来,怎么称? 1. 答案 第1次称量:天平…...
[密码学基础]国密算法深度解析:中国密码标准的自主化之路
国密算法深度解析:中国密码标准的自主化之路 国密算法(SM系列算法)是中国自主研发的密码技术标准体系,旨在打破国际密码技术垄断,保障国家信息安全。本文将从技术原理、应用场景和生态发展三个维度,全面解…...
【计算机视觉】三维视觉项目 - Colmap二维图像重建三维场景
COLMAP 3D重建 项目概述项目功能项目运行方式1. 环境准备2. 编译 COLMAP3. 数据准备4. 运行 COLMAP 常见问题及解决方法1. **编译问题**2. **运行问题**3. **数据问题** 项目实战建议项目参考文献 项目概述 COLMAP 是一个开源的三维重建软件,专注于 Structure-from…...
基于Fabric.js的选座布局系统开发笔记
项目概述 最近开发了一个简单的选座布局系统,主要用于会议、活动或餐厅等场景的座位和桌子布局设计。系统基于HTML5 Canvas和Fabric.js库实现,支持添加座位、桌子,并能保存布局数据。 技术栈 • HTML5 Canvas:作为绘图的基础 •…...
PHP怎样连接MySQL数据库?
方法一:使用 mysqli 扩展 mysqli 是 MySQL 的改进版扩展,提供了面向对象和过程化的接口。 面向对象风格 <?php$servername "localhost"; $username "your_username"; $password "your_password"; $dbname &quo…...
将飞帆制作的网页作为 Vue 2 组件引入到自己网页中使用
飞帆平台有一个功能:不仅所有的网页都是通过控件搭建而成,而且生成的网页又是一个大控件,可以导入到你自己的网页使用。 这篇文章,我们要讲的就是如何将飞帆生成的网页作为控件(组件)导入到自己的网页中。…...
Python制作简易PDF查看工具PDFViewerV1.0显示优化
原文说明 为不破坏原文结构,因此功能优化不在原文中维护了。关于这款工具原文请通过下面链接访问。Python制作简易PDF查看工具PDFViewerV1.0 这款小工具基本功能已经可以作为一款文档浏览器使用,但还有一些美中不足的地方,本文将介绍对文本查找功能的优化调整。 优化效果 …...
YOLOv11改进有效涨点专栏:从理论到实战的深度优化指南
## YOLOv11的进化之路 在目标检测领域,YOLO系列算法始终保持着革命性的创新步伐。YOLOv11作为该系列的最新演进版本,在保持实时检测优势的同时,通过架构层面的深度优化实现了精度与速度的平衡。本文将从**七大核心模块**出发,系统性地解析针对YOLOv11的有效改进方案,涵盖从…...
【EDA软件】【设计约束和分析操作方法】
1. 设计约束 设计约束主要分为物理约束和时序约束。 物理约束主要包括I/O接口约束(如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束。 时序约束是FPGA内部的各种逻辑或走线的延时,反应系统的频率和速度的约束…...
JVM基础认知:JVM到底是什么?为什么它如此重要?
随着 Java 语言在企业级应用、互联网服务、嵌入式系统等领域的广泛采用,JVM(Java Virtual Machine,Java虚拟机)成为了支撑整个生态的核心基础。初学者往往会把注意力集中在 Java 代码本身,却忽视了背后那台“看不见的机…...
javassist
使用javassist获取参数名 1,添加依赖 需要在pom.xml文件中添加下面的依赖: <dependency><groupId>org.javassist</groupId><artifactId>javassist</artifactId><version>3.28.0-GA</version> </depende…...
【C++算法】66.栈_比较含退格的字符串
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 844. 比较含退格的字符串 题目描述: 解法 用字符串来模拟栈。 C 算法代码: class Solution { public:bool backspaceCompare(string s, string t…...
游戏引擎学习第235天:在 Windows 上初始化 OpenGL
奇怪有问题 之前没注意到 这个问题是Count 0 GlobalConstants_Renderer_UsedDebugCamer 打开的话会有Bug Count是零的话就不让排序了 game.h: 查阅 TODO 列表 大家好,欢迎来到 game Hero,这是一档我们在直播中一起编写完整游戏的节目。不幸的是&a…...
FPGA系列之DDS信号发生器设计(DE2-115开发板)
一、IP核 IP(Intellectual Property)原指知识产权、著作权等,在IC设计领域通常被理解为实现某种功能的设计。IP模块则是完成某种比较复杂算法或功能(如FIR滤波器、FFT、SDRAM控制器、PCIe接口、CPU核等)并且参数可修改的电路模块,…...
修改Theme SHELL美化panel
安装 使用 使用Tweaks进行设置 需要创建.themes文件夹,在当前目录下 mkdir ~/.themes从官网下载文件 https://www.gnome-look.org/p/1013030 将打包压缩文件移动到~/themes,并解压 tar -xvf 01-Flat-Remix-Light-20250413.tar.xz然后使用 按 Alt F2…...
Sentinel源码—5.FlowSlot借鉴Guava的限流算法二
大纲 1.Guava提供的RateLimiter限流使用示例 2.Guava提供的RateLimiter简介与设计 3.继承RateLimiter的SmoothBursty源码 4.继承RateLimiter的SmoothWarmingUp源码 3.继承RateLimiter的SmoothBursty源码 (1)SmoothBursty的初始化流程 (2)SmoothBursty的初始化完成后的变量…...
自由学习记录(56)
从贴图空间(texture space)将值还原到切线空间(tangent space)向量 tangentNormal.xy (packedNormal.xy * 2 - 1) * _BumpScale; 背后的知识点:法线贴图中的 RGB 是在 0~1 范围内编码的向量 所以贴图法线是怎么“压…...
计算机网络八股——HTTP协议与HTTPS协议
前言: 到时候我想要写一篇文章就是:在浏览器中输入URL并按下回车会发生什么? 然后将几篇文章全部串联到一起,现在几天的任务就是将这里的每个小部分进行一个详细的介绍 HTTP1.1简述与特性 Web 上的通信都是建⽴在 HTTP 协议上的…...
JAVAEE(网络原理—UDP报头结构)
我们本篇文章要讲的是UDP的报头结构以及注意事项。 下面呢,我先说一下UDP是什么? 1.UDP是什么? UDP是一种网络协议。网络协议是计算机网络中,为了使不同设备之间能够准确、高效地进行数据交换和通信,而预先制定的一…...
Redis-分布式锁
Redis-分布式锁 文章目录 Redis-分布式锁1.基本原理和不同方式实现方式对比2.Redis分布式锁的基本实现思路3.分布式锁误删问题一4.分布式锁误删问题二5.Redission1.功能介绍2.快速入门3.可重入锁原理4.锁重试和WatchDog机制1.锁重试2. WatchDog 机制(锁自动续期&…...
如何优雅地为 Axios 配置失败重试与最大尝试次数
在 Vue 3 中,除了使用自定义的 useRequest 钩子函数外,还可以通过 axios 的拦截器 或 axios-retry 插件实现接口请求失败后的重试逻辑。以下是两种具体方案的实现方式: 方案一:使用 axios 拦截器实现重试 实现步骤: 通…...
Windows使用SonarQube时启动脚本自动关闭
一、解决的问题 Windows使用SonarQube时启动脚本自动关闭,并发生报错: ERROR: Elasticsearch did not exit normally - check the logs at E:\Inori_Code\Year3\SE\sonarqube-25.2.0.102705\sonarqube-25.2.0.102705\logs\sonarqube.log ERROR: Elastic…...
MYSQL初阶(暂为自用草稿)
目录 基本操作 database操作 table操作 数据类型 INT类型 bit类型 FLOAT类型 CHAR类型 DATE类型 SEL类型 表的约束 列约束 NULL DEFAULT PRIMARY KEY UNIQUE KEY 表约束 PRIMARY KEY FOREIGN KEY 其他补充 AUTO_INCREMENT COMMENT ZEROFILL 表的CRUD …...
交换排序——快速排序
交换排序的基本思路:把序列中的两个元素进行比较,根据需求对两个元素进行交换。特点是较大的元素向序列的尾部移动,较小的元素向序列的前部移动。 hoare法 在序列中任取一个元素作为基准值,一趟排序完成之后,以基准值为…...