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

如何高效用slice.windows(2)实现旅行商路径的首尾闭环迭代?

优化TSP旅行距离计算的Rust实现

问题分析

原实现通过拼接原切片和首个元素的切片来生成闭环窗口,这会额外分配内存并复制元素,当解的规模较大时效率损耗明显。我们需要一种无需额外内存分配的方式,利用slice.windows(2)完成闭环遍历。

优化方案1:拆分计算(直观高效)

直接遍历原切片的相邻元素窗口,最后单独加上从最后一个元素返回第一个元素的距离,完全避免额外内存分配:

fn calculate_solution_distance(solution: &[usize], distance_matrix: &[Vec<i32>]) -> i32 {
    // 处理边界情况:空列表或单个元素无需移动
    if solution.len() <= 1 {
        return 0;
    }

    // 累加相邻节点的距离
    let adjacent_total: i32 = solution.windows(2)
        .map(|indices| distance_matrix[indices[0]][indices[1]])
        .sum();

    // 加上最后一个节点返回起点的距离
    adjacent_total + distance_matrix[solution.last().unwrap()][solution[0]]
}

优化方案2:函数式迭代器链(保持风格)

如果想保持纯函数式风格,可以用chain把最后一段距离的迭代器和前面的窗口迭代器连接起来:

fn calculate_solution_distance(solution: &[usize], distance_matrix: &[Vec<i32>]) -> i32 {
    if solution.len() <= 1 {
        return 0;
    }

    solution.windows(2)
        .map(|indices| distance_matrix[indices[0]][indices[1]])
        // 连接最后一个节点到起点的距离迭代器
        .chain(std::iter::once(distance_matrix[solution.last().unwrap()][solution[0]]))
        .sum()
}

优化点说明

  • 避免内存分配:两种方案都不需要创建新的切片/向量,直接复用原切片的内存,windows(2)是零成本迭代器,仅遍历原数据。
  • 参数改为引用:将Vec<usize>和Vec<Vec<i32>>改为引用类型,避免不必要的所有权转移和数据复制,进一步提升效率。
  • 边界处理:增加了空列表和单个元素的情况,保证函数鲁棒性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 22:12:29