BambuStudio学习笔记:MinimumSpanningTree

# MinimumSpanningTree 类说明

## 头文件
`MinimumSpanningTree.h`

## 概述
基于Prim算法实现的最小生成树(MST)计算工具,用于处理点集的网络结构优化。适用于路径规划、3D打印支撑结构生成等需要最小连接成本的场景。

## 类结构

```cpp
class MinimumSpanningTree {
    struct Edge { Point start, end; }; // 边定义
public:
    // 构造方法
    MinimumSpanningTree() = default;
    explicit MinimumSpanningTree(std::vector<Point> vertices);
    
    // 核心方法
    std::vector<Point> adjacent_nodes(Point node) const; // 相邻节点查询
    std::vector<Point> leaves() const;                   // 叶子节点获取
    std::vector<Point> vertices() const;                 // 全体顶点获取

private:
    using AdjacencyGraph_t = std::unordered_map<Point, std::vector<Edge>, PointHash>;
    AdjacencyGraph_t adjacency_graph; // 邻接表存储结构
    AdjacencyGraph_t prim(std::vector<Point> vertices) const; // Prim算法实现
};

核心方法详解

构造函数

方法签名说明
explicit MinimumSpanningTree(std::vector<Point>)输入点集自动构建MST

注意要点

  • 输入点集会隐式去重(依赖PointHash实现)
  • 自动计算完全图的欧氏距离作为边权重

节点查询方法

方法时间复杂度返回内容
adjacent_nodes(Point)O(1)目标节点的所有直接连接节点
leaves()O(n)度数为1的末端节点集合
vertices()O(1)参与MST计算的所有顶点

算法实现特点

  • Prim算法优化
    • 使用邻接矩阵存储完全图边权重
    • 优先队列维护候选边集合
    • 动态标记已访问节点
  • 空间复杂度:O(n²)(存储所有点对的欧氏距离)
  • 时间复杂度:O(n²)(适合n<10^4的点集)

数据结构

邻接表结构

std::unordered_map<Point, std::vector<Edge>, PointHash>
  • :节点坐标(需确保PointHash正确实现坐标哈希)
  • :该节点连接的所有边(至少1条,最多n-1条)

边结构体

struct Edge {
    Point start; // 边起点(坐标系原点方向)
    Point end;   // 边终点(坐标系远端方向)
}

注意:边的方向不影响连接关系判断

使用示例

// 创建点集(实际应用需去重)
std::vector<Point> points = { {0,0}, {2,2}, {3,1}, {5,4} };

// 构建MST
MinimumSpanningTree mst(points);

// 查询节点连接
Point query{2,2};
auto neighbors = mst.adjacent_nodes(query); // 可能返回 {0,0}, {3,1}

// 获取拓扑特征
auto leaf_nodes = mst.leaves(); // 可能包含 {5,4}, {0,0}
auto all_vertices = mst.vertices(); // 原始点集的子集

应用场景

  1. 3D打印支撑优化:计算模型表面支撑点的最优连接网络
  2. 物流路径规划:确定仓库间的最经济运输路线
  3. 电路板布线:寻找元件引脚的最短连接方案
  4. 点云处理:建立扫描数据点之间的拓扑关系

性能建议

预处理点集:输入前进行坐标去重和栅格化处理
规模控制:万级以下点集适用,更大规模考虑Kruskal算法
哈希优化:确保PointHash实现高效(如坐标位交错哈希)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值