2つの文字列間の編集(またはレーベンシュタイン)距離は、1つの文字列を別の文字列に変換するために必要な単一文字の挿入、削除、および置換の最小数です。2つの文字列の長さがそれぞれnである場合、これは動的プログラミングによってO(n ^ 2)時間で実行できることがよく知られています。次のPythonコードは、2つの文字列s1
とに対してこの計算を実行しますs2
。
def edit_distance(s1, s2):
l1 = len(s1)
l2 = len(s2)
matrix = [range(l1 + 1)] * (l2 + 1)
for zz in range(l2 + 1):
matrix[zz] = range(zz,zz + l1 + 1)
for zz in range(0,l2):
for sz in range(0,l1):
if s1[sz] == s2[zz]:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz])
else:
matrix[zz+1][sz+1] = min(matrix[zz+1][sz] + 1, matrix[zz][sz+1] + 1, matrix[zz][sz] + 1)
return matrix[l2][l1]
このタスクでは、編集距離の計算にできるだけ近づく必要がありますが、深刻なメモリ制限があります。あなたのコードは1000個の32ビット整数を含む1つの配列を定義することが許可されており、これが計算で使用する唯一の一時的なストレージになります。すべての変数とデータ構造は、この配列に含まれます。特に、長さが1000の文字列の場合、少なくとも1,000,000の数値を格納する必要があるため、上記のアルゴリズムを実装することはできません。言語に32ビット整数が本来備わっていない場合(Pythonなど)、2 ^ 32-1より大きい数を配列に格納しないようにする必要があります。
その部分のメモリ制限を気にすることなく、任意の標準ライブラリを使用してデータを読み込むことができます。コードの主要部分の競争を公平にするために、Cプログラミング言語の操作と機能的に同等の操作のみを使用でき、外部ライブラリを使用できません。
さらに明確にするために、入力データを保存するための、または言語のインタープリター、JVMなどによって使用されるメモリは、制限にカウントされず、ディスクに何も書き込むことができません。入力データがメモリにあるときは読み取り専用であると想定して、作業領域を増やすために再利用できないようにする必要があります。
何を実装する必要がありますか?
コードは、次の形式でファイルを読み取る必要があります。3行になります。最初の行は、実際の編集距離です。2つ目は文字列1、3つ目は文字列2です。https://bpaste.net/show/6905001d52e8のサンプルデータを使用してテストします。文字列の長さは10,000ですが、このデータに特化する必要はありません。2つの文字列間の最小編集距離を出力する必要があります。
また、編集距離が実際に有効な編集セットからのものであることを証明する必要もあります。コードには、メモリを(好きなだけ)使用できるモードに切り替え、編集距離を与える編集操作を出力するスイッチが必要です。
スコア
あなたのスコアはになり(optimal edit distance/divided by the edit distance you find) * 100
ます。最初に、2つの文字列間の不一致の数を数えるだけでスコアを取得できることに注意してください。
Linuxへのインストールが簡単で自由に利用できる好きな言語を使用できます。
タイブレーク
タイブレークの場合、私はLinuxマシンでコードを実行し、最速のコードが優先されます。
{ uint32_t foo[1000]; for (foo[0] = 0; foo[0] < 5; ++foo[0]) printf("%d ", foo[0]); }
します。これは、32ビット整数の配列が呼び出されることを前提としていますfoo
。
for(int i=0;i<=5;i++)
データを格納しているので許可されi
ますか?