MoonBit 图算法库 - 完整的图数据结构和算法实现
Dependencies
你在 MoonBit 里要做图算法? BFS 遍历、Dijkstra 最短路径、社区检测、网络流……如果每次都要自己从零实现,太浪费时间了。mbtgraph 让你一行代码拿到生产级结果。
moon add morning-start/mbtgraph// 1. 创建图 → 2. 跑算法 → 3. 拿结果
fn main {
let g = @storage.new_directed()
let n0 = @core.GraphWritable::add_node(g, 0.0)
let n1 = @core.GraphWritable::add_node(g, 1.0)
let n2 = @core.GraphWritable::add_node(g, 2.0)
let n3 = @core.GraphWritable::add_node(g, 3.0)
@core.GraphWritable::add_edge(g, n0, n1, 1.0) |> ignore
@core.GraphWritable::add_edge(g, n1, n2, 2.0) |> ignore
@core.GraphWritable::add_edge(g, n0, n2, 4.0) |> ignore
@core.GraphWritable::add_edge(g, n2, n3, 1.0) |> ignore
// BFS 遍历
let bfs_result = @traversal.bfs(g, n0)
println("BFS 0 → 3 最短跳数: \{bfs_result.distance(n3)}") // => 2
// Dijkstra 最短路径
let sp_result = @shortest_path.dijkstra(g, n0)
println("Dijkstra 0 → 3 最短距离(带权): \{sp_result.distance_to(n3)}") // => 3.0
}更多完整示例见 *_test.mbt或文档站点 → 教程。
| 你在做什么 | 用 mbtgraph 怎么做 | 省了什么 |
|---|---|---|
| 社交网络分析 → 找关键人物 | betweenness_centrality(g) | 手写 Brandes 算法 50+ 行 |
| 路径规划 → 最短路径 | dijkstra(g, src) | 手写堆优化 Dijkstra 80+ 行 |
| 推荐系统 → 社区发现 | louvain(g, resolution) | 手写模块度优化 200+ 行 |
| 依赖分析 → 拓扑排序 | topological_sort(g) | 手写 Kahn 算法 30+ 行 |
| 网络流 → 最大流量 | dinic(net, s, t) | 手写 Dinic 150+ 行 |
| 图可视化 → 导出 DOT | write_dot(g, "graph.dot") | 手写 DOT 序列化 40+ 行 |
| 维度 | 自己从零写 | 用 mbtgraph |
|---|---|---|
| 时间成本 | 每个算法 30-200 行 + debug | 一行函数调用 |
| 测试覆盖 | 你自己写几个 case | 772 个测试(黑盒 + 白盒 + NetworkX 交叉验证) |
| 存储选型 | 写死一种结构,换场景重写 | 8 种存储切换,只需改一行构造函数 |
| 跨存储兼容 | 不存在,换存储要重写算法 | 5 层 Trait 隔离,算法与存储完全解耦 |
| 性能保证 | 可能 O(n²) 而不自知 | 经过基准测试的工业实现 |
| bug 风险 | 你的算法只有你知道 | 772 测试 + CI 门禁 |
| 维度 | mgraph | graphviz | mbtgraph |
|---|---|---|---|
| 定位 | 轻量遍历 | Graphviz 封装 | 完整算法库 |
| 算法数 | 2 | 0 | 65+ |
| 存储种类 | 0 | 1 | 8 |
| Trait 层数 | 1 | 0 | 5 |
| 测试 | ~10 | fixture parity | 772 |
| 特性 | mbtgraph | NetworkX | petgraph | JGraphT |
|---|---|---|---|---|
| 语言 | MoonBit ⭐ | Python | Rust | Java |
| 多后端 | native+wasm+js ⭐ | Python only | Native | JVM only |
| Trait 层数 | 5 ⭐ | 3 | 3 | 4 |
| 存储种类 | 8 ⭐ | 4 | 5 | 6 |
| wasm 体积 | 53 KB(gzip 23 KB) | N/A | ~2MB | >50MB |
| 纯函数语义 | ✅ | ❌ | 部分 | ❌ |
| 你的场景 | 用这个存储 | 一句话理由 |
|---|---|---|
| 80% 的通用有向图 | DirectedAdjList ⭐ | 默认选它,不出错 |
| 无向图(好友关系等) | UndirectedAdjList | 省一半内存 |
| 小图(<1000节点) | DirectedMatrix | O(1) 查边,写起来最快 |
| Kruskal 最小生成树 | UndirectedEdgeListGraph | 边已排序,拿来就用 |
| 10万+ 节点大图 | CSRGraph | 缓存友好,内存紧凑 |
选型原则: 不知道选什么 → DirectedAdjList。有特殊需求 → 看存储选型指南。
moon test # 全量 772 测试,秒级通过
moon test lib/algo/flow # 只跑网络流模块| 版本 | 重点 | 状态 |
|---|---|---|
| v0.1.0 | 65+ 核心算法完成 | ✅ |
| v0.1.1 | 18 个模块补齐 + 文档站点上线 | ✅ |
| v0.1.2 | 用户体验改进 + 文档完善 | ✅ |
| v0.1.3 ← 当前 | 性能基线采集 + 文档改进 | ✅ |
| v0.2.0 | 高级图算法 + 大规模优化 | ⬜ 规划中 |
MoonBit 图算法库 - 完整的图数据结构和算法实现
Dependencies