From 80c5a9b73af70fe4f261b2756ae63621478854b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20N=C3=B8rgaard?= Date: Wed, 18 Mar 2026 19:13:50 +0100 Subject: [PATCH 1/2] fix(diff): correct overlap detection and bounds in linear space Myers This commit resolves two critical pathfinding bugs in the linear space Myers algorithm (`findMiddleSnake`) that caused it to produce suboptimal diffs or silently fail to explore valid search spaces. 1. Fix forward search overlap detection: During the forward search overlap check (when `delta` is odd), the algorithm incorrectly checked the reverse vector `vr` at `offset + (delta - k)`. However, the reverse search already maps its furthest-reaching `x` bounds to the same forward diagonal `k`. Checking the wrong index caused the algorithm to miss the true optimal middle snake, leading to longer, suboptimal edit scripts. This is fixed by correctly checking `reverseIdx := offset + k`. 2. Fix vector sizing and offset for negative delta: When sequence A is shorter than sequence B (`delta < 0`), the forward-diagonal `k` in the reverse search can reach down to `-maxDiff + delta`. Because `offset` was previously only adjusted for positive `delta`, calculating `offset + k` would result in negative indices. This caused the reverse search to silently trigger bounds checks and skip exploring half of its required search grid. The `vectorSize` and `offset` are now correctly adjusted when `delta < 0` to accommodate the full bounds. --- diff/myers/myers.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/diff/myers/myers.go b/diff/myers/myers.go index ca13881..72a1916 100644 --- a/diff/myers/myers.go +++ b/diff/myers/myers.go @@ -339,11 +339,13 @@ func findMiddleSnake(a, b []string, aStart, aEnd, bStart, bEnd int) snake { //re // vr: Reverse search (from bottom-right) // Size needs to accommodate k ranging from -maxDiff to +maxDiff. vectorSize := 2*maxDiff + 1 + offset := maxDiff if delta > 0 { vectorSize += delta // Ensure space for reverse search diagonals + } else if delta < 0 { + vectorSize -= delta + offset -= delta } - // offset: Used to map diagonal k (which can be negative) to non-negative array indices. - offset := maxDiff vf := make([]int, vectorSize) vr := make([]int, vectorSize) // Stores relative x-coordinates within the n x m grid @@ -448,7 +450,7 @@ func findMiddleSnake(a, b []string, aStart, aEnd, bStart, bEnd int) snake { //re // Overlap Check // Overlap check if delta%2 != 0 && k >= delta-(d-1) && k <= delta+(d-1) { - reverseIdx := offset + (delta - k) + reverseIdx := offset + k if reverseIdx >= 0 && reverseIdx < vectorSize { reverseX := vr[reverseIdx] if reverseX >= 0 && x >= reverseX { From c5b4151d96647099cbe4dd6cadb10a9c1add04be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kim=20N=C3=B8rgaard?= Date: Wed, 18 Mar 2026 18:22:44 +0000 Subject: [PATCH 2/2] chore: add comments Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- diff/myers/myers.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/diff/myers/myers.go b/diff/myers/myers.go index 72a1916..fa12c60 100644 --- a/diff/myers/myers.go +++ b/diff/myers/myers.go @@ -343,8 +343,8 @@ func findMiddleSnake(a, b []string, aStart, aEnd, bStart, bEnd int) snake { //re if delta > 0 { vectorSize += delta // Ensure space for reverse search diagonals } else if delta < 0 { - vectorSize -= delta - offset -= delta + vectorSize -= delta // delta is negative, so this increases the size + offset -= delta // delta is negative, so this increases the offset } vf := make([]int, vectorSize)