图论基础:图的基本概念与表示方法
各位同学,今天我们来聊聊图论基础。说实话,图论这东西,我刚开始接触金融网络时也觉得挺抽象的。但后来发现,你想想看,金融系统本质上就是一个巨大的关系网——谁借了谁的钱,谁持有了谁的股份,这些不都是「边」和「节点」吗?
图的基本概念
先说说最基础的东西。图由两部分组成:节点和边。
- 节点(Vertex):也叫顶点。在金融网络里,节点可以是银行、企业、个人,甚至是一个交易账户。我个人习惯用 V 表示节点集合。
- 边(Edge):连接两个节点的线。表示关系。比如 A 银行向 B 银行拆借了资金,那就是一条边。
- 度(Degree):一个节点连接的边的数量。嗯,这里要注意:在有向图里,度还分「入度」和「出度」。
核心公式:一个图 G 可以表示为 G = (V, E),其中 V 是节点集合,E 是边集合。
我在项目中遇到过一件事:有次分析银行间拆借网络,发现某个节点的度特别高。一开始以为是系统重要性银行,后来一查,原来是数据录入错误,把几十笔交易都挂到了同一个节点上。所以啊,度这个指标虽然简单,但数据质量不过关,再好的模型也是白搭。
图的类型
图不是只有一种。根据边的性质,我们通常分三类:
无向图
边没有方向。比如两家公司互相持股,这种关系是对等的。说白了,就是 A 和 B 之间有边,那 B 和 A 之间也有同一条边。
有向图
边有方向。比如 A 向 B 贷款,那箭头就是从 A 指向 B。这在金融网络里特别常见——资金流向、股权控制,都是有方向的。
加权图
边上有权重。比如贷款金额、持股比例。权重可以表示关系的「强度」或「大小」。
| 类型 | 特点 | 金融场景举例 |
|---|---|---|
| 无向图 | 边无方向 | 两家公司互相担保 |
| 有向图 | 边有方向 | A 向 B 放贷 |
| 加权图 | 边带权重 | 贷款金额 1000 万 |
我的经验:实际金融网络几乎都是加权有向图。别被教科书上的无向图例子带偏了。你想想看,哪笔钱是「互相」借的?
图的表示方法
图在计算机里怎么存?主要有两种方式。
邻接矩阵
用一个 N×N 的矩阵来表示。N 是节点数。如果节点 i 和节点 j 之间有边,那矩阵的 (i, j) 位置就是 1(或者权重值)。
# 一个简单的邻接矩阵示例
# 3个节点,边:0→1, 1→2, 2→0
adj_matrix = [
[0, 1, 0],
[0, 0, 1],
[1, 0, 0]
]
邻接矩阵的好处是直观,查边快。但缺点也很明显——如果图很稀疏(节点多、边少),那矩阵里全是 0,浪费内存。我曾经处理过一个 10 万节点的金融网络,用邻接矩阵直接内存爆了。嗯,那时候我才意识到,选对表示方法有多重要。
邻接表
每个节点维护一个列表,存它连接到的所有邻居节点。这样只存有边的信息,省空间。
# 同样的图,用邻接表表示
adj_list = {
0: [1],
1: [2],
2: [0]
}
避坑指南:我曾经在项目里用邻接矩阵存一个 5 万节点的图,结果程序跑了一小时还没加载完。后来换成邻接表,几秒钟就搞定了。所以,如果你的图边数远小于 N²,果断用邻接表。
知识体系总览
下面这张图,把本章的核心内容串起来了。你可以看到,从基本概念出发,我们分出了图的类型和表示方法,而这两者又相互关联。
你看,从中心向外发散,三个分支构成了图论的基础骨架。我个人建议,初学者先把「基本概念」吃透,再去看类型和表示方法。别一上来就搞邻接矩阵的优化,那是后面的事。
一句话总结:图就是节点和边的集合。金融网络里,节点是实体,边是关系。怎么存?看你的图有多稀疏。