贝叶斯树定义与构建的寻行数墨

Title: 贝叶斯树定义与构建的寻行数墨 —— Notes for “The Bayes Tree: An Algorithmic Foundation for Probabilistic Robot Mapping”


文章目录

  • I. 前言
  • II. 贝叶斯树的定义
    • 1. 贝叶斯树的背景
    • 2. 贝叶斯树的特点
    • 3. 贝叶斯树的定义
  • III. 贝叶斯树的构建
    • 1. 贝叶斯树的构建算法
    • 2. 贝叶斯树的构建实例
    • 3. 贝叶斯树的构建过程
  • IV. 总结
  • 参考文献


关联博文:

因子图、边缘化与消元算法的抽丝剥茧 —— Notes for “Factor Graphs for Robot Perception”

基于 GTSAM 的因子图简单实例

GTSAM 中的鲁棒噪声模型与 M-估计 (GTSAM Robust Noise Model and M-Estimator)

贝叶斯树定义与构建的寻行数墨 —— Notes for “The Bayes Tree: An Algorithmic Foundation for Probabilistic Robot Mapping” ⇐ \quad\Leftarrow\quad 本篇


I. 前言

之前博客写到 SLAM 问题的因子图建模以及因子图计算中通过消元获得贝叶斯网络的过程. 这里我们继续跟着原作者的研究一起看看并记录一下.

Kaess 等人在论文 “The Bayes Tree: An Algorithmic Foundation for Probabilistic Robot Mapping”[1] 中提出了一种新型的数据结构 —— 贝叶斯树 (Bayes Tree).

本篇博文中,

- 先简单翻译原作者对贝叶斯树的介绍, 以了解该数据结构的特性;

- 然后应用实例介绍如何基于已获得的贝叶斯网络构建贝叶斯树.

作为基础的因子图、噪声模型等内容可参见关联博文, 此处不再重复.


II. 贝叶斯树的定义

1. 贝叶斯树的背景

原论文 Introduction 部分介绍了贝叶斯树引入的背景[1], 此处直接摘录并翻译.

Kaess 等人已提出了基于稀疏特性的平方根信息矩阵的增量更新算法 iSAM (Incremental Smoothing and Mapping). 该方法存在的问题是需要周期地批量计算变量重排序以及重线性化, 降低了计算效率及算法实时性.

概率推理视角下的图模型在 SLAM 中的应用已有一段时间, 也有一些较好的结果.

为了组合图模型以及稀疏线性代数的优点, 提出了一种新颖的数据结构 —— 贝叶斯树.

我们的方法建立在视矩阵分解为对因子图进行消元得到贝叶斯网络 (Bayes Net) 的过程. 其中贝叶斯网络等价于平方根信息矩阵 (Square Root Information Matrix) 的图模型.

在贝叶斯网络中执行边缘化和优化计算一般不容易. 然而, 由消元/分解等到的贝叶斯网络是弦的 (Chordal). 而弦的贝叶斯网络能够转换为树结构图模型. 在这种树结构图模型中就可以容易地执行边缘化和优化计算了.

最有名的树结构形式的数据结构是团树 (Clique Tree), 在 AI 文献中也称为联结树 (Junction Tree). 图树也已经在 SLAM (Simultaneous Localization and Mapping) 领域被研究探索过了.

然而, 我们提出的新的数据结构 —— 贝叶斯树, 是有向的也更自然地对应于 QR 分解所得的结果, 而且可以允许我们在该树中就条件概率密度进行分析. 我们进一步展示增量推理对应于贝叶斯树的简单编辑, 并进一步提出一种新颖的增量式变量排序策略.

弦的 (Chordal), 满足任意长度大于 3 的无向环都有一根弦


2. 贝叶斯树的特点

翻译原论文 Abstract 部分对贝叶斯树的特性描述[1]如下.

贝叶斯树提供了一种算法基础, 能够更好地理解存在的图模型推理算法及其关联的稀疏矩阵因子分解方法.

类似于团树, 贝叶斯树能够编码因式化分解的概率密度. 但又与团树不同, 贝叶斯树是有向的, 并更自然地映射 SLAM 问题的平方根信息矩阵.

贝叶斯树能够对 SLAM 问题提供三项洞察:

- 就概率密度而言, 贝叶斯树能对批量矩阵分解产生更好地理解.

- 能够将相对抽象的矩阵分解的更新过程转化为简单的贝叶斯树编辑及其条件密度.

