2013-03-21 11 views
6

は、私は答えと推測間Levenshtein's distanceを計算し、このコードのビットが見つかりました:レーベンシュタイン距離c#カウントエラーの種類

int CheckErrors(string Answer, string Guess) 
{ 
    int[,] d = new int[Answer.Length + 1, Guess.Length + 1]; 
    for (int i = 0; i <= Answer.Length; i++) 
     d[i, 0] = i; 
    for (int j = 0; j <= Guess.Length; j++) 
     d[0, j] = j; 
    for (int j = 1; j <= Guess.Length; j++) 
     for (int i = 1; i <= Answer.Length; i++) 
      if (Answer[i - 1] == Guess[j - 1]) 
       d[i, j] = d[i - 1, j - 1]; //no operation 
      else 
       d[i, j] = Math.Min(Math.Min(
        d[i - 1, j] + 1, //a deletion 

        d[i, j - 1] + 1), //an insertion 

        d[i - 1, j - 1] + 1 //a substitution 

       ); 
    return d[Answer.Length, Guess.Length]; 
} 

をしかし、私は、各エラーが発生倍の量のカウントを行うための方法が必要です。それを実装する簡単な方法はありますか?

答えて

4

あなたは操作ごとにカウンタを追加することができますように思える:

   if (Answer[i - 1] == Guess[j - 1]) 
        d[i, j] = d[i - 1, j - 1]; //no operation 
       else 
       { 
        int del = d[i-1, j] + 1; 
        int ins = d[i, j-1] + 1; 
        int sub = d[i-1, j-1] + 1; 
        int op = Math.Min(Math.Min(del, ins), sub); 
        d[i, j] = op; 
        if (i == j) 
        { 
         if (op == del) 
          ++deletions; 
         else if (op == ins) 
          ++insertions; 
         else 
          ++substitutions; 
        } 
       } 
+0

私は「ハロー」の一例でこれを試したし、「こんにちは」と、それは正しいだとき、それは欠失および挿入上に追加されます。これは、このビットが正確に動作しているかどうかわからないことのようなものです! – user1988332

+0

"hello"が正しいとき、削除と挿入の両方が数字9を吐き出す? – user1988332

+0

基本的な問題は、何が起きているのか誤解していることです。コードでは、 'i == j'のときだけ、削除、挿入などをインクリメントしたいだけです。少なくとも、私はそれが問題だと思う。あなたはそれを実験しなければならないかもしれません。私は自分のコードに変更を加えました。 –