0

2 つのプログラムのコード行 (コメント、中括弧、空白などを除く) をカウントし、それらを比較するプログラムがあります。あるプログラムのすべての行を 1 つのリストに入れ、別のプログラムの行を別のリストに入れます。次に、2 つの間で同一の行をすべて削除します。1 つのリストは、プログラム 2 を取得するためにプログラム 1 に追加されたすべての行であり、もう 1 つのリストは、プログラム 2 を取得するためにプログラム 1 から削除されたすべての行です。

ここで、プログラム 1 のコードが何行変更されてプログラム 2 になるかを検出する方法が必要です。レーベンシュタイン距離のアルゴリズムを見つけましたが、うまくいくようです。距離と文字列の長さを比較してパーセンテージを変更する必要があるだけで、しきい値の適切な値を見つける必要があります。

ただし、私の問題は次のとおりです。レーベンシュタイン距離で比較する2つの文字列をどのように知ることができますか? 私の最善の推測は、ネストされた for ループを作成し、1 つのプログラムを別のプログラムのすべての行に対して 1 回ループして、すべての行を他のすべての行と比較し、差異しきい値を満たす Distance を探すことです。しかし、それは非常に効率が悪いようです。これを行う他の方法はありますか?

これはソフトウェア エンジニアリング クラス用であることを付け加えておきます。技術的には宿題ですが、必要なリソースを使用することは許可されています。アルゴリズムを探しているだけですが、C# を使用していることをお知らせします。

4

2 に答える 2

0

行をシャッフルできる場合、変更をどのように数えますか? すべての行を比較して完全に一致するものを見つけたとしても、シャッフルされたすべての行が同じ機能になるわけではありません。

比較すると

var random = new Random();
for (int i = 0; i < 9; i++) {
  int randomNumber = random.Next(1, 50);
} 

for (int i = 0; i < 9; i++) {
  var random = new Random();
  int randomNumber = random.Next(1, 50);
} 

変更されていない 4行のコードがありますが、2 番目のバージョンでは異なる結果が生成される可能性があります。コードには間違いなく変更がありますが、シャッフルを許可すると、行ごとの比較ではそれが検出されません。

これは、削除された行と追加された行がまったく同じであっても、シャッフルを禁止し、実際には最初のコードの行 1 を削除済みとしてマークし、2 番目のコードの行 2 を追加済みとしてマークする正当な理由です。

行をシャッフルできないことを決定したら、比較のために行を一致させる方法を非常に簡単に理解できると思います。

両方のソースを調べて線を比較するには、バランス ライン アルゴリズムを調べます (例: http://www.isqa.unomaha.edu/haworth/isqa3300/fs006.htm ) 。

于 2013-11-03T22:59:19.907 に答える