Transformer 代码剖析16 - BLEU分数(pytorch实现)
一、BLEU算法全景图
二、核心函数模块解析
2.1 统计信息收集:bleu_stats
def bleu_stats(hypothesis, reference):stats = []stats.append(len(hypothesis))stats.append(len(reference))for n in range(1, 5):s_ngrams = Counter([tuple(hypothesis[i:i + n]) for i in range(len(hypothesis) + 1 - n)])r_ngrams = Counter([tuple(reference[i:i + n]) for i in range(len(reference) + 1 - n)])stats.append(max([sum((s_ngrams & r_ngrams).values()), 0]))stats.append(max([len(hypothesis) + 1 - n, 0]))return stats
数据流可视化
2.2 BLEU分数计算:bleu
def bleu(stats):if len(list(filter(lambda x: x == 0, stats))) > 0:return 0 (c, r) = stats[:2]log_bleu_prec = sum([math.log(float(x) / y) for x, y in zip(stats[2::2], stats[3::2])]) / 4.return math.exp(min([0, 1 - float(r) / c]) + log_bleu_prec)
计算流程分解
1. 零值检查: 确保所有统计信息非零
2. 长度提取: 获取假设序列长度c和参考序列长度r
3. 精度计算: 计算n-gram精度的几何平均值的对数
4. 惩罚因子: 引入长度惩罚因子 m i n ( 0 , 1 − r c ) min(0,1-\frac{r}{c}) min(0,1−cr)
5. 指数转换: 将对数结果转换回概率值
2.3 验证集BLEU计算:get_bleu
def get_bleu(hypotheses, reference):stats = np.array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])for hyp, ref in zip(hypotheses, reference):stats += np.array(bleu_stats(hyp, ref))return 100 * bleu(stats)
批处理流程
2.4 索引转换:idx_to_word
def idx_to_word(x, vocab):words = []for i in x:word = vocab.itos[i]if '<' not in word:words.append(word)words = " ".join(words)return words
转换机制
三、数学运算可视化推演
3.1 示例数据
假设序列: [1, 2, 3, 4]
参考序列: [1, 2, 4, 5]
3.2 统计信息生成
统计项 | 计算过程 | 结果值 |
---|---|---|
假设长度 | len(hypothesis) | 4 |
参考长度 | len(reference) | 4 |
1-gram匹配 | sum((s_ngrams & r_ngrams).values()) | 3 |
1-gram总数 | len(hypothesis) + 1 - 1 | 4 |
2-gram匹配 | sum((s_ngrams & r_ngrams).values()) | 2 |
2-gram总数 | len(hypothesis) + 1 - 2 | 3 |
3-gram匹配 | sum((s_ngrams & r_ngrams).values()) | 1 |
3-gram总数 | len(hypothesis) + 1 - 3 | 2 |
4-gram匹配 | sum((s_ngrams & r_ngrams).values()) | 0 |
4-gram总数 | len(hypothesis) + 1 - 4 | 1 |
3.3 BLEU分数计算
1. 精度计算:
- 1-gram: 3/4 = 0.75
- 2-gram: 2/3 ≈ 0.6667
- 3-gram: 1/2 = 0.5
- 4-gram: 0/1 = 0
2. 几何平均:
- ( 0.75 × 0.6667 × 0.5 × 0 ) 1 4 = 0 (0.75 × 0.6667 × 0.5 × 0)^{\frac{1}{4}} = 0 (0.75×0.6667×0.5×0)41=0
3. 长度惩罚:
- m i n ( 0 , 1 − 4 / 4 ) = 0 min(0, 1-4/4) = 0 min(0,1−4/4)=0
4. 最终BLEU:
- e x p ( 0 + l o g ( 0 ) ) = 0 exp(0 + log(0)) = 0 exp(0+log(0))=0
四、工程实践要点
4.1 性能优化
- 向量化操作: 使用numpy数组提高统计信息累加效率
- 内存优化: 使用生成器表达式减少内存占用
- 并行计算: 支持多线程处理大规模数据
4.2 扩展应用
- 多参考支持: 扩展支持多个参考序列
- 权重调整: 支持自定义n-gram权重
- 平滑处理: 引入平滑方法处理零值问题
五、BLEU分数的意义与设计思想
5.1 BLEU的核心意义
BLEU(Bilingual Evaluation Understudy)是机器翻译领域最具代表性的自动评估指标,其核心意义在于通过量化生成文本与参考文本的n-gram匹配程度,为翻译质量提供可计算的客观标准。它的设计初衷是解决人工评估成本高、一致性差的问题,通过以下特性实现高效评估:
1. 自动化与可扩展性: 可快速处理大规模数据,支持模型训练中的实时反馈。
2. 多粒度匹配: 结合1-gram到4-gram的共现统计,兼顾局部词汇匹配和长距离语义连贯性。
3. 长度敏感性: 通过惩罚因子抑制过短译文的得分膨胀,避免逐字翻译的投机行为。
5.2 设计思想与权衡
5.2.1 精度导向的评估逻辑
BLEU以修正后的n-gram精度(Modified n-gram Precision)为基础,统计假设文本中每个n-gram在参考文本中的最大出现次数。例如,若参考文本中出现2次"the cat",而假设文本出现3次,则匹配计数为2。这种设计通过截断计数法(Clipped Count)避免高频词汇的过度奖励,体现了对翻译“准确性”而非“冗余性”的追求。
5.2.2 几何平均与对数空间
对不同n-gram的精度取几何平均(而非算术平均),强化低精度值的惩罚效应。例如,若某n-gram精度为0,则整体分数直接归零,这迫使模型必须全面兼顾不同粒度的匹配。而对数转换(log(float(x)/y)
)则将乘法运算转化为加法,避免连乘导致的数值下溢问题。
5.2.3 长度惩罚机制
通过惩罚因子 min(0, 1 - r/c)
解决短译文问题:
- 当假设文本长度(c)小于参考文本(r)时,惩罚因子为
1 - r/c
,显著降低分数。 - 当c ≥ r时,惩罚因子为0,保留原始精度值。此机制迫使模型生成与参考长度匹配的译文,而非通过截断获取高分。
5.3 数学表达解析
BLEU分数的完整计算公式为:
B L E U = B P ⋅ e x p ( ∑ n = 1 N w n l o g p n ) BLEU = BP · exp(∑_{n=1}^N w_n log p_n) BLEU=BP⋅exp(∑n=1Nwnlogpn)
其中:
- BP(Brevity Penalty): 长度惩罚因子,计算公式为 B P = e m i n ( 0 , 1 − r c ) BP = e^{min(0, 1 - \frac{r}{c})} BP=emin(0,1−cr)
- p n p_n pn: n-gram精度,计算方式为
匹配的n-gram数 / 假设文本中n-gram总数
- w n w_n wn: 权重系数,默认取均匀权重1/4(N=4时)
该公式在代码中体现为两个阶段:
1. 统计阶段(bleu_stats
函数): 遍历1-4 gram,分别计算匹配数和总数。
2. 合成阶段(bleu
函数): 对精度取对数平均,叠加长度惩罚,最终通过指数映射得到0-1区间值。
5.4 优势与局限性
优势
- 高效客观: 摆脱人工评估的主观性与滞后性,支持模型迭代的快速验证。
- 多语言通用: 不依赖语言特定规则,适用于任意语言对的翻译评估。
- 强相关性: 在多数研究中,BLEU与人工评分呈现显著正相关(相关系数约0.6-0.8)。
局限性
- 语义盲区: 无法捕捉同义词替换、语序调换等语义等价变化。
- 多样性惩罚: 对创造性译文施加不公平惩罚(例如用近义词替换参考文本中的词汇)。
- 参考依赖: 分数质量高度依赖参考文本的覆盖度和多样性,多参考文本可部分缓解此问题。
原项目代码+注释(附)
"""
@author : Hyunwoong
@when : 2019-12-22
@homepage : https://github.com/gusdnd852
"""import math
from collections import Counterimport numpy as np# 计算BLEU分数的统计信息
def bleu_stats(hypothesis, reference):"""计算BLEU分数的统计信息。"""stats = [] # 初始化一个空列表用于存储统计信息stats.append(len(hypothesis)) # 添加假设序列的长度stats.append(len(reference)) # 添加参考序列的长度for n in range(1, 5): # 对于n-gram,n从1到4s_ngrams = Counter([tuple(hypothesis[i:i + n]) for i in range(len(hypothesis) + 1 - n)]) # 统计假设序列中所有n-gram出现的次数r_ngrams = Counter([tuple(reference[i:i + n]) for i in range(len(reference) + 1 - n)]) # 统计参考序列中所有n-gram出现的次数stats.append(max([sum((s_ngrams & r_ngrams).values()), 0])) # 添加假设序列和参考序列中共有的n-gram的总数stats.append(max([len(hypothesis) + 1 - n, 0])) # 添加假设序列中可能的n-gram的总数return stats # 返回统计信息列表# 根据统计信息计算BLEU分数
def bleu(stats):"""根据n-gram统计信息计算BLEU分数。"""if len(list(filter(lambda x: x == 0, stats))) > 0: # 如果统计信息中有任何一项为0,则BLEU分数为0return 0(c, r) = stats[:2] # 假设序列长度和参考序列长度log_bleu_prec = sum([math.log(float(x) / y) for x, y in zip(stats[2::2], stats[3::2])]) / 4. # 计算修正后的n-gram精度的几何平均值(对数形式)return math.exp(min([0, 1 - float(r) / c]) + log_bleu_prec) # 计算BLEU分数# 获取验证集的BLEU分数
def get_bleu(hypotheses, reference):"""获取验证集的BLEU分数。"""stats = np.array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) # 初始化一个numpy数组用于累加统计信息for hyp, ref in zip(hypotheses, reference): # 遍历假设序列和参考序列stats += np.array(bleu_stats(hyp, ref)) # 累加每个假设序列和参考序列的BLEU统计信息return 100 * bleu(stats) # 返回BLEU分数(乘以100转换为百分比形式)# 将索引转换为单词
def idx_to_word(x, vocab):"""将索引列表转换为单词序列。"""words = [] # 初始化一个空列表用于存储单词for i in x: # 遍历索引列表word = vocab.itos[i] # 根据索引查找对应的单词if '<' not in word: # 如果单词中不包含特殊符号'<',则添加到单词列表中words.append(word)words = " ".join(words) # 将单词列表转换为以空格分隔的字符串return words # 返回单词序列
相关文章:
Transformer 代码剖析16 - BLEU分数(pytorch实现)
一、BLEU算法全景图 #mermaid-svg-uwjb5mQ2KAC6Rqbp {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-icon{fill:#552222;}#mermaid-svg-uwjb5mQ2KAC6Rqbp .error-text{fill:#552222;stroke:…...
手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...
labelimg标注的xml标签转换为yolo格式标签
本文不生产技术,只做技术的搬运工!!! 前言 在yolo训练时,我们需要对图像进行标注,而使用labelimg标注时如果直接选择输出yolo格式的数据集,则原始数据的很多信息无法被保存,因此一版…...
Linux云计算SRE-第十七周
1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...
K8S学习之基础十八:k8s的灰度发布和金丝雀部署
灰度发布 逐步扩大新版本的发布范围,从少量用户逐步扩展到全体用户。 特点是分阶段发布、持续监控、逐步扩展 适合需要逐步验证和降低风险的更新 金丝雀部署 将新版本先部署到一小部分用户或服务器,观察其表现,再决定是否全面推广。 特点&…...
WSL with NVIDIA Container Toolkit
一、wsl 下安装 docker 会提示安装 docekr 桌面版,所以直接安装 docker 桌面版本即可 二、安装 NVIDIA Container Toolkit NVIDIA Container Toolkit仓库 https://github.com/NVIDIA/nvidia-container-toolkitgithub.com/NVIDIA/nvidia-container-toolkit 安装…...
PAT线上考试 真题/注意细节(甲/乙级)
闲谈 从此以后!参加竞赛! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 都要为自己留够足够的时间练习! 重要的事情说三遍,毕竟这只是我参加各种竞赛的开始! \(ÿ…...
springcloud sentinel教程
QPS(Queries Per Second)即每秒查询率 TPS,每秒处理的事务数目 PV(page view)即页面浏览量 UV 访问数(Unique Visitor)指独立访客访问数 一、初识Sentinel 什么是雪崩问题? 微服务之间相…...
摄相机标定的基本原理
【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型: 定义: 内参:就像相机的“眼睛”。它描述了相机内部的特性,比如焦距(镜头的放…...
HJ C++11 Day2
Initializer Lists 对于一个类P class P{P(int a, int b){cout << "P(int, int), a" << a << ", b " << b << endl;}P(initializer_list<int> initlist){cout << "P(initializer_list<int>), val…...
在 ASP.NET Core 中启用 Brotli 和 Gzip 响应压缩
在本文中,我们将探讨如何在 ASP.NET Core 应用程序中启用响应压缩,重点介绍 Brotli 和 Gzip 算法以及如何验证压缩是否有效。 什么是响应压缩? 响应压缩通过使用Brotli 或 Gzip等算法来最小化 HTTP 响应的大小。这些算法在传输文本资产&#…...
leetcode69.x 的平方根
题目: 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。…...
第11章 web应用程序安全(网络安全防御实战--蓝军武器库)
网络安全防御实战--蓝军武器库是2020年出版的,已经过去3年时间了,最近利用闲暇时间,抓紧吸收,总的来说,第11章开始学习利用web应用程序安全,主要讲信息收集、dns以及burpsuite,现在的资产测绘也…...
flac、kgg、kgma格式音频转换MP3
1. 选择需要转换的音频文件 2. 下载闪电音频格式转换器 闪电音频格式转换器-全面覆盖常见音乐格式_音频合并分割_音频压缩 3. 买会员有点贵,也没必要,偶尔转换一次的,就去闲鱼买,两天会员9块钱。 4. 闲鱼卖家给兑换码,…...
macos 程序 运行
sudo xattr -r -d com.apple.quarantine [/Applications/Name]使用stow 管理配置文件...
基于YOLO11深度学习的电瓶车进电梯检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
HTML5 表单属性
HTML5 表单属性 引言 HTML5作为新一代的网页标准,带来了许多新的特性和改进。在表单处理方面,HTML5引入了一系列新的表单属性,这些属性使得表单的创建和使用更加灵活和强大。本文将详细介绍HTML5表单属性,包括其功能、使用方法和注意事项。 一、HTML5表单属性概述 HTML…...
从0开始,手搓Tomcat
一、什么是Tomcat Tomcat 是一款开源的、轻量级的 Web 服务器,它不仅能够提供 HTTP 服务,还能够运行 Java Servlet 和 JavaServer Pages(JSP)。对于许多开发者来说,理解 Tomcat 的目录结构以及如何在该结构中组织应用…...
数列分块入门2
题目描述 给出一个长为 n n n 的数列,以及 n n n 个操作,操作涉及区间加法,询问区间内小于某个值 x x x 的元素个数。 输入格式 第一行输入一个数字 n n n。 第二行输入 n n n 个数字,第 i i i 个数字为 a i a_i ai&a…...
【ThreeJS Basics 06】Camera
文章目录 Camera 相机PerspectiveCamera 透视相机正交相机用鼠标控制相机大幅度转动(可以看到后面) 控制组件FlyControls 飞行组件控制FirstPersonControls 第一人称控制PointerLockControls 指针锁定控制OrbitControls 轨道控制TrackballControls 轨迹球…...
postman接口请求中的 Raw是什么
前言 在现代的网络开发中,API 的使用已经成为数据交换的核心方式之一。然而,在与 API 打交道时,关于如何发送请求体(body)内容类型的问题常常困扰着开发者们,尤其是“raw”和“json”这两个术语之间的区别…...
docker1
前言 技术架构 单机架构 应用数据分离架构 应用服务集群架构 读写分离/主从分离架构 写入主的时候,要同步Mysql从的数据才可以 冷热分离架构 写的时候要写入主和缓存数据库 读的时候先去缓存看有没有,没有的话就去从数据库读数据 主要就是看这个数据是…...
RocketMQ延迟消息深度解析:原理、实践与性能调优
RocketMQ延迟消息深度解析:原理、实践与性能调优 编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039 一、…...
RabbitMQ 高级特性解析:RabbitMQ 消息可靠性保障 (上)
RabbitMQ 核心功能 RabbitMQ 高级特性解析:RabbitMQ 消息可靠性保障 (上)-CSDN博客 RabbitMQ 高级特性:从 TTL 到消息分发的全面解析 (下)-CSDN博客 前言 最近再看 RabbitMQ,看了看自己之前写…...
大白话JavaScript实现一个函数,将数组中的元素进行去重
大白话JavaScript实现一个函数,将数组中的元素进行去重 答题思路 要实现数组元素去重的函数,核心思路是遍历数组,然后判断每个元素是否已经在新数组里存在,如果不存在就添加进去,存在则跳过。下面会介绍几种不同的实…...
PQL查询和监控各类中间件
1 prometheus的PQL查询 1.1 Metrics数据介绍 prometheus监控中采集过来的数据统一称为Metrics数据,其并不是代表具体的数据格式,而是一种统计度量计算单位当需要为某个系统或者某个服务做监控时,就需要使用到 metrics prometheus支持的met…...
uni_app实现下拉刷新
1. 在页面配置中启用下拉刷新 首先,你需要在页面的 pages.json 文件中启用下拉刷新功能。 {"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页","enablePull…...
C#类型转换基本概念
一、基本定义 C# 类型转换是将数据从一种类型转换为另一种类型的过程,分为 隐式转换 和 显式转换 两类。 强类型语言特性:C# 要求变量类型在编译时确定,类型转换需满足兼容性或显式规则。目的:处理不同数据类…...
【学习笔记】【DeepSeek AI 医生】2-2 AI家庭医生课程内容介绍
【DeepSeek AI 医生】2-4 项目详细分析及DeepSeek适用场景 一、Ollama部署二、可视化UI三、构建项目环境四、搭建项目架构五、Spring Al六、SSE服务端推送事件七、数据持久化八、线上部署 一、Ollama部署 Mac部署windows 部署ollama脚本、常用命令DeepSeek 提示词、角色、适用…...
DeepSeek使用教程--让DeepSeek生成精准题库
想让DeepSeek出好题,关键在于提示词的设计。总结了一个基本模板: 请帮我生成一套关于[学科/知识点]的题目,包括[题型],难度为[简单/中等/困难],适合[年级/学习阶段]的学生,总共[数量]道题。每道题请提供详细…...
数学之约数个数定理-阶乘约数
题目: 定义阶乘 n!123⋅⋅⋅n。 请问 100!(100的阶乘)有多少个正约数。 们需要计算 100! 的正约数的个数。阶乘 100! 的定义是: 100!123⋯100 直接计算 100!的值是不现实的,因为它是一个非常大的数。因此…...
C语言学习笔记-进阶(7)字符串函数3
1. strstr的使用和模拟实现 char * strstr ( const char * str1, const char * str2); Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1. (函数返回字符串str2在字符串str1中第⼀次出现的位置&#x…...
快乐数 力扣202
一、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&…...
Cpu100%问题(包括-线上docker服务以及Arthas方式进行处理)
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
近三年图像超分辨率研究进展综述(轻量化方向)
一、图像超分辨率技术的近三年核心进展 1. 轻量化网络设计突破 轻量化模型是端侧部署的关键,近三年研究主要围绕参数压缩与计算效率提升展开: 11卷积与通道优化:SCNet提出全11卷积架构,通过逐点卷积替代传统33卷积,在保持重建质量的同时将模型参数减少60%以上。该设计通…...
成都亚恒云知教育咨询公司:绘画的风格如何学习与确定?
宝子们,好久不见! 最近收到好多同学发给我们成都亚恒云知教育咨询有限公司创作的作品,同时也收到了有很多乖乖的询问:关于绘画,老师我没有属于自己的风格,怎么才能画出属于自己的风格的作品啊,…...
数据结构篇——串(String)
一、引入 在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。 今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。 二、串的定义 2.1、串的基本定义 串(s…...
Qwen架构与Llama架构的核心区别
我们在讨论Deepseek不同版本之间的区别时了解到,DeepSeek-R1的蒸馏模型分为Qwen和Llama两个系列,包括Qwen系列的0.5B、1.5B、3B、7B、14B、32B、72B和Llama系列的8B、70B。Qwen系列以阿里通义千问(Qwen)为基础模型架构(具体是Qwen-2.5),Llama系列以Meta的Llama为基础模型…...
uniapp或者vue 使用serialport
参考https://blog.csdn.net/ykee126/article/details/90440499 版本是第一位:否则容易编译失败 node 版本 18.14.0 npm 版本 9.3.1 electron 版本 30.0.8 electron-rebuild 版本 3.2.9 serialport 版本 10.0.0 需要python环境 main.js // Modules to control app…...
Linux和gcc/g++常用命令总结
目录 Linux命令总结 文件操作相关命令 ls cd pwd cp mv rm cat mkdir rmdir touch 文本处理操作命令 grep awk sed 进程管理操作相关命令 ps top htop kill pkill killall chmod chown 网络操作相关命令 ping ifconfig netstat ss lsof curl …...
Vue3路由组件和一般组件 切换路由时组件挂载和卸载 路由的工作模式
路由组件和一般组件 路由组件 一般放到pages或view目录 一般组件 一般放到component目录 切换路由 切换路由时,组件和执行挂载和卸载 路由的工作模式 Hash模式 缺点 1.不美观,路径带#号 优点 1.兼容性好 一般适用于管理系统 History模式 缺点…...
MySQL如何给其他账号分配权限?
目录 基础权限分配流程 权限级别对照表 安全事项 MySQL数据库使用root账号为test账号分配权限的标准操作流程及注意事项: 基础权限分配 1、root用户登录, 输入root密码后进入MySQL命令行环境 mysql -u root -p2、用户存在性校验 SELECT user,host FROM …...
记录一些面试遇到的问题
重载和重写的区别 重载是overload,覆盖是override 重载属于编译时多态,覆盖属于运行时多态 运行时多态和编译时多态 运行时多态指的是在运行的时候才知道要调用哪一个函数,编译时多态是指在编译的时候就知道调用哪一个函数。 运行时多态…...
Windows 系统 Docker Desktop 入门教程:从零开始掌握容器化技术
文章目录 前言一、Docker 简介二、Docker Desktop 安装2.1 系统要求2.2 安装步骤 三、Docker 基本概念四、Docker 常用命令五、实战:运行你的第一个容器5.1 拉取并运行 Nginx 容器5.2 查看容器日志5.3 停止并删除容器 六、总结 前言 随着云计算和微服务架构的普及&…...
量子计算测试挑战:软件测试将如何迎接新纪元?
引言 在计算机技术的飞速发展中,量子计算(Quantum Computing)正成为下一个颠覆性的科技热点。随着谷歌、IBM、微软等科技巨头纷纷投入巨资研究量子计算,其应用场景正逐步扩展,从优化计算到密码安全,再到人工智能和材料科学。然而…...
Matlab实现车牌识别
车牌识别技术作为现代智能交通系统、安防监控以及诸多车辆管理应用场景中的关键环节,正发挥着日益重要的作用,它能够自动、快速且精准地从车辆图像或视频流中提取车牌信息,实现车辆身份的智能化识别。 技术原理 车牌识别主要依托于图像处理、…...
Autosar 诊断开发-CAN到CANFD的更改-基于ETAS软件
文章目录 前言CanIf配置CanTp配置EcuC配置生成代码差异总结 前言 从CAN切换到CANFD,如果不想重新进行cfggen的话,手动更改配置或许会更快一些,本文介绍诊断报文从CAN变为CANFD后,BSW模块中的更改。 注:本文不介绍MCAL…...
八、排序算法
一些简单的排序算法 8.1 冒泡排序 void Bubble_sort(int a[] , int len){int i,j,flag,tmp;for(i=0 ; i < len-1 ; i++){flag = 1;for(j=0 ; j < len-1-i ; j++){if(a[j] > a[j+1]){tmp = a[j];a[j] = a[j+1];a[j+1] = tmp;flag = 0;}}if(flag == 1){break;}}…...
TON基金会确认冠名赞助2025香港Web3嘉年华,并将于4月8日重磅呈现“TON生态日”
近日,由万向区块链实验室与HashKey Group联合推出的Web3年度盛典——2025香港Web3嘉年华正式宣布,TON基金会确认成为本届嘉年华的冠名赞助商,并将于4月8日在主会场特别举办“TON生态日”专题Side Event,集中展现TON生态的最新技术…...
《A++ 敏捷开发》- 18 软件需求
需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品,以前都是扫二维码开箱,有些图书馆升级了使用指纹识别。 “是否新方法比以前好?”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…...