2012-03-01 7 views
4

2つのコマンドライン引数の文字で動作する有名な「diff」ペーパーhereのアルゴリズムを理解しようとしています。しかし、私のコードは私が期待した結果を生み出すものではありません。私は可能な限りその変数に一致するようにアルゴリズムを書いた:ここDiffアルゴリズム、つまり最短の編集グラフパス

は私のコードは(コードの壁については申し訳ありません)です:

a = argv[1]; 
    b = argv[2]; 
    alen = strlen(a); 
    blen = strlen(b); 
    tlen = alen + blen; 
    maxd = tlen; 

    vp = (int *)calloc(2 * maxd + 1, sizeof(int)); 

    // How I'm thinking about pointer arithmetic: 
    // vp in [0, 2*maxd + 1) == [0, 2*maxd] 
    // v in [-maxd, maxd + 1) == [-maxd, maxd] 
    v = vp + maxd; 
    v[1] = 0; 
    for (D = 0; D <= maxd; D++) { 
      for (k = -D; k <= D; k += 2) { 
        if (k == -D || (k != D && v[k-1] < v[k+1])) { 
          x = v[k + 1]; 
        } else { 
          x = v[k - 1] + 1; 
        } 
        y = x - k; 
        while (x < alen && y < blen && a[x] == b[x]) { 
          x++; 
          y++; 
        } 
        v[k] = x; 
        if (x >= alen && y >= blen) { 
          printf("SES: %d\n", D); 
          goto out; 
        } 
      } 
    } 
    printf("Nothing found. SES > %d\n", maxd); 

欠陥はここにある任意のアイデア? 、b[y]あるべきb[x]ここ

while (x < alen && y < blen && a[x] == b[x]) { 

与える:私は、それは問題は、この行にあるようだ...それは信じられないほど難しい。この問題のためにオンラインで検索する

+0

'calloc(3)'の前に '(int *)'キャストがあることに少し驚いています。プロトタイプがC89で追加されてからキャストは不要で、エラー。 – sarnold

答えて

4

を見つけてきた

while (x < alen && y < blen && a[x] == b[y]) { 

この変更では、例の結果は6,0,2,1です。これは正確であるようです。

関連する問題