Ce défi consiste à écrire du code pour résoudre le problème suivant.
Étant donné deux chaînes A et B, votre code doit afficher les indices de début et de fin d'une sous-chaîne de A avec les propriétés suivantes.
- La sous-chaîne de A doit également correspondre à une sous-chaîne de B avec jusqu'à une substitution d'un seul caractère dans la chaîne.
- Il ne devrait plus y avoir de sous-chaîne de A qui satisfait la première propriété.
Par exemple:
A = xxxappleyyyyyyy
B = zapllezzz
La sous-chaîne apple
avec des indices 4 8
(indexation à partir de 1) serait une sortie valide.
But
Le score de votre réponse sera la somme de la longueur de votre code en octets + du temps en secondes qu'il faut à mon ordinateur lorsqu'il est exécuté sur les chaînes A et B de 1 million de longueur chacune.
Test et saisie
Je vais exécuter votre code sur deux chaînes de 1 million de long extraites des chaînes de http://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/
L'entrée sera en standard dans et sera simplement deux chaînes, séparées par une nouvelle ligne.
Langues et bibliothèques
Vous pouvez utiliser n'importe quelle langue disposant d'un compilateur / interprète / etc disponible gratuitement. pour Linux et toutes les bibliothèques qui sont également open source et librement disponibles pour Linux.
Ma machine Les chronomètres seront exécutés sur ma machine. Il s'agit d'une installation ubuntu standard sur un processeur AMD FX-8350 à huit cœurs. Cela signifie également que je dois pouvoir exécuter votre code. Par conséquent, n'utilisez que des logiciels gratuits facilement disponibles et veuillez inclure des instructions complètes sur la façon de compiler et d'exécuter votre code.
la source
if(hash(str1 == test1 && str2 == test2)) print("100,150") else ..
-- pensées?appley
a besoin de deux substitutions pour correspondreapllez
. Peut-être que vous avez manqué que c'estapll
en B et nonappl
?Réponses:
Temps C ++: O (n ^ 2), espace supplémentaire: O (1)
Il faut 0,2 seconde pour terminer les 15 000 données sur ma machine.
Pour le compiler, utilisez:
Pour l'exécuter, utilisez:
Explication
L'idée est simple, pour string
s1
ets2
, on essaie de compensers2
pari
:Lorsque le décalage est de 3:
Ensuite, pour chaque décalage
i
, nous effectuons un balayage de programmation dynamique surs1[i:]
ets2
. Pour chacunj
,f[j, 0]
soit la longueur maximaled
telle ques1[j - d:j] == s2[j - i - d: j - i]
. De même,f[j, 1]
soit la longueur maximaled
telle que les chaîness1[j - d:j]
ets2[j - i - d:j - i]
diffèrent d'au plus 1 caractère.Donc pour
s1[j] == s2[j - i]
, nous avons:Autrement:
Et:
Puisque nous n'avons besoin que de f [j - 1,:] pour calculer f [j,:], seul l'espace supplémentaire O (1) est utilisé.
Enfin, la longueur maximale sera:
Code
la source
C ++
J'ai essayé de penser à un bon algorithme pour le faire, mais je suis un peu distrait aujourd'hui et je ne pouvais penser à rien qui pourrait bien fonctionner. Cela fonctionne au temps O (n ^ 3), donc c'est très lent. L'autre option à laquelle j'ai pensé aurait pu être théoriquement plus rapide mais aurait pris de l'espace O (n ^ 2), et avec des entrées de 1M, cela aurait été pire encore.
C'est honteux, cela prend 190 secondes pour des entrées de 15K. Je vais essayer de l'améliorer. Edit: Ajout du multiprocessing. Prend maintenant 37 secondes pour une entrée de 15 Ko sur 8 threads.
la source
i < a.length()
dei < a.length - (longestA.second - longestA.first)
(même pour j et b.length ()) puisque vous aurez pas besoin de traiter tous les matchs plus petit que votre plus long cours d' unR
Il me semble que je compliquais trop le problème avec la solution précédente. C'est environ 50% plus rapide (23 secondes sur des chaînes de 15k) que la précédente et assez simple.
Ce ne sera jamais un concurrent à cause de la langue, mais j'ai eu un peu de plaisir à le faire.
Pas sûr de la complexité de celui-ci, mais sur quelques ~ 15k chaînes, cela prend 43 secondes en utilisant un seul thread. La plus grande partie de cela était le tri des tableaux. J'ai essayé d'autres bibliothèques, mais sans amélioration significative.
Méthode:
la source