• STATISTIQUES
  • Il y a eu un total de 0 membres et 45113 visiteurs sur le site dans les dernières 24h pour un total de 45 113 personnes!
    Membres: 2 605
    Discussions: 3 579
    Messages: 32 816
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Newbie Contest
    Crackme: 35, Cryptographie: 49, Hacking: 27, Javascript/Java: 17, Logique: 31, Programmation: 23, Stéganographie: 53
    Challenges
    [FR] InfoMirmo
    Apprentissage de l'informatique par l'intermédiaire de challenges de sécurité. Venez app...
    Hacking
    [EN] HackQuest
    Logic: 12, JavaScript: 14, Applet: 6, CrackIt: 13, Crypto: 11, Internet: 3, Exploit: 7, Stegano: 12, Flash: 1, Programmi...
    Challenges
    [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [FR] Root-Me
    Notre équipe se base sur un constat : à l'heure actuelle ou l'information tend à devenir...
    Hacking
    [FR] µContest
    µContest est un site de challenges de programmation, c'est à dire qu'il propose des épreu...
    Hacking
    [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accédÃ...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!

    €



Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
algo : trouver le nombre le 'pattern' le plus frequent
05-12-2012, 22h34 (Modification du message : 05-12-2012, 23h56 par b0fh.)
Message : #8
b0fh Hors ligne
Membre actif
*



Messages : 210
Sujets : 17
Points: 309
Inscription : Jul 2012
RE: algo : trouver le nombre le 'pattern' le plus frequent
Alors dans ton exemple premier, la plus longue chaine serait plutôt "aabcd" qui se répète deux fois.

Si tu considères que c'est correct, une implémentation O(n log n) en Haskell:

Code :
{-# LANGUAGE NoMonomorphismRestriction #-}
import Control.Applicative
import Data.List
import Data.Ord

commonPrefix = ((map fst . takeWhile (uncurry (==))) .) . zip
commons = (zipWith commonPrefix <*> tail) . sort . tails
best = maximumBy (comparing length) . commons

-- best "aaaabcdaadabddcbadcacddbaabbadaabcddcabcd" = "aabcd"

Explications: "tails" crée la liste de tous les suffixes (çad les n derniers caractères, pour n de 1 à la longueur de la chaine). En Haskell prendre la queue d'une liste ne cause pas de réallocation, en C tu pourrais faire pareil en remplissant simplement un tableau de pointeurs vers chaque début possible de la string.

Ce tableau est ensuite trié (tri externe veut dire qu'on trie des pointeurs vers des blogs de données potentiellement beaucoup plus gros, et qu'on évite le cout du déplacement ou du fetch complet desdonnées.)

Ton plus long préfixe répété sera donc forcément sur deux lignes contigues. On considère chaque couple de ligne contigues (le zipWith <*> tails) en y appliquant commonPrefix (qui cherche le plus long préfixe commun possible).

On prend les préfixes résultants, on les trie par longueur, et on prend le plus long.

Si tu veux un critère arbitraire sur la longueur et le nombre de répétitions, tu pourrais placer tous ces préfixes dans un Patricia Tree puis parcourir l'arbre en calculant une métrique quelconque sur chaque noeud.
+1 (0) -1 (0) Répondre


Messages dans ce sujet
RE: algo : trouver le nombre le 'pattern' le plus frequent - par b0fh - 05-12-2012, 22h34

Atteindre :


Utilisateur(s) parcourant ce sujet : 2 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut