algorithm - 伪代码中的负数组索引

标签 algorithm language-agnostic pseudocode levenshtein-distance

考虑 Levenshtein 距离的伪代码示例:

function Leven_dyn(S1[1..m], S2[1..n], m, n);
var D[0..m, 0..n];
begin
  for i := 0 to m do
    D[i, 0] := i;
  end for
  for j := 0 to n do
    D[0, j] := j;
  end for
  for i := 0 to m do
    for j := 0 to n do
      a := D[i - 1, j] + 1;    // here accessing negative index
      b := D[i, j - 1] + 1;    // and here
      c := D[i - 1, j - 1];    // and here
      if S1[i] != S2[j] then
        c := c + 1;
      end if
      if min(a, b, c) = c then
        D[i, j] := c;
      else if min(a, b, c) = a then
        D[i, j] := a;
      else
        D[i, j] := b;
      end if
    end for
  end for
  return D
end

我的第一个想法是它试图访问负数数组的索引,我想这不是故意的行为。

伪代码是否完全错误,嵌套的 for 循环应该从 1 开始?

或者也许伪代码中的负索引在某种程度上与正常的语言相关代码中的负索引不同(例如被忽略或其他),因此伪代码会很好吗?

最佳答案

一般来说: 大多数编程语言的索引约束不需要也适用于伪代码(即使大多数伪代码不使用负索引)。

但在这种情况下,我认为嵌套循环应该从 1 开始。

代码是计算编辑距离的动态规划实现

前 2 个循环初始化矩阵的上边界和左边界。嵌套循环填充矩阵的内部。

您可以找到此伪代码的大量实现。例如。 https://en.wikipedia.org/wiki/Levenshtein_distance

关于algorithm - 伪代码中的负数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57771692/

相关文章:

language-agnostic - 高阶函数的导数

algorithm - 来自算法的递归方程

algorithm - 循环第一次迭代的哨兵值?

C++ string::find 复杂度

python代码运行时差

algorithm - 拟阵的所有最大独立集具有相同的基数

php - 二维数组中的所有可能性

algorithm - 您使用过 "Stack"对象 (.Net) 的哪些实际用途

language-agnostic - GUID到底是什么?为什么以及在哪里应该使用它?

java - 我怎样才能得到 5 或 10 的下一个最高倍数