- 应用贝叶斯树可获得一个针对稀疏非线性增量优化的新颖算法, 该算法将增量更新与约简变量集合的流畅再线性化融合以获得更高的计算效率, 同时融合了快速收敛到精准解的特性.


3. 贝叶斯树的定义

同样摘录翻译原论文中关于贝叶斯树的定义[1]如下.

通过因子图消元算法得到的贝叶斯网络是弦的. 这种贝叶斯网络可以转换为方便进行优化计算和边缘化计算的树结构图模型.

贝叶斯树是有向树, 它的节点代表对应的弦的贝叶斯网络中的 (Clique C k C_k Ck, 其中 k k k 为节点指标).

(Clique), 图中的完全子图, 每对不同顶点之间恰有一条边相连.

从这方面看, 贝叶斯树类似于团树. 但是贝叶斯树是有向的, 并且在编码因式分解的概率密度的方式上更接近于贝叶斯网络.

实际上, 我们在贝叶斯树的每个节点上定义条件概率密度
P ( F k ∣ S k ) (II-3-1) P(F_k | S_k) \tag{II-3-1} P(FkSk)(II-3-1)
其中, 分离子 (Separator) S k S_k Sk 是该节点代表的团 C k C_k Ck 和该节点的父团 (Parent Clique) Π k \Pi_k Πk 的交集, 即
S k ≜ C k ∩ Π k (II-3-2) S_k \triangleq C_k \cap \Pi_k \tag{II-3-2} SkCkΠk(II-3-2)
前端变量 (Frontal Variables) F k F_k Fk 为剩余变量, 即
F k ≜ C k \ S k (II-3-3) F_k \triangleq C_k \backslash S_k \tag{II-3-3} FkCk\Sk(II-3-3)
C k C_k Ck 可以写成
C k = F k : S k (II-3-4) C_k = F_k : S_k \tag{II-3-4} Ck=Fk:Sk(II-3-4)
这样就得出由贝叶斯树定义的关于全体状态变量 Θ \Theta Θ 的联合概率密度
P ( Θ ) = ∏ k P ( F k ∣ S k ) (II-3-5) P(\Theta) = \prod_k P(F_k | S_k) \tag{II-3-5} P(Θ)=kP(FkSk)(II-3-5)
需要说明, 对于根团 C r = F r C_r = F_r Cr=Fr, 其分离子为空, 即根团概率密度为一先验概率 P ( F r ) P(F_r) P(Fr).

基于以上贝叶斯树的定义, 团 C k C_k Ck 的分离子 S k S_k Sk 总是其父团 Π k \Pi_k Πk 的子集 (式 (II-3-2)). 因此贝叶斯树上有向边 (Direct Edges) 具有和贝叶斯网络一样的语义信息 —— 条件作用 (Conditioning).

以上的内容都是概念性的, 也比较抽象, 之前没有接触过的话, 会被绕得云里雾里的.

以上仅做铺垫, 下面我们进入具体内容:

如何将一个已经由因子图通过消元/边缘化获得的贝叶斯网络转化为可以实现增量式推理的贝叶斯树


III. 贝叶斯树的构建

1. 贝叶斯树的构建算法

        算法: 从由因子图消元得到的弦的贝叶斯网络构建产生贝叶斯树[1]

[1]   For (以消元顺序的逆序, 遍历贝叶斯网络中的每一个条件概率密度 P ( θ j ∣ S j ) P(\theta_j|S_j) P(θjSj)):

[2]        if (父集为空, 即 S j = { } S_j=\{\} Sj={}):

[3]                开始一个包含 θ j \theta_j θj 的新根团 F r F_r Fr

[4]        else:

[5]                识别父团 C p C_p Cp, 该父团需包含分离子 S j S_j Sj 中第一个被消元的变量, 作为父团的一个前端变量

[6]                if (父团 C p = F p ∪ S p C_p=F_p \cup S_p Cp=FpSp 等于条件概率中的分离子 S j S_j Sj):

[7]                          把条件概率插入父团 C p C_p Cp 中去

[8]                else:

[9]                          作为父团 C p C_p Cp 的子团, 开始一个包含变量 θ j \theta_j θj 的新子团 C ′ C' C


2. 贝叶斯树的构建实例

沿用之前博文中的因子图实例如下. 在高斯噪声模型下, 因子图描述的概率系统的最大后验估计, 经过负对数 ( − log ⁡ ( ⋅ ) -\log(\cdot) log()) 处理后, 可以得到非线性二乘问题的局部线性化 Jacobian 矩阵[2]. 这样因子图和 Jacobian 矩阵之间形成了映射.

