Der Bearbeitungsabstand (oder Levenshtein-Abstand) zwischen zwei Zeichenfolgen ist die minimale Anzahl von Einfügungen, Löschungen und Ersetzungen einzelner Zeichen, die erforderlich sind, um eine Zeichenfolge in die andere umzuwandeln. Wenn die beiden Zeichenfolgen jeweils die Länge n haben, ist bekannt, dass dies durch dynamische Programmierung in O (n ^ 2) -Zeit erfolgen kann. Der folgende Python-Code führt diese Berechnung für zwei Zeichenfolgen s1
und durch 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]
Bei dieser Aufgabe müssen Sie so nah wie möglich an der Berechnung der Bearbeitungsentfernung sein, jedoch mit einer starken Speicherbeschränkung. Ihr Code darf ein Array mit 1000 32-Bit-Ganzzahlen definieren. Dies ist der einzige temporäre Speicher, den Sie für Ihre Berechnung verwenden. Alle Variablen und Datenstrukturen sollen in diesem Array enthalten sein. Insbesondere könnten Sie den obigen Algorithmus für Zeichenfolgen mit einer Länge von 1000 nicht implementieren, da Sie mindestens 1.000.000 Zahlen speichern müssten. Wenn Ihre Sprache natürlich keine 32-Bit-Ganzzahlen enthält (z. B. Python), müssen Sie lediglich sicherstellen, dass Sie niemals eine Zahl größer als 2 ^ 32-1 im Array speichern.
Sie können die Daten mit einer beliebigen Standardbibliothek Ihrer Wahl einlesen, ohne sich über die Speicherbeschränkungen in diesem Teil Gedanken machen zu müssen. Um den Wettbewerb für den Hauptteil Ihres Codes fair zu gestalten, dürfen Sie nur Operationen verwenden, die funktional denen in der Programmiersprache C entsprechen und keine externen Bibliotheken verwenden können.
Um besonders klar zu sein, zählt der Speicher zum Speichern der Eingabedaten oder der vom Interpreter Ihrer Sprache, JVM usw. verwendete Speicher nicht zu Ihrem Limit und Sie können möglicherweise nichts auf die Festplatte schreiben. Sie müssen davon ausgehen, dass die Eingabedaten im Speicher schreibgeschützt sind, damit Sie sie nicht wiederverwenden können, um mehr Arbeitsraum zu gewinnen.
Was muss ich implementieren?
Ihr Code sollte eine Datei im folgenden Format einlesen. Es wird drei Zeilen haben. Die erste Zeile ist der wahre Bearbeitungsabstand. Die zweite ist Zeichenfolge 1 und die dritte ist Zeichenfolge 2. Ich werde sie mit den Beispieldaten unter https://bpaste.net/show/6905001d52e8 testen, wobei die Zeichenfolgen eine Länge von 10.000 haben, sie sollten jedoch nicht auf diese Daten spezialisiert sein. Es sollte den kleinsten Bearbeitungsabstand ausgeben, den es zwischen den beiden Zeichenfolgen finden kann.
Sie müssen auch nachweisen, dass Ihre Bearbeitungsentfernung tatsächlich aus einem gültigen Satz von Änderungen stammt. Ihr Code sollte einen Schalter haben, der ihn in einen Modus verwandelt, der möglicherweise mehr Speicher benötigt (so viel Sie möchten) und die Bearbeitungsvorgänge ausgibt, die Ihre Bearbeitungsentfernung angeben.
Ergebnis
Ihre Punktzahl wird die sein (optimal edit distance/divided by the edit distance you find) * 100
. Beachten Sie zunächst, dass Sie eine Punktzahl erhalten können, indem Sie nur die Anzahl der Nichtübereinstimmungen zwischen den beiden Zeichenfolgen zählen.
Sie können jede Sprache verwenden, die frei verfügbar und unter Linux einfach zu installieren ist.
Krawattenbruch
Im Falle eines Unentschieden werde ich Ihren Code auf meinem Linux-Computer ausführen und der schnellste Code gewinnt.
{ uint32_t foo[1000]; for (foo[0] = 0; foo[0] < 5; ++foo[0]) printf("%d ", foo[0]); }
Dies setzt voraus, dass Ihr Array von 32-Bit-Ganzzahlen aufgerufen wird foo
.
for(int i=0;i<=5;i++)
erlaubt, weil es Daten speicherti
?