您的问题很有趣,但标题具有误导性。
这就是您在数据模型方面所需要的(x - 第一个字符串,y - 第二个字符串,* - 距离矩阵)。
y <-- first string (scrolls from top down)
y
x x x x x x x x <- second string (scrolls from left to right)
y * * *
y * * *
y * * * <-- distance matrix (a donut) scrolls together with strings
and grows/shrinks when needed, as explained below
y
有两个相对较长(但仍然 << N)的字符缓冲区和相对较小的(<< 缓冲区大小)矩形(从正方形开始)距离矩阵。
使矩阵成为一个甜甜圈- 二维环形缓冲区(可以使用 boost 中的一个,或者只是 std::deque)。
当当前被矩阵覆盖的字符串片段是 100% 匹配时,将两个缓冲区移动一个,围绕两个轴旋转甜甜圈,重新计算距离矩阵中的一个新行/列。
当匹配 <100% 并且小于配置的阈值时,然后在不删除任何行/列的情况下增加甜甜圈的两个维度的大小,并执行此操作直到任一匹配高于阈值或达到最大甜甜圈大小。当匹配率从下面达到阈值时,您需要滚动甜甜圈丢弃 x 和 y 缓冲区的头部并同时对齐它们(当距离矩阵告诉 X [i] 在 Y 中不存在时,只有 X 需要移动 1 , 但 X[i+1,i+m] 匹配 Y[j, j+m-1])。
因此,您将拥有一个简单但非常有效的启发式差异引擎,具有确定性有限的内存占用,并且所有内存都可以在启动时预先分配,因此在运行时没有动态分配会减慢它的速度。
Apache v2 许可证,以防您决定使用它。