因子图 (Factor Graph)雅可比矩阵 (Jacobian)
factor_graph_1jacobian-A-3

通过对因子图进行消元/边缘化后得到的贝叶斯网络如下. 因子图的消元过程又对应着最大后验估计负对数处理导出的非线性二乘问题的局部线性化系统的 QR 分解. 这个 QR 分解得到的矩阵 R \mathbf{R} R 就称为平方根信息矩阵. 因子图消元后对贝叶斯网络进行边缘化计算对应着计算 QR 分解后局部线性化系统的解[2]. 这样因子图消元得到的贝叶斯网络和平方根信息矩阵 R \mathbf{R} R 存在关联关系.

贝叶斯网络 (Bayes Net)平方根信息矩阵 (Square Root Information Matrix)
bayes_net_2square_root_information_matrix_R_4

因子图的消元顺序 l 1 → l 2 → x 1 → x 2 → x 3 l_1 \rightarrow l_2 \rightarrow x_1 \rightarrow x_2 \rightarrow x_3 l1l2x1x2x3.

得到了贝叶斯网络后, 如何通过贝叶斯树的构建算法一步一步的构建贝叶斯树呢?


3. 贝叶斯树的构建过程

下面我们按照贝叶斯树的构建算法一步一步分解执行.

步骤实现
确定消元顺序的逆 x 3 → x 2 → x 1 → l 2 → l 1 x_3 \rightarrow x_2 \rightarrow x_1 \rightarrow l_2 \rightarrow l_1 x3x2x1l2l1
处理 P ( x 3 ) P(x_3) P(x3)判断 “父集为空” 成立
开始一个新的根团 C r = F r = { x 3 } C_r=F_r = \{x_3\} Cr=Fr={x3}
(注意根团没有分离子)
处理 P ( x 2 ∣ x 3 ) P(x_2\vert x_3) P(x2x3)判断 “父集为空” 不成立
识别父团为 F r F_r Fr
满足分离子 S j = { x 3 } S_j = \{x_3\} Sj={x3} 中的第一个消除元素 x 3 x_3 x3 包含在父团的前端变量集合 F r F_r Fr
判断 “父团 F r F_r Fr 与条件概率中的分离子 S j S_j Sj 相等” 成立
把条件概率插入父团 F r F_r Fr 中去
父团变为 F r = { x 2 , x 3 } F_r=\{x_2, x_3\} Fr={x2,x3}
处理 P ( x 1 ∣ x 2 ) P(x_1 \vert x_2) P(x1x2)判断 “父集为空” 不成立
识别父团为 F r = { x 2 , x 3 } F_r=\{x_2,x_3\} Fr={x2,x3}
满足分离子 S j = { x 2 } S_j = \{x_2\} Sj={x2} 中的第一个消除元素 x 2 x_2 x2 包含在父团的前端变量集合 F r F_r Fr
判断 “父团 F r F_r Fr 与条件概率中的分离子 S j S_j Sj 相等” 不成立
因为 F r = { x 2 , x 3 } ‾ ≠ S j = { x 2 } ‾ \underline{F_r=\{x_2, x_3\}} \neq \underline{S_j=\{x_2\}} Fr={x2,x3}=Sj={x2}
开始新的团 C 1 ′ = { x 1 , x 2 } C'_1=\{x_1, x_2\} C1={x1,x2}, 作为 F r F_r Fr 的子团
新团的分离子 S 1 ′ = C 1 ′ ∩ C p = { x 1 , x 2 } ∩ { x 2 , x 3 } = { x 2 } S'_1= C'_1 \cap C_p = \{x_1, x_2\} \cap \{x_2, x_3\} = \{x_2\} S1=C1Cp={x1,x2}{x2,x3}={x2}
新团的前端变量集合 F 1 ′ = C 1 ′ \ S 1 ′ = { x 1 } F'_1 = C'_1 \backslash S'_1 = \{x_1\} F1=C1\S1={x1}
新团记为 C 1 ′ = { x 1 } : { x 2 } C'_1 = \{x_1\} : \{x_2\} C1={x1}:{x2}
处理 P ( l 2 ∣ x 3 ) P(l_2 \vert x_3) P(l2x3)判断 “父集为空” 不成立
识别父团为 F r = { x 2 , x 3 } F_r=\{x_2,x_3\} Fr={x2,x3}
满足分离子 S j = { x 3 } S_j = \{x_3\} Sj={x3} 中的第一个消除元素 x 3 x_3 x3 包含在父团的前端变量集合 F r F_r Fr
判断 “父团 F r F_r Fr 与条件概率中的分离子 S j S_j Sj 相等” 不成立
因为 F r = { x 2 , x 3 } ‾ ≠ S j = { x 3 } ‾ \underline{F_r=\{x_2, x_3\}} \neq \underline{S_j=\{x_3\}} Fr={x2,x3}=Sj={x3}
开始新的团 C 2 ′ = { l 2 , x 3 } C'_2=\{l_2, x_3\} C2={l2,x3}, 作为 F r F_r Fr 的子团
新团的分离子 S 2 ′ = C 2 ′ ∩ C p = { l 2 , x 3 } ∩ { x 2 , x 3 } = { x 3 } S'_2= C'_2 \cap C_p = \{l_2, x_3\} \cap \{x_2, x_3\} = \{x_3\} S2=C2Cp={l2,x3}{x2,x3}={x3}
新团的前端变量集合 F 2 ′ = C 2 ′ \ S 2 ′ = { l 2 } F'_2 = C'_2 \backslash S'_2 = \{l_2\} F2=C2\S2={l2}
新团记为 C 2 ′ = { l 2 } : { x 3 } C'_2 = \{l_2\} : \{x_3\} C2={l2}:{x3}
处理 P ( l 1 ∣ x 1 , x 2 ) P(l_1 \vert x_1, x_2) P(l1x1,x2)判断 “父集为空” 不成立
分离子 S j = { x 1 , x 2 } S_j = \{x_1, x_2\} Sj={x1,x2} 中的第一个消除元素为 x 1 x_1 x1
前端变量集合包含 x 1 x_1 x1 的团为 C 1 ′ = { x 1 } : { x 2 } C'_1 = \{x_1\} : \{x_2\} C1={x1}:{x2}
故识别到父团为 C 1 ′ = { x 1 } : { x 2 } C'_1 = \{x_1\} : \{x_2\} C1={x1}:{x2}
判断 “父团 C 1 ′ = { x 1 , x 2 } C'_1=\{x_1, x_2\} C1={x1,x2} 与条件概率中的分离子 S j = { x 1 , x 2 } S_j=\{x_1, x_2\} Sj={x1,x2} 相等” 成立
把条件概率插入父团 C 1 ′ C'_1 C1 中去
父团变为 C 1 ′ = { l 1 , x 1 , x 2 } C'_1=\{l_1, x_1, x_2\} C1={l1,x1,x2}
更新分离子 S 1 ′ = C 1 ′ ∩ F r = { l 1 , x 1 , x 2 } ∩ { x 2 , x 3 } = { x 2 } S'_1= C'_1 \cap F_r = \{l_1, x_1, x_2\} \cap \{x_2, x_3\} = \{x_2\} S1=C1Fr={l1,x1,x2}{x2,x3}={x2}
更新前端变量集合 F 1 ′ = C 1 ′ \ S 1 ′ = { l 1 , x 1 } F'_1 = C'_1 \backslash S'_1 = \{l_1, x_1\} F1=C1\S1={l1,x1}
该团记为 C 1 ′ = { l 1 , x 1 } : { x 2 } C'_1 = \{l_1,x_1\} : \{x_2\} C1={l1,x1}:{x2}

