You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在T-SQL中高效生成站点间距离字符串矩阵(供Python脚本使用)

高效生成站点距离矩阵的Python实现

针对你处理600+站点时用fast_forward游标无法得到结果的问题,我推荐用本地哈希映射+批量构建的方案,这个方法能把时间复杂度控制在可控范围,而且完全规避数据库游标的IO瓶颈。

核心思路

  1. 先把所有站点距离数据加载到本地,用一个双向字典存储两两站点的距离(因为A→B和B→A距离相同),这样查询距离的时间复杂度是O(1)。
  2. 提取所有唯一站点并排序,保证矩阵的行列顺序一致。
  3. 批量生成矩阵的表头和每一行,用字符串拼接的方式快速构建最终结果。

代码实现

def build_distance_matrix(distance_records):
    # 构建双向距离字典,O(m)时间,m是记录数
    distance_map = {}
    for record in distance_records:
        src, dst, dist = record.split('|')
        dist = int(dist)
        # 初始化站点的映射表
        if src not in distance_map:
            distance_map[src] = {}
        if dst not in distance_map:
            distance_map[dst] = {}
        # 双向存储距离
        distance_map[src][dst] = dist
        distance_map[dst][src] = dist
    
    # 提取所有站点并排序,保证行列顺序一致
    stations = sorted(distance_map.keys())
    
    # 生成表头行
    header = '|'.join(stations)
    
    # 生成每一行数据,用生成器表达式提升内存效率
    rows = (
        f"{src}|{'|'.join(['0' if src == dst else str(distance_map[src][dst]) for dst in stations])}"
        for src in stations
    )
    
    # 组合表头和所有行,返回最终矩阵字符串
    return '\n'.join([header] + list(rows))

# 测试示例
sample_records = [
    'A|B|5', 'A|C|3', 'A|D|9',
    'B|C|7', 'B|D|2', 'C|D|6'
]
matrix = build_distance_matrix(sample_records)
print(matrix)

为什么这个方法更快?

  • 规避数据库游标瓶颈:如果你的fast_forward游标是从数据库逐行拉取数据,那网络/磁盘IO会成为600+站点场景的最大瓶颈。把所有数据一次性加载到本地处理,能完全消除这部分开销。
  • O(1)距离查询:用字典存储距离,比任何线性查找的效率都高,生成矩阵时的查询操作几乎没有耗时。
  • 内存高效:整个过程用生成器表达式逐行构建结果,不需要一次性把所有行都加载到内存,600个站点的场景下内存占用极低。

扩展处理

如果存在站点之间没有距离记录的情况,可以在查询时添加默认值,比如把生成行的逻辑改成:

rows = (
    f"{src}|{'|'.join(['0' if src == dst else str(distance_map[src].get(dst, 'NA')) for dst in stations])}"
    for src in stations
)

内容的提问来源于stack exchange,提问作者Dejan Dozet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:42:42