一文了解树与森林基础
文章目录
- 树和森林
- 1树的存储结构
- 1.1双亲表示法
- 1.2孩子表示法
- 1.3孩子兄弟表示法
- 2树、森林与二叉树的转换
- 2.1森林与二叉树的转换
- 2.2 树与二叉树的转换
- 3树和森林的遍历
- 3.1树的遍历
- 3.2森林的遍历
- 3.3 树和森林的遍历与二叉树的遍历关系
- 4树的应用——并查集
- 4.1并查集及其相关操作
- 4.2并查集的路径压缩
树和森林
1树的存储结构
关于树的存储,要求既要存储结点的数据元素,又要存储结点之间的逻辑关系。有关树的存储方式有多种,常用的三种数据的存储结构是双亲存储结构、孩子存储结构和孩子兄弟存储结构。
1.1双亲表示法
这种存储方式采用一组连续的空间来存储每个结点,每个结点中保存有指向其双亲的“指针”。这种存储方法可以很快可以很快地得到每个结点的双亲结点;但求结点的孩子时,需要遍历整个结构。
#define MAX_TREE_SIZE 100 //树中最多结点数
typedef struct PTNode
{ //树的结点定义TElemType data; //数据元素int parent; //双亲位置域
}PTNode;
typedef struct
{ //树结构PTNode nodes[MAX_TREE_SIZE];int root; //根结点位置int n; //结点数
}PTree
下图中,根节点下标为 0,根节点的伪指针域为-1。
data | parent |
---|---|
R | -1 |
A | 0 |
B | 0 |
C | 0 |
D | 1 |
E | 1 |
F | 3 |
G | 6 |
H | 6 |
K | 6 |
1.2孩子表示法
顺序存储各个结点,每个结点中保存孩子链表头指针。即先将每个结点的孩子结点都分别用单链表链接起来形成一个线性结构,再将各个结点用顺序存储的存储方法存储起来,每个结点都包含有一个指向其孩子链表首个结点的指针(叶结点的孩子链表为空)。代码实现如下:
//树的孩子链表存储表示typedef struct CTNode
{ //孩子结点int child;struct CTNode *next;
}*ChildPtr;
typedef struct
{TElemType data;ChildPtr firstchild; //孩子链表头指针
}CTBox;
typedef struct
{CTBox nodes[MAX-TREE.SIZE];int n,r; //结点数和根的位置
}CTree;
1.3孩子兄弟表示法
又称二叉树表示法,或二叉链表表示法,即以二叉链表作树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和下一个兄弟结点,分别命名为 firstchild 域和 nextsibling 域。
这种存储表示法比较灵活,其最大的优点是可以方便地实现树转换为二叉树的操作,也非常易于查找结点的孩子;但缺点是从当前结点查找其双亲结点较为麻烦。
//孩子兄弟表示法
typedef struct CSNode
{ElemType data; //数据域struct CSNode *firstchild, *nextsibling;
}CSNode, *CSTree;
2树、森林与二叉树的转换
由于二叉树和树都可用二叉链表作为存储结构,则以二叉链表作为媒介可导出树与二叉树之间的一个对应关系。
2.1森林与二叉树的转换
将森林转换为二叉树基于树与二叉树的转换(建议先学习下一小节的内容):先将森林中的每棵树转换为二叉树;由于任何一棵和树对应的二叉树的右子树必为空,因此我们可以把森林中第二棵树根视为第一棵树的根的右兄弟,即将第二棵树对应的二叉树当作第一棵二叉树根的右子树;将第三棵树对应的二叉树当作第二棵二叉树的根的右子树……以此类推,就可以将森林转换为二叉树。
二叉树转换为森林的规则:若二叉树非空,则二叉树的根及其左子树为第一棵树的二叉树形式,故将根的右链断开。二叉树根的右子树又可视为一个由除第一棵树外的森林转换后的二叉树应用同样的方法,直到最后只剩一棵没有右子树的二叉树为止,最后再将每棵二叉树依次转换成树,就得到了原森林。二叉树转换为树或森林是唯一的。
2.2 树与二叉树的转换
树转换为二叉树的规则:每个结点左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟,这个规则又称“左孩子右兄弟”。由于根结点没有兄弟,所以对应的二叉树没有右子树。
3树和森林的遍历
3.1树的遍历
1.树的先根遍历
若树非空,先访问根结点,再依次对每棵子树进行先根遍历。
树的先根遍历序列与这棵树相应二叉树的先序序列相同。
//树的先根遍历
void PreOrder(TreeNode *R){
if(R!=NULL){visit(R); //访问根节点while(R 还有下一个子树 T)PreOrder(T); //后根遍历下一棵子树}
}
2.树的后根遍历
若树非空,先依次对每棵子树进行后根遍历,最后再访问根结点。
树的后根遍历序列与这棵树相应二叉树的中序序列相同。
//树的后根遍历
void PostOrder(TreeNode *R){if(R!=NULL){while(R 还有下一个子树 T)PostOrder (T); //后根遍历下一棵子树visit (R); //访问根节点}
}
3.层次遍历(用队列实现)
①若树非空,则根节点入队
②若队列非空,队头元素出队并访问,同时将该元素的孩子依次入队
③重复②直到队列为空
3.2森林的遍历
1.先序遍历森林
若森林为非空,则按如下规则进行遍历:访问森林中第一棵树的根结点;先序遍历第一棵树中根结点的子树森林;先序遍历除去第一棵树之后剩余的树构成的森林。
森林的先序遍历序列与这棵树相应二叉树的先序序列相同。
2.中序遍历森林(中根遍历,也叫后根遍历)
若森林为非空,则按如下规则进行遍历:中序遍历第一棵树中根结点的子树森林(中序遍历第一棵树对应的二叉树,因此最后才访问原先的树的根,即得到的序列和树的后根遍历相同,所以又叫后根遍历,中根遍历是借用了二叉树遍历的说法);访问森林中第一棵树的根结点;中序遍历除去第一棵树之后剩余的树构成的森林。
森林的中序遍历序列与这棵树相应二叉树的中序序列相同。
3.3 树和森林的遍历与二叉树的遍历关系
根据遍历得出的序列不同,我们可以得出下表中的对应关系。其中,最容易造成误解的是森林的中序遍历。因为在不同的教材中,该森林遍历方法的命名不同。如前文所说,中根遍历仅仅是借用了二叉树遍历的说法,然而实际上根是最后访问的,因此部分教材中又按照树的遍历方法称其为后根遍历。实际上它们指的都是同一种遍历方法。
树 | 森林 | 二叉树 |
---|---|---|
先根遍历 | 先序遍历 | 先序遍历 |
后根遍历 | 中序遍历(后根遍历) | 中序遍历 |
4树的应用——并查集
4.1并查集及其相关操作
并查集是一种简单的集合表示,通常用树(森林)的双亲表示作为并查的存储结构,每个子集合以一棵树表示。所有表示子集合的树,构成表示全集合的森林,存放在双亲表示法的数组内。通常用数组元素的下标代表元素名,用根结点的下标代表子集合名,根结点的双亲结点为负数,负数的绝对值大小达标了该子集合包含的结点个数。它支持以下 3 种操作:
(1)初始化:将集合 S 中的每个元素都初始化为只有一个单元素的子集合。
void Initial(int S[]){for(int i=0;i<size;i++)S[i] = -1;
}
(2)合并:把集合 S 中的子集合 Root2 并入子集合 Rootl。要求 Root1 和 Root2 互不相交,否则不执行合并。为了得到两个子集合的并,只需将其中一个子集合根结点的双亲指针指向另一个集合的根结点。判断两个元素是否属于同一集合,只需分别找到它们的根结点,比较根结点是否相同即可。
void Union(int S[], int Root1, int Root2){S[Root2] = Root1;
}
(3)查找:查找集合 S 中单元素 x 所在的子集合,并返回该子集合的根结点。
int Find(int S[], int x){while(S[x]>=0)x = S[x];return x;
}
4.2并查集的路径压缩
倘若有 n 个结点的并查集对应的树高为 n,在查找根结点的时候平均时间复杂度就会达到 O(n),因此可以通过路径压缩来加快结点查找根结点的效率,最好的情况下,即将树高压缩为 2 时,时间复杂度可以降低为 O(1)。
相关文章:
一文了解树与森林基础
文章目录 树和森林1树的存储结构1.1双亲表示法1.2孩子表示法1.3孩子兄弟表示法 2树、森林与二叉树的转换2.1森林与二叉树的转换2.2 树与二叉树的转换 3树和森林的遍历3.1树的遍历3.2森林的遍历3.3 树和森林的遍历与二叉树的遍历关系 4树的应用——并查集4.1并查集及其相关操作4…...
在Docker 容器中安装 Oracle 19c
在 Docker 容器中安装 Oracle 19c 是可行的,但它相较于其他数据库(如 MySQL、PostgreSQL 等)会复杂一些,因为 Oracle 数据库有一些特定的要求,如操作系统和库的依赖,以及许可证问题。 不过,Ora…...
Java TCP协议(2)
TCP可靠传输 五. 流量控制 用来控制发送方的窗口大小,通过接收方返回来的ACK进行反制。 接收方把自己能够处理的数据量主动告诉发送方,从而让发送方动态调整窗口大小。 如果窗口大小为0表示没有空间去接收数据了,主机A就不发数据了…...
JS基础-操作数组(7)
一.增删改查 1.改 重新赋值 2.增 arr.puch() 末尾追加 arr.unshift() 开头追加 a)案例:数组筛选 3.删除 arr.pop() 删除最后一个元素 arr.shift() 删除第一个元素 splice() 删除指定元素...
(长期更新)《零基础入门 ArcGIS(ArcScene) 》实验七----城市三维建模与分析(超超超详细!!!)
城市三维建模与分析 三维城市模型已经成为一种非常普遍的地理空间数据资源,成为城市的必需品,对城市能化管理至关重要。语义信息丰富的三维城市模型可以有效实现不同领域数据与IS相信息的高层次集成及互操作,从而在城市规划、环境模拟、应急响应和辅助决策等众多领域公挥作用、…...
大数据技术笔记
大数据技术概述 本章初步介绍大数据领域技术涉及的一些基础理论,如分布式、存储、网络等知识。 分布式理论 大数据意味数据量大,那么存储和计算数据的节点就不大可能只有一个,而是采用分而治之的思想在多个节点中存储和计算,提…...
【JAVA 基础 第(20)课】JDBC JAVA 连接 MySql 数据库
pom.xml 导入 MySql jar 包 <!-- 导入Mysql数据库链接jar包 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version> </dependency> 数据库驱动、连接封装成…...
如何将使用unsloth微调的模型部署到ollama?
目录 一、将模型保存为gguf格式 二、下载llama.cpp 三、生成 llama-quantize 可执行文件 四、使用llama-quantize 五、训练模型 六、将模型部署到ollama 一、将模型保存为gguf格式 在你的训练代码 trainer.train() 之后添加: model.save_pretrained_gguf(&q…...
Go语言中的值类型和引用类型特点
一、值类型 值类型的数据直接包含值,当它们被赋值给一个新的变量或者作为参数传递给函数时,实际上是创建了原值的一个副本。这意味着对新变量的修改不会影响原始变量的值。 Go中的值类型包括: 基础类型:int,float64…...
grafana新增email告警
选择一个面板 比如cpu 新增一个临界点表达式 input选A 就是A的值达到某个临界点 触发告警 我这边IS ABOVE0.15就是cpu大于0.15%就触发报警,这个值怎么填看指标的值显示 这里要设置一下报警条件 这边随便配置下 配置标签和通知,选择你的邮件 看下告警…...
基于Spring Security 6的OAuth2 系列之六 - 授权服务器--自定义授权页面
之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…...
MyBatis-Plus的插件
一、分页插件 1.自带的 启动类 在启动类里配置分页相关内容 package com.qcby;import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inne…...
基于Redis实现短信验证码登录
目录 1 基于Session实现短信验证码登录 2 配置登录拦截器 3 配置完拦截器还需将自定义拦截器添加到SpringMVC的拦截器列表中 才能生效 4 Session集群共享问题 5 基于Redis实现短信验证码登录 6 Hash 结构与 String 结构类型的比较 7 Redis替代Session需要考虑的问题 8 …...
HarmonyOS Next构建工具 lycium 原理介绍
HarmonyOS Next构建工具 lycium 原理介绍 背景介绍 HarmonyOS Next中很多系统API是以C接口提供,如果要使用C接口,必须要使用NAPI在ArkTS与C间交互,这种场景在使用DevEco-Studio中集成的交叉编译工具,以及cmake构建工具就完全够用…...
蓝桥杯例题一
不管遇到多大的困难,我们都要坚持下去。每一次挫折都是我们成长的机会,每一次失败都是我们前进的动力。路漫漫其修远兮,吾将上下而求索。只有不断努力奋斗,才能追逐到自己的梦想。不要害怕失败,害怕的是不敢去尝试。只…...
MySQL可直接使用的查询表的列信息
文章目录 背景实现方案模板SQL如何查询列如何转大写如何获取字符位置如何拼接字段 SQL适用场景 背景 最近产品找来,想让帮忙出下表的信息,字段驼峰展示,每张表信息show create table全部展示,再逐个粘贴,有点太耗费时…...
输入网址到网页显示,发生了什么--讲述
输入www.baidu.com作为网址, 孤身的人-HTTP 浏览器要做的第一步就是 解析URL,根据url里面的资源路径,确认服务器资源和路径,生成http请求消息,包括请求消息(请求行 消息头 请求体) 举例&am…...
npm install 报错:Command failed: git checkout 2.2.0-c
[TOC](npm install 报错:Command failed: git checkout 2.2.0-c) npm install 报错:Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…...
[Day 15]54.螺旋矩阵(简单易懂 有画图)
今天我们来看这道螺旋矩阵,和昨天发的题很类似。没有技巧,全是循环。小白也能懂~ 力扣54.螺旋矩阵 题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: …...
react antd点击table单元格文字下载指定的excel路径
在使用 Ant Design (antd) 的 Table 组件时,如果想点击表格单元格中的文字来触发下载指定路径的 Excel 文件,可以通过以下步骤实现: 1. 确保有一个可供下载的 Excel 文件:需要有一个服务器端点或者一个可以直接访问的 URL…...
什么是数据结构
数据结构 如何有效的存储数据。 数据存储方式 物理结构又称存储结构 在内存中存储状态,数据可以选择集中存放(顺序存储结构),也可以选择分散存放(链式存储结构)。 逻辑结构 数据之间的逻辑关系&#…...
把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用
PVE 挂在硬盘 参考 Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations。 在 PVE shell 中根据上面教程挂在硬盘 新建分享目录 参考 Proxmox VE(PVE)添加硬盘做存储 虚拟机新增硬盘 虚拟机 关机,按下图新增硬盘 新增硬盘…...
HTML5 Web Worker 的使用与实践
引言 在现代 Web 开发中,用户体验是至关重要的。如果页面在执行复杂计算或处理大量数据时变得卡顿或无响应,用户很可能会流失。HTML5 引入了 Web Worker,它允许我们在后台运行 JavaScript 代码,从而避免阻塞主线程,保…...
把网站程序数据上传到服务器的方法和注意事项
将网站程序数据上传到服务器是一个常见的网站开发和部署流程。主要涉及到FTP上传、FileZilla、rsync(在Linux下)、或其他相关的文件同步工具。以下是一般步骤和方法: 使用FTP: 1. 选择FTP客户端软件: - 常见的FTP客户端包括FileZilla(开源)、…...
YOLOv5训练自己的数据及rknn部署
YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…...
李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕
终端输入nvidia-smi查看cuda版本 我的是12.5,在网上没有找到12.5的torch,就安装12.1的。torch,torchvision,torchaudio版本以及python版本要对应 参考:https://blog.csdn.net/FengHanI/article/details/135116114 创…...
Python 在Word中添加、或删除超链接
在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接,用户可以轻松地导航到相关信息,从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…...
在K8S中使用Values文件定制不同环境下的应用配置详解
在Kubernetes(简称K8s)环境中,应用程序的配置管理是一项关键任务。为了确保应用程序在不同环境(如开发、测试、预发布和生产)中都能稳定运行,我们需要为每个环境定制相应的配置。Values文件是在使用Helm管理…...
elementUI Table组件实现表头吸顶效果
需求描述 当 table 内容过多的时候,页面上滑滚动,表头的信息也会随着被遮挡,无法将表头信息和表格内容对应起来,需要进行表头吸顶 开始编码💪 环境:vue2.6、element UI step1: 给el-table__h…...
JS-Web API -day06
一、正则表达式 正则表达式测试工具: http://tool.oschina.net/regex 1.1 正则表达式介绍与语法 正则表达式: 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。通常用来查…...
qml MenuItem详解
1、概述 MenuItem 是 QML(Qt Modeling Language)中用于表示菜单项的组件。它通常作为 Menu 组件的子项出现,用于提供用户可点击的菜单选项。MenuItem 可以包含文本、图标,甚至可以是其他 MenuItem 或 Menu 的容器,从而…...
汇编实验·系统调用
一、实验目的: 1.掌握基于特定操作系统中调用API或者SYSTEMCALL的基本方法。 2.进一步理解高级语言中函数调用的相关规定和约定(stdcall,cdec,fastcall等) 3.IA-32架构下API参数在汇编中的实现方式和约定。 二、实验内容 1.在课程设定的VS2022社区版的汇编开发环境下,完…...
ubuntu调用图形化网络测试工具
在 Ubuntu 中,除了命令行工具外,还有一些图形化的网络测试工具可以帮助你更直观地测试和分析网络性能。以下是几款常用的图形化网络测试工具及其使用方法: 1. gnome-nettool gnome-nettool 是一个简单的图形化网络工具集,包含 pi…...
【Qt】05-菜单栏
做菜单 前言一、创建文件二、菜单栏 QMenuBar2.1 示例代码2.2 运行结果 三、工具栏 QToolBar3.1 运行代码3.2 结果分析 四、状态栏 QStatusBar4.1 运行代码4.2 运行结果 五、文本编辑框 QTextEdit5.1 运行代码5.2 运行结果 六、浮动窗口 addDockWidget6.1 运行代码6.2 运行结果…...
Git知识分享
一、理解git首先要理清楚下面五个概念: 1、工作区(git add 命令之前的样子) 2、stash 暂存(暂存工作区和暂存区的更改) 3、暂存区(git add 命令之后的存储区, 4、本地仓库(git commit提交的位置) 5、远程仓库(git push提交的位置) 二、git常用命令: 1、g…...
细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例
目录 一、待机模式基础知识 1、进入待机模式 2、待机模式的状态 3、退出待机模式 二、待机模式应用示例 1、示例功能和CubeMX项目设置 (1) 时钟 (2) DEBUG、LED1、KeyRight、USART6、CodeGenerator (3&#x…...
独立站运营新突破:Clock斗篷技术助力商家降本增效
一、引言 在当今竞争激烈的电商市场中,独立站运营已成为众多商家拓展业务、打造品牌的重要途径。然而,推广成本高企一直是困扰独立站商家的难题。许多商家在推广过程中,由于缺乏有效的策略,往往面临高昂的费用和有限的回报。但事实…...
【python】subprocess.Popen执行adb shell指令进入linux系统后连续使用指令,出现cmd窗口阻塞问题
问题描述 subprocess.Popen执行adb shell指令进入linux系统后出现cmd窗口阻塞问题,需要手动关闭cmd才会继续执行其他指令。 解决方案 1、cmd指令后面加入exit\n关闭exe进程 2、subprocess.Popen()添加内置参数creationflagssubprocess.CREATE_NO_WINDOW隐藏窗口弹…...
10天学会flutter DAY2 玩转dart 类
print(point.y); * 使用 ?. 代替. 可以避免因为左边表达式为null 而导致的问题 (这个是flutter 2.0 之后新增的空认证功能)print(point?.x); print(point?.y); * 如下代码所示p1.y 6; **setter** 写入方法, print(p1.y); **getter** 读取方法p1.y 6; print(p1.y); […...
【C++】string类模拟实现
目录 💕1.模拟string类构造函数 💕2.模拟构造函数实现 💕3.拷贝构造函数模拟实现 💕4.析构函数模拟实现 💕5.size函数,capacity函数模拟实现 💕6.begin函数,end函数,模拟实…...
2025发文新方向:AI+量化 人工智能与金融完美融合!
2025深度学习发论文&模型涨点之——AI量化 人工智能的融入,使量化交易实现了质的突破。借助机器学习、深度学习等先进技术,人工智能可高效处理并剖析海量市场数据,挖掘出数据背后错综复杂的模式与趋势,从而不仅提升了数据分析…...
eniops库中reduce函数使用方法
reduce 是 eniops 中的一个常用函数,用于对张量进行降维操作。它允许你通过指定维度名称和操作类型(如求和、均值等)来简化张量的形状。 import eniops import torch# 创建一个示例张量 x torch.randn(2, 3, 4)# 使用 reduce 进行降维操作 …...
第03章 02 VTK中的智能指针
在VTK(Visualization Toolkit)中,智能指针用于管理对象的生命周期,避免内存泄漏和悬空指针等问题。VTK提供了几种不同类型的智能指针,包括vtkNew、vtkSmartPointer和vtkWeakPtr。以下是它们的区别和作用: …...
03垃圾回收篇(D4_彻底理解GC)
目录 一、浅析大促备战过程中出现的 fullGc,我们能做什么? 1. 什么是 JVM 的 GC? 2. 写代码的时候能做什么? 3. 测试能做啥 4. 知识小结 二、MinorGC、MajorGC、FullGC垃圾回收介绍 1. MinorGC (新生代垃圾回收)…...
C语言小项目——通讯录
功能介绍: 1.联系人信息:姓名年龄性别地址电话 2.通讯录中可以存放100个人的信息 3.功能: 1>增加联系人 2>删除指定联系人 3>查找指定联系人的信息 4>修改指定联系人的信息 5显示所有联系人的信息 6>排序(名字&…...
MyBatis和JPA区别详解
文章目录 MyBatis和JPA区别详解一、引言二、设计理念与使用方式1、MyBatis:半自动化的ORM框架1.1、代码示例 2、JPA:全自动的ORM框架2.1、代码示例 三、性能优化与适用场景1、MyBatis:灵活的SQL控制1.1、适用场景 2、JPA:开发效率…...
【理论】测试开发工程师进阶路线
一、腾讯与阿里的质量保证服务参考 阿里云效测试能力与架构 腾讯 WeTest 测试能力全景图 二、测试开发技术体系 1.用户端测试: Web/App 测试 Web/App 自动化测试 用户端专项测试 用户端安全测试 2.服务端测试: 接口协议与 Mock 接口自动化测试 服务端…...
能源新动向:智慧能源平台助力推动新型电力负荷管理系统建设
背景 国家能源局近日发布《关于支持电力领域新型经营主体创新发展的指导意见》,鼓励支持具备条件的工业企业、工业园区等开展智能微电网建设,通过聚合分布式光伏、分散式风电、新型储能、可调节负荷等资源,为电力系统提供灵活调节能力&#x…...
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…...
CAP原则中的P:分区容错性(Partition tolerance)
CAP 理论概述 在分布式系统中,系统面临三大核心问题: 一致性(Consistency):所有节点的数据始终保持一致。可用性(Availability):系统始终能够响应请求,无论请求是否成功…...