得到根团 F r = x 2 , x 3 F_r={x_2, x_3} Fr=x2,x3, 子团 C 1 ′ = { l 1 , x 1 } : { x 2 } C'_1=\{l_1, x_1\}:\{x_2\} C1={l1,x1}:{x2} 和子团 C 2 ′ = { l 2 } : { x 3 } C'_2=\{l_2\}:\{x_3\} C2={l2}:{x3}, 很自然地贝叶斯树就可以画出来了.

贝叶斯树 (Bayes Tree)
bayes_tree_1
{ x 2 , x 3 } \{x_2, x_3\} {x2,x3} 定义了概率密度 P ( x 2 , x 3 ) P(x_2, x_3) P(x2,x3)
{ l 1 , x 1 } : { x 2 } \{l_1, x_1\}:\{x_2\} {l1,x1}:{x2} 定义了条件概率密度 P ( l 1 , x 1 ∣ x 2 ) P(l_1, x_1 \vert x_2) P(l1,x1x2)
{ l 2 } : { x 3 } \{l_2\}:\{x_3\} {l2}:{x3} 定义了条件概率密度 P ( l 2 ∣ x 3 ) P(l_2 \vert x_3) P(l2x3)
{ l 1 , x 1 } : { x 2 } \{l_1, x_1\}:\{x_2\} {l1,x1}:{x2} 与团 { l 2 } : { x 3 } \{l_2\}:\{x_3\} {l2}:{x3} 之间的相对独立

