一文读懂变分自编码(VAE)
一文读懂变分自编码(VAE)
概述
变分自编码器(Variational Autoencoder, VAE)是一种生成模型,用于学习数据的潜在表示并生成与原始数据分布相似的新数据。它是一种概率模型,通过结合深度学习和变分推断的思想,解决了传统自编码器无法生成数据的限制。
自编码器(Autoencoder, AE)是一种无监督学习模型,用于学习数据的低维表示,并尝试从低维表示中重建原始数据。它是一种神经网络结构,常用于降维、特征提取和数据生成任务。
自编码器的变种:
- 稀疏自编码器(Sparse Autoencoder)
通过添加稀疏性约束,使潜在表示 z 稀疏化,从而提取更具代表性的特征。 - 去噪自编码器(Denoising Autoencoder, DAE)
在输入数据上添加噪声,训练模型从受损数据中恢复原始数据,提高模型的鲁棒性。 - 变分自编码器(Variational Autoencoder, VAE)
将潜在表示建模为概率分布,能够生成多样化的数据(生成模型)。 - 向量量化变分自编码器(Vector Quantized Variational Autoencoder, VQVAE)
将连续的隐变量空间离散化成一组有限的代码向量,用于表示数据的特征。
KL散度
KL散度的定义
KL 散度(Kullback-Leibler Divergence,简称 KL 散度)是用来衡量两个概率分布之间差异的一种非对称性度量。在概率论和信息论中,KL 散度常用来表示一个分布 Q(近似分布)和另一个目标分布 P之间的相对熵(信息损失)。
信息损失的直观解释:
KL 散度的性质:
- 非负性: D K L ( P / / Q ) ≥ 0 D_{KL}(P//Q)≥0 DKL(P//Q)≥0 且当且仅当 Q(z)=P(z) 时等于 0。
- 非对称性: D K L ( P / / Q ) ≠ D K L ( Q / / P ) D_{KL}(P//Q) ≠ D_{KL}(Q//P) DKL(P//Q)=DKL(Q//P)
- KL 散度越大,说明 P和 Q的差异越大
因此 KL 散度不能直接看作距离,但可以用于优化目标。
变分自编码(VAE)
变分自动编码器 (VAE) 有一个独特属性,将它们与普通的自动编码器区分开来,正是这个属性使它们对生成建模如此有用:它们的潜在空间在设计上是连续的,允许轻松随机采样和插值。
它通过做一些乍一看似乎相当令人惊讶的事情来实现这一点:使其编码器不输出大小为 n 的编码向量,而是输出两个大小为 n 的向量:一个均值向量 μ 和一个标准差向量 σ。
三个关键组成元素
编码器(Encoder):编码器将输入数据 x压缩映射到潜在空间中的概率分布参数(通常为高斯分布的均值 μ与方差 σ2)。具体来说,编码器通过神经网络对输入数据进行特征提取,并输出一组潜在变量分布的参数,用来近似后验分布 q ( z ∣ x ) q(z∣x) q(z∣x) 。
潜在变量(Latent Variables)及其先验分布(Prior):引入一组潜在变量 z,这些潜在变量往往来自一个简单的先验分布(例如标准正态分布 p ( z ) = N ( 0 , I ) p(z)=N(0,I) p(z)=N(0,I) )。通过从该潜在分布中抽样的方式,可以生成新的数据样本。同时,编码器学习到的后验近似 q ( z ∣ x ) q(z∣x) q(z∣x) 必须与此先验分布保持一致,从而实现稳定的生成过程与良好的特征表达能力。
解码器(Decoder):解码器将从潜在分布中采样得到的潜在变量 z映射回原数据空间,从而生成与输入数据分布相似的新样本。解码器模型通常是一个与编码器结构相对对称的神经网络,用于参数化生成分布 p θ ( x ∣ z ) p_\theta(x∣z) pθ(x∣z) ,使得给定某一个潜在向量 z时,可以生成近似真实分布的数据样本。
损失函数
变分自编码器的损失函数(也称ELBO损失函数)是通过最大化数据对数似然的变分下界(Evidence Lower BOund, ELBO)推导而来的。
步骤总结
- 编码器:输入数据 x x x,输出潜在分布 q ( z ∣ x ) = N ( z ; μ ( x ) , σ 2 ( x ) ) q(z∣x)=N(z; μ(x), σ^2(x)) q(z∣x)=N(z;μ(x),σ2(x)) ,用正态分布建模。
参数化表示:通过神经网络输出均值 μ ( x ) μ(x) μ(x)和标准差 σ ( x ) σ(x) σ(x)。 - 潜在空间采样:采样潜在变量 z ∼ q ( z ∣ x ) = N ( μ ( x ) , σ 2 ( x ) ) z∼q(z∣x)=N(μ(x), σ^2(x)) z∼q(z∣x)=N(μ(x),σ2(x)) 。
使用重参数化技巧: z = μ ( x ) + σ ( x ) ⋅ ϵ , ϵ ∼ N ( 0 , 1 ) z=μ(x) + σ(x)⋅ϵ, ϵ∼N(0,1) z=μ(x)+σ(x)⋅ϵ,ϵ∼N(0,1). 使采样过程可导,从而支持反向传播。 - 解码器:输入潜在变量 z z z,输出 p ( x ∣ z ) p(x∣z) p(x∣z) ,即重建数据的分布。
- 计算损失函数:重构损失+KL散度损失
- 反向传播和参数更新
重参数化技巧
重参数化技巧的核心是将随机变量的采样过程表示为一个可微分的确定性函数,使得梯度能够传递到模型参数。这是通过引入一个独立于参数的随机噪声来实现的。
假设编码器输出的潜在分布是高斯分布 q ϕ ( z ∣ x ) = N ( μ , σ 2 ) q_\phi(z∣x)=N(μ,σ^2) qϕ(z∣x)=N(μ,σ2) ,其中 μ μ μ和 σ σ σ是由编码器网络输出的参数。
传统的采样过程: z ∼ N ( μ , σ 2 ) z∼N(μ,σ^2) z∼N(μ,σ2),由于采样操作不可导,无法对编码器网络参数 ϕ ϕ ϕ求导。
为了解决这个问题,我们使用重参数化技巧,将采样过程重写为: z = μ + σ ⊙ ϵ z=μ+σ⊙ϵ z=μ+σ⊙ϵ
其中: ϵ ∼ N ( 0 , I ) ϵ∼N(0,I) ϵ∼N(0,I)是从标准正态分布采样的独立噪声, ⊙ ⊙ ⊙ 表示逐元素乘法。
现在, z z z是 μ μ μ和 σ σ σ的可微函数,且 ϵ ϵ ϵ与模型参数无关。
优势和局限性
优势
- 生成能力:可以从先验分布 p(z) 中采样生成新数据。
- 潜在空间的连续性:潜在表示是概率分布,生成的数据具有多样性和平滑性。
- 数学解释性强:基于概率理论,具有清晰的数学意义。
局限性
- 生成质量有限:生成的样本可能较模糊,不如GAN生成的高质量。
- KL散度权重问题:正则项的影响可能导致生成分布与数据分布不匹配。
VAE的应用
潜在扩散模型(Latent Diffusion Models, LDMs):将训练过程分为两步:
-
训练自动编码器(Autoencoder)首先训练一个自动编码器,将原始图像映射到一个感知上等价于原图,但维度更低、冗余更少的潜在空间。在这个潜在空间中,图像的高频无用细节被尽可能去除,但整体视觉外观与结构得以保留(这被称为“温和的压缩”,mild compression)。由于潜在空间的复杂度降低,训练和推理时对计算资源的需求显著减少。
-
在潜在空间中训练扩散模型,接着,在通过自动编码器得到的潜在表示上训练扩散模型。由于潜在空间已去除了许多不可感知的冗余细节,模型在这个较紧凑的表示空间中进行扩散过程,既能保留足够的语义信息,又避免了对每个像素进行繁琐的重复计算。这样减少了训练和推理的计算量,提升了模型的训练速度和生成效率。
VAE特点
- 概率建模:VAE不仅学习数据的压缩表示(即编码),还学习这些表示的概率分布。这意味着编码后的潜在变量不是固定的值,而是服从某个分布(通常是高斯分布)。
- 变分推理:由于直接计算后验分布通常是不可行的,VAE使用变分推理方法来近似这个后验分布。具体来说,它引入了一个参数化的分布(称为变分分布或识别模型),并最小化该分布与真实后验之间的KL散度。
- 生成能力:VAE可以用来生成新的样本。通过从学习到的潜在空间中随机抽取样本,并通过解码器将其转换为原始数据空间中的样本,可以实现这一点。
- 连续且平滑的潜在空间:VAE倾向于创建一个连续和平滑的潜在空间,这使得在潜在空间中进行插值变得有意义,并且能够生成合理的、过渡自然的新样本。
- 重构损失+正则化项:损失函数由两部分组成:一是重构损失(如均方误差或交叉熵),衡量输入和输出之间的差异;二是KL散度作为正则化项,确保潜在变量的分布接近于预定义的先验分布(通常是标准正态分布)。
- 不确定性估计:因为VAE是基于概率模型的,所以它们能够提供对预测结果不确定性的估计,这对于某些应用领域(例如医疗诊断)非常重要。
- 可解释性:在一些情况下,VAE的潜在空间可能具有一定的语义意义,即特定维度的变化可能会对应于输入数据中的一些显著特征或模式。
- 训练稳定性:相较于其他一些生成模型(如GANs),VAE的训练过程往往更稳定,不容易出现模式崩溃等问题。
- 灵活性:VAE框架非常灵活,可以通过改变编码器、解码器结构以及潜在变量的分布来适应不同的任务需求。
- 扩展性:VAE的概念容易扩展到条件变分自编码器(CVAE)、对抗变分自编码器(AAE)等变体,以处理更复杂的任务,比如条件生成或者结合对抗训练机制提升生成质量。
相关文章:
一文读懂变分自编码(VAE)
一文读懂变分自编码(VAE) 概述 变分自编码器(Variational Autoencoder, VAE)是一种生成模型,用于学习数据的潜在表示并生成与原始数据分布相似的新数据。它是一种概率模型,通过结合深度学习和变分推断的思想,解决了传…...
【每日学点鸿蒙知识】webview性能优化、taskpool、热更新、Navigation问题、调试时每次都卸载重装问题
1、HarmonyOS webview页面第二次,第三次打开感觉和第一次打开速度差不多,有优化吗,或者有没有webview秒开方案之类的? 目前没有webview秒开的方案,针对web场景的优化参考一下文档:https://developer.huawe…...
周记-唐纳德的《计算机程序设计艺术》
用代码生成代码 开发一个协议,字段有些多,每个字段是QT的属性,需要写Q_PROPERTY,一个一个编辑的话比较繁琐,耗费时间。后来就用代码生成了头文件和源文件,get和set还有signal函数,内容基本都是…...
AR 模型的功率谱
功率谱密度(Power Spectral Density, PSD)的表达式是从信号的自相关函数和系统的频率响应推导出来的,特别是对于 AR(Auto-Regressive,自回归)模型。以下是推导的过程: 1. AR 模型的定义…...
抖音小程序登录(前端通过tt.login获取code换取openId)
抖音小程序登录 抖音开放平台小程序登录: https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/tutorial/basic-ability/microapp-login 前端(通过tt.login获取code) 流程 静默登录依赖小程序 API tt.login,把tt.loginsuccess 回调…...
Linux 更改Jenkins使用其他账户启动
Linux 更改Jenkins使用其他账户启动 步骤一:修改 Jenkins 配置文件1. 编辑 Jenkins 的 systemd 服务文件:2. 在编辑器中添加以下内容:3. 保存并退出编辑器 步骤二:更改 Jenkins 目录的权限步骤三:重新加载 systemd 配置…...
117.【C语言】数据结构之排序(选择排序)
目录 1.知识回顾 2.分析 设想的思路 代码 执行结果 编辑 错误排查和修复 详细分析出错点 执行结果 3.正确的思路 4.其他问题 1.知识回顾 参见42.5【C语言】选择排序代码 点我跳转 2.分析 知识回顾里所提到的文章的选择排序一次循环只比一个数字,和本文接下来要…...
读书系列2024
认知类 1、《人生没有太晚的开始》: 作者摩西奶奶。 书中经典语录:“与其着急忙慌地不知从何开始,不如一切都慢慢来,开始并坚持了,总会有结果的那一天。喜欢一件事,你就慢慢去做吧。” 2、《忏悔录》托尔…...
如何快速又安全的实现端口转发【Windows MAC linux通用】
背景 有很多程序是在虚拟机上运行的,返回的url 又是127.0.0.1。在个人电脑上调试需要解决这个问题。端口转发是一个不错的方法 可能的解决办法: 1.修改程序,返回虚拟机的ip (要改代码,换虚拟机还要再改代码…...
OpenGL变换矩阵和输入控制
在前面的文章当中我们已经成功播放了动画,让我们的角色动了起来,这一切变得比较有意思了起来。不过我们发现,角色虽然说是动了起来,不过只是在不停地原地踏步而已,而且我们也没有办法通过键盘来控制这个角色来进行移动…...
51单片机学习笔记——找不到REG52.H头文件,点亮一个LED
创建工程 将STC型号导入keil并使用 STC可以从官网下载,也可我这的网盘: 链接:https://pan.baidu.com/s/1bO85DPN3IFaXGhiKSwyOrA?pwd7f4h 提取码:7f4h 打开STC,选择“keil仿真设置”,选择“添加型号和头…...
07 基于OpenAMP的核间通信方案
引言 ZYNQ7020有两个CPU核心,这两个核心可以采用SMP或AMP方式进行调度,当采用AMP方式进行调度时核0和核1可以运行不同的操作系统,如核0运行Linux系统,提供有些复杂的用户交互工作,核1运行实时操作系统,对设…...
Ubuntu升级ssh版本到9.8
方案一:实测只有8.9有漏洞不推荐 1、更新软件包列表 sudo apt update 2、查找可用版本 apt-cache policy openssh-server 3、 选择版本 sudo apt install openssh-server1:9.8p1-<具体版本号> 4、 重启 sudo systemctl restart ssh 5、验证版本 /usr/sbin/ss…...
git设置项目远程仓库指向github的一个仓库
要将你的Git项目设置为指向GitHub上的远程仓库,你需要执行以下步骤: 创建GitHub仓库: 登录到你的GitHub账户。点击右上角的 “” 号,选择 “New repository” 创建一个新的仓库。填写仓库的名称,可以添加描述ÿ…...
【实战示例】面向对象的需求建模
前言 博主准备写一个以面向对象为核心思想的软件需求建模、领域建模的系列,总结一整套可落地的DDD的打法,前面几篇文章论述了如何进行面向对象的需求建模,本文将以一个简单的购物商城的需求来演示如何进行面向对象的需求建模。 面向对象的需…...
平方数的判断不用sqrt()函数
//判断一个数是不是平方数,13…(2*m-1)m*mn #include<stdio.h> int main(){ int n; scanf("%d",&n); int i; for(i1;n>0;i2){ nn-1; } if(n0){ printf("YES!\n"); …...
node.js之---回调函数
什么是回调函数? 为什么会有回调函数? 回调函数的特性 回调函数的应用场景 怎么解决回调地狱 什么是回调函数? 回调函数是一个函数,他作为参数传递给另外一个函数,并且会在另外一个函数执行完毕之后被调用&#…...
浏览器http缓存问题
一、什么是浏览器缓存 浏览器将请求过的资源(html、js、css、img)等,根据缓存机制,拷贝一份副本存储在浏览器的内存或者磁盘上。如果下一次请求的url相同时则根据缓存机制决定是读取内存或者磁盘上的数据还是去服务器请求资源文件…...
编写一个简单的引导加载程序(bootloader)
编写一个简单的引导加载程序(bootloader)通常用于嵌入式系统或自定义操作系统。这里,我将为你提供一个基于x86架构的简单汇编语言 bootloader 示例。这个 bootloader 将会在启动时打印一条消息到屏幕上。 使用 NASM 汇编器来编写这个 bootlo…...
Three.js 字体
在 Three.js 中,我们可以通过 FontLoader 加载字体,并结合 TextGeometry 创建 3D 文本。加载字体是因为字体文件包含了字体的几何信息,例如字体的形状、大小、粗细等,而 TextGeometry 则是根据字体信息生成 3D 文本的几何体。 在…...
Jenkins 构建流水线
在 Linux 系统上安装 Jenkins 服务,以及配置自动化构建项目 前置准备环境:docker、docker-compose、jdk、maven 一、环境搭建 1. Jenkins 安装 (1)拉取镜像 # 安装镜像包,默认安装最新版本 docker pull jenkins/jen…...
ES 磁盘使用率检查及处理方法
文章目录 1. 检查原因2. 检查方法3. 处理方法3.1 清理数据3.2 再次检查磁盘使用率 1. 检查原因 磁盘使用率在 85%以下,ES 可正常运行,达到 85%及以上会影响 PEIM 数据存储。 在 ES 磁盘分配分片控制策略中,为了保护数据节点的安全࿰…...
【回溯】LeetCode经典题目总结:组合、排列、子集、分割、N皇后、单词搜索
回溯 组合问题组合总和全排列子集分割回文串N皇后电话号码的字母组合单词搜索括号生成 组合问题 给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 树形结构࿱…...
uniapp开发小程序内嵌h5页面,video视频两边有细小黑色边框
1.问题如图 2.原因分析 是否为设置上述属性呢? 设置了,但是仍然有黑边。经过选中页面元素分析后,判断video元素本身就有这种特点,就是视频资源无法完全铺满元素容器。 3.解决方案...
Ubuntu meson使用
一 下载pip3 ,使用pip3下载 meson sudo apt install python3 sudo apt install python3-pip二 下载 nanjia sudo apt-get install ninja-build三 测试 meson 使用 1 同一个目录下创建两个文件 main.c #include<stdio.h> int main() {printf("meson t…...
实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
算法排序算法
文章目录 快速排序[leetcode 215数组中的第K个最大元素](https://leetcode.cn/problems/kth-largest-element-in-an-array/)分析题解快速排序 桶排序[leetcode 347 前K个高频元素](https://leetcode.cn/problems/top-k-frequent-elements/)分析题解 快速排序 leetcode 215数组…...
植物大战僵尸杂交版3.0.2版本
更新内容 植物大战僵尸杂交版3.0.2版本的更新内容如下: • 修复BUG: • 游戏内贴图错乱的BUG。 • 无尽模式卡死的BUG。 • 卡牌模仿者的一系列BUG。 • 干扰车可能同时出现多辆的BUG。 • 冒险模式部分关卡无法过关的BUG。 • 新增内容…...
Kafka数据迁移全解析:同集群和跨集群
文章目录 一、同集群迁移二、跨集群迁移 Kafka两种迁移场景,分别是同集群数据迁移、跨集群数据迁移。 一、同集群迁移 应用场景: broker 迁移 主要使用的场景是broker 上线,下线,或者扩容等.基于同一套zookeeper的操作。 实践: 将需要新添加…...
自动化测试模型(一)
8.8.1 自动化测试模型概述 在自动化测试运用于测试工作的过程中,测试人员根据不同自动化测试工具、测试框架等所进行的测试活动进行了抽象,总结出线性测试、模块化驱动测试、数据驱动测试和关键字驱动测试这4种自动化测试模型。 线性测试 首先&#…...
selenium(三)
总结 一、web基础 html、dom对象、javascript基本语法二、元素定位: find_element(定位方式) 八大定位方式:id、name、class、tag_name、class_name、link_text、partial_link_text、xpath、cssxpath://标签名[属性名值 and/or 属性名值]//标签名[tex…...
7.若依参数设置、通知公告、日志管理
参数设置 对系统中的参数进行动态维护。 关闭验证码校验功能 打开页面注册功能 需要修改前端页面代码 通知公告 促进组织内部信息传递 若依只提供了一个半成品,只实现了管理员可以添加通知公告。 日志管理 追踪用户行为和系统运行状况。 登录日志 和操作日志…...
vsftpd虚拟用户及其权限配置
目录 一、应用场景二、配置过程1、安装软件2、新建本地用户3、修改vsftpd的配置文件4、新建虚拟用户目录5、配置虚拟用户(1)创建虚拟用户列表文件(2)生成虚拟用户数据库(3)配置pam认证(4&#…...
Android使用辅助服务AccessibilityService实现自动化任务
Android 辅助服务(AccessibilityService)旨在帮助具有视觉、身体或年龄相关限制的用户更轻松地使用 Android 设备和应用。通过辅助服务,可以将一些人工操作自动化,从而解放用户的双手。 因此我们可以使用它来实现一些自动化任务&a…...
brupsuite的基础用法常用模块(1)
proxy模块: Options: 设置代理端口,默认为8080端口,若8080端口被占用可在该界面更改代理端口. HTTP history: 拦截的历史请求,右键可做更多操作,很多操作与其他模块有关。(清除历史的话右键选择clear p…...
基础的基础之 pillow与opencv相比的特点与优缺点比较
Pillow 和 OpenCV 都是人工智能图像处理的必不可少的常用库,但它们有各自的特点和适用场景。 以下是它们的主要特点、优缺点以及适用场景的对比: 1. Pillow(Python Imaging Library) Pillow 是一个轻量级的图像处理库࿰…...
代码随想录算法训练营第51期第32天 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
理论基础 动态规划:dp,每一个状态都是由上个状态推导出来的,因为我是先写完三道题再看理论的,所以有点感概; 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举…...
街景主观感知1:街景图片两两对比程序
目录 1、为什么不用place pluse 2.0数据集?2、街景主观感知两两对比程序2.1 总框架2.2 两两对比程序流程2.2.1 准备数据集(即街景图片)2.2.2 数据集采用组合的思想构建排列前的两两对比csv2.2.3 两两对比程序使用 3、其他数据处理/程序/指导&…...
vue在action中调用action的函数
以下是在 Vue2 中一个 Vuex 的 action 中调用另一个 action 中的函数的解决思路: 首先,确保你已经在 Vue 项目中正确配置了 Vuex 状态管理。在 Vuex 的 actions 对象中定义不同的 action 函数。当需要在一个 action 中调用另一个 action 时,…...
探索 Java 静态变量(static)的奥秘
目录 一、静态变量初印象 (一)什么是静态变量 (二)静态变量的特点 二、静态变量的使用场景 (一)共享数据 (二)全局常量 (三)工具类中的变量 三、静态…...
Excel for Finance 07 `FV PV` 函数
Excel 的 FV 函数用于计算一笔投资在未来的价值,基于固定的利率和定期付款。这是一个金融函数,常用来分析储蓄计划、贷款、或投资的增长。 语法: FV(rate, nper, pmt, [pv], [type])参数说明: rate(必需)&…...
【GUI-PyQt5】简介
1. 简介 GUI:带图形的用户接口程序,也就是桌面应用。 2. 分类 2.1 基本窗口控件 QMainWindowQwidgetQlabelQLineEdit菜单工具栏 2.2 高级组件 QTableViewQListView容器多线程 2.3 布局管理 QBoxLayoutQGridLayoutQFormLayout嵌套布局 2.4 信号与…...
CMSeasy;大米CMS漏洞复现
一、越权漏洞 pikachu-Over permission 水平越权 ⽔平越权:指攻击者尝试访问与他拥有相同权限的⽤户资源。 登录lucy 查看lucy个人信息 在lucy页面修改usernamelili 可以跳转lili的个人信息页面 pikachu-Over permission 垂直越权 垂直越权:通过低权…...
【CSS in Depth 2 精译_093】16.2:CSS 变换在动效中的应用(上)—— 图标的放大和过渡效果的设置
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 ✔️ 16.2.1 放大图…...
代码随想录算法【Day5】
DAY5 1.熟悉哈希表的数据结构:数组、map和set,使用方法、使用场景 2.哈希表应用场景:解决给你一个元素,判断它在集合里是否出现过。 242.有效的字母异位词 本题用数组解决的。 class Solution { public:bool isAnagram(strin…...
工程师如何平衡工作和生活?
在快节奏的社会环境中,工程师面临着高强度的工作压力和长时间的工作需求,要做到工作和生活的平衡,确实不容易。然而,通过一些策略和改变工作方式,可以有效缓解压力,找到平衡点。以下是一些建议:…...
若依数据权限控制
效果 新建用户 表结构 sys_role_dept 这张表的存在。是为了实现数据权限自定义的功能 service层 mapper层 流程...
C++ 设计模式:抽象工厂(Abstract Factory)
链接:C 设计模式 链接:C 设计模式 - 工厂方法 链接:C 设计模式 - 原型模式 链接:C 设计模式 - 建造者模式 抽象工厂(Abstract Factory)是一种创建型设计模式,它提供一个接口,用于创…...
嵌入式系统 第十讲 字符设备和驱动程序设计
• 字符设备是Linux三大设备之一(另外两种是块设备,网 络设备)。 • 字符设备就是采用字节流形式通讯的I/O设备,绝大部分 设备都是字符设备。 • 常见的字符设备包括鼠标、键盘、显示器、串口等等。 • 10.1 字符设备驱动框架 …...
Cod---Class of Device for Bluetooth device
0 Preface/Foreword 蓝牙sink在广播时候,需要告知自己的设备类型,这样蓝牙source可以方便准备相应协议。 从可视化来看,cod(设备类型),比如Android手机,在蓝牙可配对列表中,左边那…...