公司动态

动态规划与图算法,代码评审该盯住哪些细节

📅 2026/8/19 15:27:01
动态规划与图算法,代码评审该盯住哪些细节
动态规划与图算法代码评审该盯住哪些细节算法题通常假设输入合法、规模有限。服务端代码不能依赖这些前提请求可能为空图可能有环权重可能不符合算法要求数据规模也可能超过内存预算。评审时先核对前提再谈优化。常见误区场景必须确认的前提0-1 背包滚动数组转移确实只依赖上一行且容量非负完全背包不能倒序复用同一逻辑DFS图规模是否允许递归是否需要显式栈、visited和取消检查拓扑排序结果数量是否等于节点数否则应报告环而非静默返回部分结果Dijkstra边权必须非负有负权边需换用 Bellman-Ford 等适用算法“二维 DP 一定要降到一维”也不对。如果要还原路径或状态依赖多个历史维度保留二维表可能更清楚。正确做法是根据最大输入、内存预算和恢复需求选择表示。带环检测的拓扑排序var ErrCycle errors.New(dependency graph contains a cycle) func TopologicalOrder(n int, edges [][2]int) ([]int, error) { if n 0 { return nil, errors.New(negative node count) } degree, graph : make([]int, n), make([][]int, n) for _, edge : range edges { from, to : edge[0], edge[1] if from 0 || from n || to 0 || to n { return nil, errors.New(node index out of range) } graph[from] append(graph[from], to) degree[to] } queue, order : make([]int, 0, n), make([]int, 0, n) for i : range degree { if degree[i] 0 { queue append(queue, i) } } for len(queue) 0 { node : queue[0]; queue queue[1:] order append(order, node) for _, next : range graph[node] { degree[next]-- if degree[next] 0 { queue append(queue, next) } } } if len(order) ! n { return nil, ErrCycle } return order, nil }测试至少包含空图、孤立节点、自环、多节点环、重复边和越界边。若算法运行在请求路径上还要限制输入规模并在上层使用context或作业超时避免最坏输入长期占用计算资源。