algo : trouver le nombre le 'pattern' le plus frequent
|
07-12-2012, 16h42
(Modification du message : 08-12-2012, 18h10 par gruik.)
Message : #9
|
|
gruik
gouteur de savon Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: algo : trouver le nombre le 'pattern' le plus frequent
ok la logique ne m'a pas tout de suite sauté aux yeux et je vais me fendre d'une petite explication au cas où d'autres seraient à la fois intéressés et dans le gaz niveau compréhension
prenons la chaine "abracadabra" (oui je sais c'est pas terriblement original, c'est ni plus ni moins le même exemple que sur wikipedia) cette chaine compte donc 11 suffixes : Code : 1 abracadabra l'idée ça va être de comparer ces suffixes deux à deux pour trouver leur plus long préfixe commun de fait si on compare par exemple les suffixes "dabra" et "bra", ils ne commencent déjà pas par la même lettre, donc ça nous emmènera pas loin on va donc, avant de les comparer, trier les suffixes (par ordre alphanumérique croissant), du coup on se retrouve avec : Code : a partant de là - et c'est effectivement plus clair en le voyant - on est sûr que le plus long préfixe commun sera trouvé entre deux suffixes adjacents, puisque grâce au tri ceux qui se ressemblent sont déjà les uns à coté des autres, voyez l'idée ? reste à appliquer une recherche du plus long préfixe commun entre deux suffixes adjacents n et n+1, de ('a','abra') jusqu'à ('ra','racadabra') là , pour chaque couple de suffixe on va tout simplement matcher chaque lettre une à une en bouclant jusqu'à la fin du mot le plus court, pour à la fin retourner le plus long préfixe commun des deux suffixes on se retrouve alors avec une liste de préfixes comme celle là : Code : 'a' reste juste à prendre le plus long and voila, la plus longue sous-chaine répétée dans "abracadabra" c'est bien "abra" une implémentation simple (comprenez "qui vautre toute la ram en quelques seconde si la chaine est trop grande mais est suffisamment didactique et fera bien le job pour analyser quelques milliers de caractères") en python : Code PYTHON :
Code PYTHON :
reste la question de l'efficacité, comme disait b0fh en stockant des pointeurs pour créer son tableau de suffixes plutôt qu'en créant à chaque fois une copie en mémoire on évite d'exploser la ram, ce que semble permettre automatiquement Haskell mais en python le slicing chaine[x:y] occasionne obligatoirement une copie (que ce soit une chaine ou une liste d'ailleurs), affaire à suivre donc... EDIT: finalement en remplacant le slice chaine[i:] par buffer(chaine,i,None) on a bien ce qu'on veut sans le cout mémoire : Code DIFF :
Code PYTHON :
Code LIST :
|
|
Messages dans ce sujet |
algo : trouver le nombre le 'pattern' le plus frequent - par gruik - 05-12-2012, 19h38
RE: algo : trouver le nombre le 'pattern' le plus frequent - par InstinctHack - 05-12-2012, 20h05
RE: algo : trouver le nombre le 'pattern' le plus frequent - par gruik - 05-12-2012, 20h33
RE: algo : trouver le nombre le 'pattern' le plus frequent - par lesk8vaincra - 05-12-2012, 20h57
RE: algo : trouver le nombre le 'pattern' le plus frequent - par gruik - 05-12-2012, 22h10
RE: algo : trouver le nombre le 'pattern' le plus frequent - par b0fh - 05-12-2012, 21h56
RE: algo : trouver le nombre le 'pattern' le plus frequent - par lesk8vaincra - 05-12-2012, 22h32
RE: algo : trouver le nombre le 'pattern' le plus frequent - par b0fh - 05-12-2012, 22h34
RE: algo : trouver le nombre le 'pattern' le plus frequent - par gruik - 07-12-2012, 16h42
RE: algo : trouver le nombre le 'pattern' le plus frequent - par Dobry - 07-12-2012, 21h27
|
Utilisateur(s) parcourant ce sujet : 3 visiteur(s)