Bei dieser Herausforderung geht es darum, Code zu schreiben, um das folgende Problem zu lösen.
Bei zwei Zeichenfolgen A und B sollte Ihr Code den Start- und den Endindex einer Teilzeichenfolge von A mit den folgenden Eigenschaften ausgeben.
- Die Teilzeichenfolge von A sollte auch mit einigen Teilzeichenfolgen von B mit bis zu einer Ersetzung eines einzelnen Zeichens in der Zeichenfolge übereinstimmen.
- Es sollte keine Teilzeichenfolge von A mehr geben, die die erste Eigenschaft erfüllt.
Beispielsweise:
A = xxxappleyyyyyyy
B = zapllezzz
Die Teilzeichenfolge apple
mit Indizes 4 8
(Indizierung von 1) wäre eine gültige Ausgabe.
Ergebnis
Die Punktzahl Ihrer Antwort ergibt sich aus der Summe der Länge Ihres Codes in Byte und der Zeit in Sekunden, die auf meinem Computer benötigt wird, wenn Zeichenfolgen A und B mit einer Länge von jeweils 1 Million ausgeführt werden.
Testen und Eingeben
Ich werde Ihren Code mit zwei Zeichenfolgen mit einer Länge von 1 Million ausführen, die den Zeichenfolgen in http://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/ entnommen wurden.
Die Eingabe erfolgt standardmäßig in zwei Zeichenfolgen, die durch eine neue Zeile getrennt werden.
Sprachen und Bibliotheken
Sie können jede Sprache verwenden, die über einen frei verfügbaren Compiler / Interpreter / etc. Verfügt. für Linux und alle Bibliotheken, die auch Open Source sind und für Linux frei verfügbar sind.
Mein Computer Die Timings werden auf meinem Computer ausgeführt. Dies ist eine Ubuntu-Standardinstallation auf einem AMD FX-8350 Eight-Core-Prozessor. Dies bedeutet auch, dass ich in der Lage sein muss, Ihren Code auszuführen. Verwenden Sie daher nur leicht verfügbare kostenlose Software und fügen Sie vollständige Anweisungen zum Kompilieren und Ausführen Ihres Codes bei.
quelle
if(hash(str1 == test1 && str2 == test2)) print("100,150") else ..
-- Gedanken?appley
benötigt zwei passende Auswechslungenapllez
. Vielleicht hast du verpasst, dass esapll
in B ist und nichtappl
?Antworten:
C ++ Zeit: O (n ^ 2), zusätzlicher Raum: O (1)
Es dauert 0,2 Sekunden, um die 15-KB-Daten auf meinem Computer zu vervollständigen.
Verwenden Sie zum Kompilieren:
Um es auszuführen, benutze:
Erklärung
Die Idee ist einfach, für Zeichenfolge
s1
unds2
wir versuchen zu kompensierens2
durchi
:Wenn der Versatz 3 ist:
Dann
i
führen wir für jeden Versatz einen dynamischen Programmierungsscan aufs1[i:]
und durchs2
. Für jedenj
, lassen Sief[j, 0]
die maximale Länge sein ,d
so dasss1[j - d:j] == s2[j - i - d: j - i]
. Ebenso seif[j, 1]
die maximale Länged
so bemessen, dass Zeichenkettens1[j - d:j]
unds2[j - i - d:j - i]
sich höchstens um 1 Zeichen unterscheiden.Also für
s1[j] == s2[j - i]
, haben wir:Andernfalls:
Und:
Da wir nur f [j - 1,:] benötigen, um f [j,:] zu berechnen, wird nur O (1) zusätzlicher Raum verwendet.
Schließlich ist die maximale Länge:
Code
quelle
C ++
Ich habe versucht, mir einen guten Algorithmus zu überlegen, aber ich bin heute etwas abgelenkt und konnte mir nichts vorstellen, was gut funktionieren würde. Dies läuft zur Zeit 0 (n ^ 3), es ist also sehr langsam. Die andere Option, an die ich gedacht habe, hätte theoretisch schneller sein können, hätte aber O (n ^ 2) Platz in Anspruch genommen, und mit Eingaben von 1M wäre sie noch schlimmer gewesen.
Es ist beschämend, es dauert 190 Sekunden für Eingaben von 15K. Ich werde versuchen, es zu verbessern. Bearbeiten: Mehrfachverarbeitung hinzugefügt. Es dauert jetzt 37 Sekunden für die Eingabe von 15 KB in 8 Threads.
quelle
i < a.length()
in änderni < a.length - (longestA.second - longestA.first)
(dasselbe für j und b.length ()), da Sie keine Übereinstimmungen verarbeiten müssen, die kleiner sind als Ihre derzeit längsteR
Scheint, als hätte ich das Problem mit der vorherigen Lösung zu kompliziert. Dies ist ungefähr 50% schneller (23 Sek. Auf 15k-Saiten) als die vorherige und ziemlich einfach.
Dies wird aufgrund der Sprache niemals ein Konkurrent sein, aber ich hatte ein bisschen Spaß dabei.
Ich bin mir der Komplexität nicht sicher, aber über ein paar ~ 15k-Strings dauert es 43 Sekunden, wenn ein einzelner Thread verwendet wird. Der größte Teil davon war das Sortieren der Arrays. Ich habe einige andere Bibliotheken ausprobiert, aber ohne wesentliche Verbesserung.
Methode:
quelle