数据结构 - 10( B- 树 B+ 树 B* 树 4000 字详解 )
一:B- 树
1.1 B- 树的引入
在使用二叉搜索树对数据进行排序时,存在一个缺陷:随着数据量的增大,二叉搜索树的高度也会随之增加。虽然在数据量较小时,这种情况并不明显,但当数据量变得庞大时,树的高度可能会显著增加,而二叉搜索树的搜索效率依赖于其高度。我们应该如何提高二叉搜索树的排序效率呢?第一是提高 IO 的速度,第二是降低树的高度,由第二点就引入了一种新的数据结构 —— B- 树。
1.2 B- 树概念
1970年,R. Bayer 和 E. McCreight 提出了一种适合外部查找的树结构,称为 B 树,注意不要误读为 B 减树。一棵 M 阶(M > 2)的 B 树是一种平衡的多路搜索树,可以是空树或满足以下性质:
- 根节点至少有两个孩子。
- 每个非根节点至少包含 ⌈M / 2⌉ - 1 个关键字,至多包含 M - 1 个关键字,且这些关键字按升序排列。例如,当 M = 3 时,非根节点至少包含 1 个关键字,最多包含 2 个关键字。
- 每个非根节点至少有 ⌈M / 2⌉ 个孩子,至多有 M 个孩子。例如,当 M = 3 时,非根节点至少有 2 个孩子,最多有 3 个孩子。
- 在关键字 key[i] 和 key[i+1] 之间的孩子节点的值介于 key[i] 和 key[i+1] 之间。
- 所有叶子节点都位于同一层上。
1.3 B- 树的插入分析
为了简单起见,假设 M = 3,即构建一棵三叉树。每个节点中存储两个关键字,这两个关键字可以将值域分割成三个部分,因此每个节点应有三个孩子,孩子节点的数量始终比关键字的数量多一个。为了简化后续实现,节点的结构设计为:
用序列 {53, 139, 75, 49, 145, 36, 101} ,这个序列中的数就是关键字,构建 B 树的过程如下:
插入过程总结:
- 如果树为空,直接插入新节点,数组中的该节点将成为树的根节点。
- 如果树非空,首先找到待插入元素在树中的插入位置,注意找到的位置一定是在叶子节点中。
- 检查插入位置是否有效。如果待插入的元素已经存在于树中,则不进行插入。
- 根据插入排序的思想,将新元素插入到找到的节点中。
- 检测该节点是否满足B树的性质,即节点中的元素个数是否等于M。若小于M,则满足性质。
- 如果插入后节点不满足B树的性质,需要对该节点进行分裂:首先申请一个新节点,接着找到当前节点的中间位置,然后将该节点中间位置右侧的元素及其孩子节点移动到新节点中。最后将中间位置的元素和新节点插入到该节点的双亲节点中,并返回到步骤4。
- 如果分裂过程已经达到根节点位置,则插入过程结束。
1.4 B- 树的插入实现
1.4.1 B- 树的节点设计
class BTreeNode {int[] keys; // 存放当前节点中的关键字BTreeNode[] subs; // 存放当前节点的子节点BTreeNode parent; // 当前节点的父节点,用于在分裂时向上插入int size; // 当前节点中有效关键字的个数// 构造函数,初始化B树节点BTreeNode(int M) {keys = new int[M]; // 初始化关键字数组,大小为Msubs = new BTreeNode[M + 1]; // 初始化子节点数组,大小为M + 1(孩子节点比关键字多一个)size = 0; // 初始时有效关键字数量为0}
}
1.4.2 插入 key 的过程
- 先查找 key 是否在 B- 树中:
public Pair<BTreeNode, Integer> find(int key) {BTreeNode cur = root; // 从树的根节点开始查找BTreeNode parent = null; // 用于记录当前节点的父节点while (cur != null) { // 遍历树,直到找到该节点或到达空节点int index = 0; // 初始化索引,用于遍历当前节点的关键字while (index < cur.size) { // 遍历当前节点中的关键字if (key == cur.keys[index]) { // 如果找到了目标关键字return new Pair<BTreeNode, Integer>(cur, index); // 返回当前节点和关键字的位置} else if (key < cur.keys[index]) { // 如果目标关键字小于当前关键字break; // 说明应该在当前节点的左子树中查找} else {index++; // 否则继续检查下一个关键字}}parent = cur; // 更新父节点为当前节点cur = cur.subs[index]; // 查找当前节点的子节点}return new Pair<BTreeNode, Integer>(parent, -1); // 未找到目标关键字,返回父节点和-1
}
- 按照插入排序的思想插入关键字 key。在插入 key 的同时,可能还要插入新分裂出来的节点。
// 采用插入排序的思想插入在cur节点中插入key以及分列出的sub孩子
void insertKey(BTreeNode cur, int key, BTreeNode sub) {int end = cur.size - 1; // 设置指向当前节点最后一个关键字的索引while (end >= 0 && key < cur.keys[end]) { // 寻找插入位置cur.keys[end + 1] = cur.keys[end]; // 将当前关键字向右移动cur.subs[end + 2] = cur.subs[end + 1]; // 将子节点向右移动end--; // 移动到下一个关键字}cur.keys[end + 1] = key; // 在合适位置插入新关键字cur.subs[end + 2] = sub; // 在合适位置插入分裂出的子节点cur.size++; // 更新当前节点的有效大小if (sub != null) { // 如果子节点不为空sub.parent = cur; // 将子节点的父节点指向当前节点}
}
1.4.3 B- 树的插入实现
boolean insert(int key) {// 检查树是否为空,如果为空,则初始化根节点并插入关键字if (root == null) {root = new BTreeNode(M);root.keys[0] = key;root.size = 1;return true;}// 查找插入位置,返回的键值对中如果值不为-1,说明该元素已存在Pair<BTreeNode, Integer> ret = find(key);if (ret.getValue() != -1) {return false; // 关键字已存在,不进行插入}// 获取待插入的当前节点BTreeNode cur = ret.getKey();int k = key; // 存储待插入的关键字BTreeNode sub = null; // 用于存放新分裂出的子节点while (true) {// 插入关键字及子节点insertKey(cur, k, sub);// 如果当前节点的大小未超过最大值,直接返回if (cur.size < M) {break;}// 当前节点需要分裂,找到中间位置int mid = (cur.size >> 1);BTreeNode newNode = new BTreeNode(M); // 创建新的节点int i = 0;int index = mid + 1; // 中间位置右侧开始// 将中间位置右侧的所有元素和子节点搬移到新节点中for (; index < cur.size; ++index) {newNode.keys[i] = cur.keys[index];newNode.subs[i++] = cur.subs[index];// 更新搬移的子节点的父节点if (cur.subs[index] != null) {cur.subs[index].parent = newNode;}}// 注意:新节点的子节点比当前节点多一个newNode.subs[i] = cur.subs[index];if (cur.subs[index] != null) {cur.subs[index].parent = newNode;}// 更新新节点和当前节点的大小newNode.size = i;cur.size = cur.size - i - 1;k = cur.keys[mid]; // 更新待插入的关键字为中间位置的元素// 如果当前节点为根节点,需创建新根节点if (cur == root) {root = new BTreeNode(M);root.keys[0] = k;root.subs[0] = cur;root.subs[1] = newNode;root.size = 1;cur.parent = root; // 更新父节点newNode.parent = root; // 更新新节点的父节点break;} else {// 继续向父节点插入sub = newNode;cur = cur.parent;}}return true; // 插入成功
}
1.5 B- 树的性能分析
对于一棵度为 M 的 B-树,每个节点的子节点数目在 M 2 \frac{M}{2} 2M 到 M − 1 M - 1 M−1 之间。因此,树的高度会在某个范围内,查找和插入操作最多需要 O ( log M / 2 N ) O(\log_{M/2} N) O(logM/2N) 次比较。在找到目标节点后,可以通过二分查找快速定位到具体元素。
例如,对于 N = 62 × 1 0 9 N = 62 \times 10^9 N=62×109 个节点的 B-树,如果度 M M M 为 1024,则树的高度最多为 4。在620亿个元素中,只需进行少于 4 次比较即可找到目标节点。接着,利用二分查找可以迅速定位到该元素,这显著减少了磁盘读取的次数,提高了查找效率。
二:B+ 树和 B* 树
2.1 B+ 树
B+ 树是 B- 树的变体,属于多路搜索树,定义基本与B-树相同,但有以下不同之处:
- 非叶子节点的子树指针数量与关键字数量相同。
- 非叶子节点的子树指针 ( p[i] ) 指向的子树包含的关键字值范围为 ( [k[i], k[i+1}) )。
- 在所有叶子节点之间增加了链表,且链表是有序的,以便于叶子节点的遍历。
- 所有关键字仅在叶子节点中出现,不在非叶子节点中出现。
这些特性使得 B+ 树在范围查询和顺序访问时效率更高。
2.2 B* 树
B* 树是 B+ 树的变形,在 B+ 树的非根和非叶子节点再增加指向兄弟节点的指针。
2.3 总结
- B- 树:多路搜索树,每个节点存储 M/2 到 M 个关键字,非叶子节点存储指向关键字范围的子节点,所有关键字在整个树中出现,仅出现一次,非叶子节点可以省;
- B+ 树:在 B- 树基础上,为叶子节点增加链表指针,所有关键字都在叶子节点中出现,非叶子节点作为叶子节点的索引;B+树总是到达叶子节点才命中;
- B* 树:在 B+ 树基础上,为非叶子节点也增加链表指针,将节点的最低利用率从 1/2 提高到 2/3。
相关文章:
数据结构 - 10( B- 树 B+ 树 B* 树 4000 字详解 )
一:B- 树 1.1 B- 树的引入 在使用二叉搜索树对数据进行排序时,存在一个缺陷:随着数据量的增大,二叉搜索树的高度也会随之增加。虽然在数据量较小时,这种情况并不明显,但当数据量变得庞大时,树…...
算法与数据结构 - 常用图算法总结
在图论中,图算法非常重要,广泛应用于计算机科学、网络分析、社交网络、地理信息系统等领域。下面是一些常用的图算法,按不同功能和应用场景分类: 1. 图的遍历 图遍历算法用于遍历图中的节点和边。主要有两种常见的图遍历方法&am…...
涨薪技术|0到1学会性能测试第53课-Tomcat配置
前面的推文我们掌握了Tomcat服务器的3种监控技术知识。今天给大家分享Tomcat调优技术。后续文章都会系统分享干货,带大家从0到1学会性能测试。 01Tomcat配置 当Tomcat服务器安装好并开始运行后,需要对服务器进行一些基本配置,通常关于Tomcat服务器的配置包括两部分: 第一:…...
亚马逊推出新型仓储机器人 Vulcan:具备“触觉”但不会取代人类工人
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
后退n帧协议
滑动窗口机制(Sliding Window) 发送方有一个发送窗口,最多可以连续发送 N 个未确认的帧(N 就是窗口大小)。 接收方通常只有一个接收窗口,只接收按序到达的帧,不接受乱序帧。 累计确认机制&…...
R9周:RNN实现阿尔茨海默病诊断
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 一、导入数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import torch import torch.nn as nn f…...
node.js 实战——在express 中将input file 美化,并完成裁剪、上传进度条
美化上传按钮 在ejs 页面 <!DOCTYPE html> <html> <head><meta charset"utf-8"></meta><title><% title %></title><link relstylesheet href/stylesheets/form.css/><!-- 本地 Bootstrap 引入方式 -->…...
Linux环境下部署MaxScale
测试环境:两台服务器,Mysql版本 8.0,linux版本:Ubuntu 20.04.3; 介绍 在我之前的文章里面有介绍MySql主从服务器的配置,我们项目通常使用.NET开发Server端,如果是代码直接去管理主从服务器的访…...
新能源汽车CAN通信深度解析:MCU、VCU、ECU协同工作原理
1. 什么是CAN通信? CAN(Controller Area Network,控制器局域网) 是一种广泛应用于汽车电子系统的串行通信协议,由德国Bosch公司在1980年代开发,主要用于实现车内电子控制单元(ECU)之…...
按句子切分文本、保留 token 对齐信息、**适配 tokenizer(如 BERT)**这种需求
在之前的文章中我解释了 把长文本切分成一句一句的小段(chunk),每一段尽量是一个完整的句子,而不是强行按字数截断。 但是这个方法自己写会比较复杂,有很多处理这种场景的工具可以直接拿来用。 下面就 处理按句子切分…...
缓存(1):三级缓存
三级缓存是指什么 我们常说的三级缓存如下: CPU三级缓存Spring三级缓存应用架构(JVM、分布式缓存、db)三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍,相当于每年增⻓ 60% 左右,内存的速度当然也会不断…...
Kubernetes client-go 客户端类型与初始化指南
Kubernetes client-go 客户端类型与初始化指南 在 Kubernetes 的 client-go 库中,存在多种客户端用于与 API 服务器交互。以下介绍主要客户端类型,包括用途、初始化方式及 Demo。 1. RESTClient 用途 RESTClient 是底层 REST 客户端,直接…...
【金仓数据库征文】金仓数据库:创新驱动,引领数据库行业新未来
一、引言 在数字化转型的时代洪流中,数据已跃升为企业的核心资产,宛如企业运营与发展的 “数字命脉”。从企业日常运营的精细化管理,到战略决策的高瞻远瞩制定;从客户关系管理的深度耕耘,到供应链优化的全面协同&…...
图漾相机——Sample_V2示例程序(待补充)
文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.Sample_V2编译流程2.1 Windows环境2.2 Linux环境编译 3.Sample_V2示例程序测试3.1 ListDevice_v23.2 DepthStream_v23.3 ExposureTimeSetting_v23.4 ForceDeviceIP_v23.5 GetCalibData_v23.6 NetStatistic_v23.7 …...
手写 vue 源码 ===:自定义调度器、递归调用规避与深度代理
目录 引言 自定义调度器(Scheduler) 什么是调度器? 调度器的实现原理 自定义调度器的实际应用 切面编程(AOP)思想在调度器中的应用 递归调用规避 递归调用的问题 Vue 如何规避递归调用 深度代理(D…...
WPF实时调试的一种实现方法
在WPF程序中,如果我们需要对程序进行调试,一般是使用断点/单步或输出日志之类的调试方法。 如果我们需要实时查看程序输出,可以将程序的输出类型修改为控制台应用程序 这样我们在程序运行后,就可以得到一个控制台窗口。 然后再配…...
数据库操作
本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…...
学习笔记:数据库——事务
1.内容: 基于现有数据库设计检查点实验,观察比较提交前后执行结果并分析。 2.实现 源码 -- 开启事务 START TRANSACTION;-- 插入一条订单记录(客户ID为10002) INSERT INTO orders (o_date, c_id) VALUES (NOW(), 10002);-- 获…...
企业级可观测性实现:OpenObserve云原生平台的本地化部署与远程访问解析
文章目录 前言1. 安装Docker2. 创建并启动OpenObserve容器3. 本地访问测试4. 公网访问本地部署的OpenObserve4.1 内网穿透工具安装4.2 创建公网地址 5. 配置固定公网地址 前言 嘿,各位小伙伴们,今天要给大家揭秘一个在云原生领域里横扫千军的秘密法宝—…...
【Linux系统】第三节—权限
Hello,好久不见—— 云边有个稻草人-CSDN个人博客主页 Linux-本节文章所属专栏-欢迎订阅-持续更新中~~~ 目录 hi!在这里—本节课重要知识点详解 一、Shell命令以及运行原理 二、Linux权限 2.1 Linux权限的概念 2.2 Linux权限管理 2.3 ⽂件权限值的…...
@Data和 @NoArgsConstructor注解详解
Data 和 NoArgsConstructor 注解详解 1. Data 注解 作用:Data 是 Lombok 提供的一个复合注解,用于自动生成 Java 类的常用方法,减少样板代码。生成的内容: Getter 和 Setter:为所有非静态、非 final 字段生成 getter…...
《云计算》第三版总结
《云计算》第三版总结 云计算体系结构 云计算成本优势 开源云计算架构Hadoop2.0 Hadoop体系架构 Hadoop访问接口Hadoop编程接口 Hadoop大家族 分布式组件概述ZooKeeperHbasePigHiveOozieFlumeMahout 虚拟化技术 服务器虚拟化存储虚拟化网络虚拟化桌面虚拟化OpenStack开源虚…...
滚珠导轨:电子制造领域精密运动的核心支撑
电子制造正朝着高精度、高效率方向飞速发展,滚珠导轨在这一进程中扮演着重要角色。滚珠导轨在电子制造领域中具有广泛且重要的应用,主要体现在以下几个方面: 1、印刷电路板(PCB)制造设备:滚珠导轨在PCB制造…...
Spark缓存--cache方法
在Spark 中,cache() 是用于优化计算性能的核心方法之一,但它有许多细节需要深入理解。以下是关于 cache() 的详细技术解析: 1. cache() 的本质 简化的 persist():cache() 是 persist(StorageLevel.MEMORY_ONLY) 的快捷方式&#x…...
kafka logs storage
Kafka 会将日志文件按段(Segment)存储。 Segment是Kafka的最小存储单元,它是一个可追加的文件,用于存储Kafka分区中的一部分消息。 在文件系统中,Partition 是目录名,而Segment 是文件名。 Segment可以通过…...
数据分析平台选型与最佳实践:如何打造高效、灵活的数据生态?
数据分析平台选型与最佳实践:如何打造高效、灵活的数据生态? 在大数据时代,数据分析平台已经成为企业决策的核心支撑。从传统 BI(商业智能)到现代 AI 驱动的数据分析,选择合适的平台不仅影响数据处理效率,也决定了企业的数字化竞争力。面对市场上的众多解决方案(如 Ap…...
MYSQL之索引结构,为何要用B+树
索引的目的就是为了提高查询效率 索引的结构是B树,那么说到B树,必须提一下其他三种结构,分别是:二叉查找树、平衡二叉树、B树 我们来看看各自的结构特征 二叉查找树 特点:任何节点的左子节点的值都小于当前节点的值,右…...
OpenCV 中用于背景分割的一个类cv::bgsegm::BackgroundSubtractorLSBP
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::bgsegm::BackgroundSubtractorLSBP 是 OpenCV 中用于背景分割的一个类,它基于局部样本二进制模式(Local Sample Bina…...
【PmHub后端篇】PmHub Gateway全局过滤器:接口调用耗时统计及黑白名单配置技术深度解析
在微服务架构日益成为现代应用开发主流模式的背景下,网关作为微服务架构前端的关键组件,肩负着路由请求、负载均衡、安全认证、流量控制、监控和日志记录等多项重要任务。本文将围绕PmHub项目中Gateway全局过滤器实现接口调用耗时统计的相关技术进行深入…...
国产激光二极管厂家
中国在激光二极管(Laser Diode)领域已有多家厂商布局,涵盖从低功率到高功率、不同波长的产品,应用于工业、医疗、通信、消费电子等领域。以下是部分国产激光二极管厂家及相关信息,供参考: 1. 武汉锐科光纤…...
安卓基础(XML)
123 属性行为适用场景注意事项match_parent填满父容器可用空间全屏视图、占满剩余空间父容器需有固定尺寸wrap_content根据内容自适应尺寸动态文本、图标、浮动按钮内容过长时可能超出父容器需处理 123 属性作用常用值…...
uniapp|获取当前用户定位、与系统设定位置计算相隔米数、实现打卡签到(可自定义设定位置、位置有效范围米数)
基于UniApp阐述移动应用开发中定位功能的实现全流程,涵盖实时定位获取、动态距离计算与自定义位置、有效范围设定等功能。文章提供完整的代码示例与适配方案,适用于社交签到、课堂教室打卡等场景。 目录 引言定位功能在移动应用中的价值(社交、导航、O2O等场景)UniApp跨平台…...
matlab稳定求解高精度二维对流扩散方程
利用MATLAB稳定求解高精度二维对流扩散方程 Diffusion_1D.m , 2310 Diffusion_2D.m , 3813 license.txt , 1334...
【最新版】likeshop连锁点餐系统-PHP版+uniapp前端全开源
一.系统介绍 likeshop外卖点餐系统适用于茶饮类的外卖点餐场景,搭建自己的一点点、奈雪、喜茶点餐系统。 系统基于总部多门店的连锁模式,拥有门店独立管理后台,支持总部定价和门店定价LBS定位点餐,可堂食可外卖。无论运营还是二开…...
Redis 重回开源怀抱:开源精神的回归与未来展望
在开源软件的广袤天地里,Redis 一直是备受瞩目的明星项目。近期,Redis 宣布重新回归开源,这一消息犹如一颗石子投入平静的湖面,在技术社区激起层层涟漪。今天,就让我们深入了解 Redis 这一重大转变背后的故事、意义以及…...
mac运行java文件提示 错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
1、问题如上 双击java文件打不开,命令行报错。查找了下文章说java8之后,高版本jdk不自带javafx,需要自己下载 2、解决办法 首先查看自己的java版本,我是17.0.10 访问 JavaFX - Gluon 下载对应的版本,如果没有对应的 …...
pimpl与unique_ptr的问题
PImpl与std::unique_ptr组合 pimpl(Pointer to Implementation)是C程序开发中非常常用的技巧之一,它的好处有: 节省程序编译时间保持程序/库的二进制兼容性隐藏实现细节 举例一个常见的pimpl的使用示例: // a.h class Impl; //前置声明 c…...
Opencv进阶操作:图像拼接
文章目录 前言一、图像拼接的原理1. 特征提取与匹配2. 图像配准3. 图像变换与投影4. 图像融合5. 优化与后处理 二、图像拼接的简单实现(案例实现)1.引入库2.定义cv_show()函数3.创建特征检测函数detectAndDescribe()4.读取拼接图片5.计算图片特征点及描述…...
记录Token反序列化OAuth2Authentication(主要是直接存储用户信息的UserDetails )
项目场景: 本地开发环境部署了多套系统,并且使用了同一套登入鉴权组件,存入的TokenStore也是相同的Redis库; 问题描述&原因分析 由于是做的不同项目,group等组织机构不同,导致多系统若是有存储相同用…...
【QT】深入理解 Qt 中的对象树:机制、用途与最佳实践
深入理解 Qt 中的对象树:机制、用途与最佳实践 在使用 Qt 编程时,你是否注意到很多对象可以设置“父对象”?比如: QPushButton* btn new QPushButton(parentWidget);这不是简单的层级结构,而是 Qt 强大而优雅的 对象…...
基于FPGA的血氧和心率蓝牙监测系统设计-max30102
文章目录 前言一、芯片手册分析二、串口接口的血氧模块使用讲解三、仿真时序分析四、代码分析1.蓝牙数据发送2.心率数据采集 总结 前言 本产品的核心是基于心率传感器的智能心率监测系统,通过硬件端的心率传感器获取人体的心率和血氧浓度等信息,并进行实…...
华为首款鸿蒙电脑正式亮相,开启国产操作系统新篇章
5 月 8 日,华为在深圳举办鸿蒙电脑技术与生态沟通会,正式推出了备受瞩目的首款鸿蒙电脑,这一重大举措标志着国产操作系统在个人电脑(PC)领域实现了关键突破,为行业发展注入了新的活力。 历经五年打磨&…...
Docker部署常见应用之Superset
文章目录 使用 Docker 部署使用 Docker Compose 部署参考文章 以下是使用 Docker 部署 Superset 并将存储配置为 MySQL 的详细步骤: 使用 Docker 部署 获取Superset镜像: 使用Docker从官方仓库拉取Superset镜像:docker pull apache/superset:4.0.0创建 …...
触想CX-3588工控主板应用于移动AI数字人,赋能新型智能交互
一、行业发展背景 随着AI智能、自主导航和透明屏显示等技术的不断进步,以及用户对“拟人化”、“沉浸式”交互体验的期待,一种新型交互终端——“移动AI数字人”正在加速实现规模化商用。 各大展厅展馆、零售导购、教学政务甚至家庭场景中,移…...
关系代数操作之复杂扩展操作
除(Division) 定义:关系R为n度关系,关系S为m度关系,m<n,记作RS,关系是K(n-m)度关系 数学描述: 相当于(RS)*S在R中的元组 外连接(…...
STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入
STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入 参考例程例程说明一、存储区数据结构二、读取存储区数据三、写入存储区数据四、测试函数五、测试结果 参考例程 STM32G0xx使用LL库将Flash页分块方式存储数据实现一次擦除可多次…...
V4L2应用程序开发-- 控制流程
使用摄像头时,我们可以调整很多参数,比如: 对于视频流本身: 设置格式:比如V4L2_PIX_FMT_YUYV、V4L2_PIX_FMT_MJPEG、V4L2_PIX_FMT_RGB565 设置分辨率:1024*768等 对于控制部分: 调节亮度 调…...
《大数据技术之Scala》
这是一篇关于大数据技术中Scala语言的基础教程文章,主要介绍了Scala语言的发展历史、与Java的关系、语言特点、环境搭建、插件安装、编程基础、变量和数据类型、运算符、流程控制、函数式编程、面向对象编程、集合操作、模式匹配、异常处理、隐式转换和泛型等核心内…...
使用thymeleaf模版导出swagger3的word格式接口文档
1.pom配置 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.8.RELEASE</version></parent><properties><skipTests>true</skipTests&g…...
Android RecyclerView自带的OnFlingListener,Kotlin
Android RecyclerView自带的OnFlingListener,Kotlin Android启动应用时屏蔽RecyclerView滑动,延时后再允许滑动,Kotlin-CSDN博客 使用了GestureDetectorRecyclerView的setOnTouchListener检测用户的快滑fling事件。发现RecyclerView也自带了监…...