算法笔记 (2) - git diff 是如何实现的？

你是否好奇过 git diff 是如何高效地比较文件并精确显示变化的？这个看似简单的操作背后，隐藏着相当精妙的算法设计。 假设有两个文件 \(A\) 和 \(B\)，它们分别有 \(N=7\) 行和 \(M=6\) 行： A B === === A C B B C A A B B A B C A 我们可以将这个比较问题抽象为在一个 \(N \times M\) 网格中寻找路径： 从任意坐标 \((x, y)\) 出发，我们有三种可能的移动方式： 向右移动 到 \((x+1, y)\) — 表示删除第一个文件的第 \(x+1\) 行 向下移动 到 \((x, y+1)\) — 表示添加第二个文件的第 \(y+1\) 行 对角线移动 到 \((x+1, y+1)\) — 表示两个文件的对应行内容相同（无需编辑） 对角线移动在 diff…