比较分析贝叶斯树与平方根信息矩阵, 可以发现贝叶斯树以图形的形式较好地刻画/映射了平方更信息矩阵的结构信息.

平方根信息矩阵 (Square Root Information Matrix)
square_root_information_matrix_colored
矩阵中同一颜色的行代表在贝叶斯树中处于同一团
矩阵中不同颜色的行代表在贝叶斯树中处于不同的团
虚线框则与分离子有关
根团始终在矩阵的最底行

这样本实例的贝叶斯树就构建完毕了.


IV. 总结

本篇博文根据参考文献,

对贝叶斯树这一为 SLAM 因子图处理而引入的新数据结构进行了介绍,

然后介绍了由贝叶斯网络建立贝叶斯树的算法, 并用实例进行了演示模拟.

图模型 (因子图、贝叶斯网络、贝叶斯树等) 与数值模型 (最大后验概率、最小二乘法、Jacobian 矩阵、平方根信息矩阵等) 相互关联与印证中, 可以发现好多值得细细品味的地方, 赞叹一步一步把这些框架搭起来的前赴后继的研究人员的创造力!

预告一下, 后面将介绍基于贝叶斯树的增量更新, 来体验贝叶斯树的功效.


参考文献

[1] Kaess, M., Ila, V., Roberts, R., Dellaert, F. (2010). The Bayes Tree: An Algorithmic Foundation for Probabilistic Robot Mapping. In: Hsu, D., Isler, V., Latombe, JC., Lin, M.C. (eds) Algorithmic Foundations of Robotics IX. Springer Tracts in Advanced Robotics, vol 68. Springer, Berlin, Heidelberg

[2] Frank Dellaert, Michael Kaess, Factor Graphs for Robot Perception, Foundations and Trends in Robotics, Vol. 6, No. 1-2 (2017) 1–139

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTP-API开发系列之接口对接准备

CTP-API开发系列之接口对接准备 CTP-API开发系列之接口对接准备CTP-API文件清单CTP-API通用规则命名规则Spi与Api CTP-API通讯模式开发语言选择 CTP-API开发系列之接口对接准备 CTP-API文件清单 文件名说明ThostFtdcTraderApi.h交易接口,C头文件,包括 …

紧跟潮流,再整一个短剧搜索网站

前面一大批的转存量太大了,有些小伙伴用不上,所以整了个搜索网站,输入关键词搜索即可。 搜短剧 http://wjsyyx.top/sdj/ 界面依旧主打朴实无华,搜索一步到位。 ▼ 网站界面 ▼ 搜索结果 剩下的就都会了。 ▼ 往期推荐 【Python】…

Ubuntu 安装谷歌拼音输入法

一、Fcitx 安装 在Ubuntu 下,谷歌拼音输入法是基于Fcitx输入法的。所以,首先需要安装Fcitx。一般来说,Ubuntu最新版中都默认安装了Fcitx,但是为了确保一下,我们可以在系统终端中运行如下命令: sudo apt ins…

【WPS】Excel查重数据对比

数据对比 数据对比标记重复数据查询过滤处理

使用pyannote-audio实现声纹分割聚类

使用pyannote-audio实现声纹分割聚类 # GitHub地址 https://github.com/MasonYyp/audio1 简单介绍 pyannote.audio是用Python编写的用于声纹分割聚类的开源工具包。在PyTorch机器学习基础上,不仅可以借助性能优越的预训练模型和管道实现声纹分割聚类,还…

你知道katalon studio 如何完成 get/post 请求发送吗?

katalon studio作为目前最火的自动化测试工具之一,不仅仅只能完成webUI自动化,更是能完成api、app以及桌面应用程序的自动化测试。 本文将讲解一下katalon studio是如果完成接口测试的。 请求发送 get请求 1、先在object repository里new一个请求 2、…

惯性导航 | 航迹推算与gazebo仿真

惯性导航 | 航迹推算与gazebo仿真 IMU数据进行短时间航迹推算代码gazebo中进行仿真测试 IMU数据进行短时间航迹推算 代码 声明一个用与 IMU积分的类 ,来实现 短时间内的航迹推算 类的名字叫 IMUIntegration 构造函数 有三个变量进行私有变量初始化 重力、初始陀螺…

Python调用edge-tts实现在线文字转语音

edge-tts是一个 Python 模块,允许通过Python代码或命令的方式使用 Microsoft Edge 的在线文本转语音服务。 项目源码 GitHub - rany2/edge-tts: Use Microsoft Edges online text-to-speech service from Python WITHOUT needing Microsoft Edge or Windows or an…

Docker_设置docker服务以及容器开机自启

本文目录 docker服务开机自启动查询docker服务开机自启动状态将docker服务设置为开机自启动取消docker服务开机自启动 容器开机自启动修改docker容器为自启动容器启动时设置自启动-docker版容器启动时设置自启动-docker-compose版 docker服务开机自启动 查询docker服务开机自启…

33岁大马女星赴港打拼十年终夺「最佳女配」。

近两年有多位「大马女神」在香港走红,最火的莫过于甜美可人、样靓身材正的林明祯,不仅在电影圈有好成绩,还成了广告界的宠儿。 不过说到演技最精湛的「大马女神」,就不得不提近年在香港电影圈炙手可热的廖子妤,前年她凭…

C++_布隆过滤器

目录 1、布隆过滤器的用法 2、布隆过滤器的查找 3、布隆过滤器的删除 4、布隆过滤器的实现 结语 前言: 布隆过滤器是一种概率型数据结构,采用的是哈希思想,他在位图的原有基础上做了升级,因为位图处理不了数据为字符串的情…

安全增强型 Linux

书接上篇 一查看selinux状态 SELinux的状态: enforcing:强制,每个受限的进程都必然受限 permissive:允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志 disabled:禁用 相关命令…

springboot集成logback打印彩色日志

一、logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站: logback.qos.ch。它当前分为以下三个模块: logback-core:其它两个模块的基础模块。logback-classic:它是log4j的一个改良版本,同时它完整实…

板级PDN(电源分配网络)设计要点综述

目录 目标阻抗去耦方法 确定目标阻抗 确定目标频点 VRM 去耦电容 安装电感 平面电容 总结 去耦电容 PCB叠层设计 扩展阅读 目标阻抗去耦方法 确定PCB去耦方案的策略是使用频域目标阻抗法,通过层间电容和分立电容器组合的使用,保证电源轨阻抗在…

TypeScript学习笔记(上):TypeScript的介绍、安装及常用类型

我对TypeScript的理解就是,TypeScript是增加了类型校验的JavaScript,能够把运行期错误提升至编译期 TypeScript是什么? TypeScript(简称:TS)是 JavaScript 的超集(JS 有的 TS 都有&#xff09…

【LeetCode】升级打怪之路 Day 15:二叉树解题的思维模式 —— 遍历、分解问题

今日题目: 226. 翻转二叉树101. 对称二叉树114. 二叉树展开为链表 目录 LC 226. 翻转二叉树 【easy】LC 101. 对称二叉树 ⭐⭐⭐LC 114. 二叉树展开为链表 ⭐⭐⭐ 今天的题目主要是对二叉树递归遍历的应用,东哥带你刷二叉树(思路篇&#xff0…

谈谈伦敦金操作策略中如何加码

在伦敦金操作策略中应该涉及加码的问题,什么叫加码呢?加码是指一笔伦敦金交易盈利以后,在市场中再注入资金进行加仓。在有利于自己的情况下,我们仓位越重,累积的盈利越多。而且这是在已经盈利的基础上加码,…

Java 学习和实践笔记(28):equals方法的使用

equals() 是Object类里的一个方法。而Object类是所有类的父类,所有的Java对象都拥有Object类的属性和方法。一切类,如果在类的声明中未使用extends,则默认继承Object类。如果声明了,那么Object类就变成该类的父类的父类的...类&am…

python+django高校澡堂洗浴浴室预约签到管理系统8d8c

本系统在设计过程中,高校洗浴管理系统的出现就有很大的需求。该系统可以很好地解决这些麻烦和问题。 很好地发挥了该开发方式的优势,让实现代码有了良好的可读性,而且使代码的更新和维护更加的方便,操作简单,对以后的维…

带你详细理解数组与指针(包含二维数组)

作者博客主页:谦逊码农的旅程 1. sizeof中单独放一个数组名,此时的数组名表示整个数组。 2. &数组名,表示整个数组的地址。 3. 在 C 语言中,变量的地址通常是由一个指针来表示,而指针的大小取决于计算机架构和操…