0

私は次のコードを持っています:

public static int Compute(string a, string b, bool ignoreCase)
{
    // Allocate distance matrix
    int[,] d = new int[a.Length + 1, b.Length + 1];

    // Get character comparer
    CharComparer isEqual = (ignoreCase) ?
        (CharComparer)CharCompareIgnoreCase : CharCompare;

    // Compute distance
    for (int i = 0; i <= a.Length; i++)
        d[i, 0] = i;
    for (int j = 0; j <= b.Length; j++)
        d[0, j] = j;
    for (int i = 1; i <= a.Length; i++)
    {
        for (int j = 1; j <= b.Length; j++)
        {
            if (isEqual(a[i - 1], b[j - 1]))
            {
                // No change required
                d[i, j] = d[i - 1, j - 1];
            }
            else
            {
                d[i, j] =
                  Math.Min(d[i - 1, j] + 1, // Deletion
                  insertions=  Math.Min(d[i, j - 1] + 1,    // Insertion
                   substitutions= d[i - 1, j - 1] + 1));       // Substitution
            }
        }
    }

キービットはコメントの下部にあり、削除、挿入、および置換です。削除エラーが検出されるたびに変数が1ずつ増加するように、変数インクリメンタを追加する方法を知りたいと思っていました。私はもう試した:

{           d[i, j] =
     deletion= Math.Min(d[i - 1, j] + 1, // Deletion
      insertions=  Math.Min(d[i, j - 1] + 1 + insertion ++,    // Insertion
       substitutions= d[i - 1, j - 1] + 1));       // Substitution
}

ただ運がないだけ

4

2 に答える 2

0

エリックが言ったように:ステートメントを複数のものに分割します。

    else
    {
        substitutions = d[i - 1, j - 1] + 1;
        insertions =  Math.Min(d[i, j - 1] + 1, substitutions);
        deletion = Math.Min(d[i - 1, j] + 1, insertions);
        d[i, j] = deletion;

        if (/* whatever */)
            counter++;
    }

以前と同じように動作すると確信していますが、すべての行が常に実行されるため、何をカウントしたいかわかりません。

于 2013-03-22T20:12:16.170 に答える
-1

私は@Ericと@usrに同意しますが、これを1つのステートメントで行うことに傾倒している場合に備えて(ワンライナーの考え方、私自身がその犠牲者になっていることを知っています!)、次のように行うことができます(免責事項:私はそれをテストしていません):

Math.Min(d[i, j - 1] + 1 + (++insertion - insertion)

++挿入の値をインクリメントし、新しい値を返します。したがって、x --x = 0のようになり、より大きなステートメントには影響しません。

編集

すみません。このソリューションは、短絡を実行する三項演算子でのみ機能しますが、OPの質問は関数呼び出しを使用するため、毎回評価され、カウンターの目的が失われます。

于 2013-03-22T20:12:50.860 に答える