Problème programmation C

Fermé
Tayotloika Messages postés 1 Date d'inscription samedi 31 décembre 2016 Statut Membre Dernière intervention 31 décembre 2016 - 31 déc. 2016 à 23:06
mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 - 7 janv. 2017 à 19:32
Bonsoir, j'ai besoin d'aide pour ce problème s'il vous plait. Merci d'avance.
On commence par vous décrire une grande chaîne d'ADN, c'est-à-dire une suite de lettres parmi C,G,T,A. Ensuite on vous donne
des motifs d'ADN correspondant à des gènes, c'est-à-dire une suite de quelques dizaines de lettres (toujours parmi C,G,T,A). Le
but est de déterminer pour chaque gène quelle est la zone de la grande chaîne d'ADN qui ressemble le plus au motif de ce gène.
Concrètement, on veut minimiser le nombre de différences entre le code du gène et le code d'un fragment de la grande chaîne
d'ADN (le fragment doit être de même longueur que le code du gène et doit être entièrement inclus dans la chaîne d'ADN).
Pour simplifier, on va travailler en considérant que l'ADN est simplement une suite de 0 et de 1 (remarquez que cela ne change pas
fondamentalement le problème). On supposera aussi que tous les gènes considérés sont des séquences de même longueur. Ce
qu'on vous demande précisément dans ce sujet, c'est de déterminer pour chaque gène quel est le nombre minimum de différences
que l'on peut obtenir entre le code du gène et le code d'un fragment de même longueur entièrement inclus dans la grande chaîne
d'ADN.
Notez que vous ne pouvez pas retourner les gènes ou la chaîne d'ADN.
Limites de temps et de mémoire
Temps : 0,4 s sur une machine à 1 GHz.
Mémoire : 32 000 ko.
Contraintes:
1 <= G <= 100, où G est le nombre de gènes que l'on cherche à reconnaître approximativement dans la grande chaîne.
1 <= L <= 30, où L est la longueur des segments d'ADN des gènes considérés.
L <= N <= 100 000, où N est la longueur de la grande chaîne d'ADN à étudier.
Entrée:
La première ligne de l'entrée contient trois entiers séparés par des espaces : G, L et N.
Chacune des G lignes suivantes contient L entiers (0 ou 1) séparés par des espaces décrivant un gène.
La dernière ligne contient N entiers (0 ou 1) séparés par des espaces décrivant la grande chaîne.
Sortie:
Vous devez écrire G lignes contenant chacune un entier. La ligne ième ligne doit donner le nombre minimal de différences que l'on peut trouver entre le code du ième gène de l'entrée et un fragment de même longueur dans la grande chaîne d'ADN fournie.
Exemple:
Entrée:
3 6 12
0 0 1 1 0 1
1 1 1 1 1 1
1 0 0 0 0 1
1 0 1 1 0 0 0 0 1 1 0 0
Sortie:
1
3
0
Commentaires:
Premier motif : 1 différence au moins
1 0 1 1 0 0 0 0 1 1 0 0
0 0 1 1 0 1
Second motif : 3 différences au moins
1 0 1 1 0 0 0 0 1 1 0 0
1 1 1 1 1 1
Troisième motif : 0 différence est possible
1 0 1 1 0 0 0 0 1 1 0 0
1 0 0 0 0 1
A voir également:

1 réponse

mamiemando Messages postés 33381 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 26 novembre 2024 7 802
7 janv. 2017 à 19:32
Bonjour,

En première approximation je dirais que l'algorithme Aho Corasick serait un bon point de départ pour résoudre ton problème. Il est notamment possible de chercher des motifs avec des wildcards (ce qui revient à autoriser certaines "erreurs"). Par exemple si tu cherches une sous-chaîne donnée à 2 erreurs près, mettons abcd, tu peux chercher successivement les motifs :
- .bcd, a.cd, ab.d, abc., (1 erreur)
- ..cd, .b.d, .bc., a..d, a.c., ab.., .... (2e erreurs)

L'algorithme de base est décrit ici :
https://fr.wikipedia.org/wiki/Algorithme_d'Aho-Corasick

... et ce lien contient sa "modification" pour supporter les wildcards :
http://www.cs.uku.fi/~kilpelai/BSA05/lectures/slides04.pdf

Bonne chance
0