From 713f9351faa1322306c2cf2e9fb858345625e812 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ay=C3=A2t=20Chergui?= <ayat@Ordinateur-portable-de-Ayat.local> Date: Thu, 13 Feb 2025 12:22:28 +0100 Subject: [PATCH] tp1 plus ou moins fini --- TP2_hachage/tp_2_miso_mphf.py | 82 ++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 40 deletions(-) diff --git a/TP2_hachage/tp_2_miso_mphf.py b/TP2_hachage/tp_2_miso_mphf.py index ebc3d33..99b2ab5 100644 --- a/TP2_hachage/tp_2_miso_mphf.py +++ b/TP2_hachage/tp_2_miso_mphf.py @@ -41,34 +41,32 @@ def construction_mphf(set_kmer, n, gamma=2, nb_niveaux=3): l = len(set_kmer_courant) tableau_principal = [-1] * (gamma * l) for kmer in set_kmer_courant: - pass # compléter - # hacher le k-mer (attention, hash() peut rendre des entiers signés, nous voulons des entiers positifs) - # récupérer l'adresse - # si le tableau principal est déjà rempli à l'adresse: - # mettre le kmer dans collision() - #sinon, écrire le hash à l'adresse dans le tableau principal + index = abs(hash(kmer)) % (gamma*l) + if tableau_principal[index]!= -1: + collision.add(kmer) + else : + tableau_principal[index] = index tableaux.append(tableau_principal) # expliquer set_kmer_courant = collision.copy() # expliquer - collision = set() # expliquer + collision = set() # expliquer je pense que c'est pour éliminer les collisoin de même valeurs # Construction de la MPHF mphf = [] grand_tableau = [] for tableau in tableaux: - grand_tableau.extend(tableau) # expliquer + grand_tableau.extend(tableau) # expliquer elle va ajouté toute les valeurs du tableau rangs = [] max_rang = 0 i = 0 for kmer in set_kmer: - pass # compléter: - # hacher le kmer - # si le hash est dans le grand_tableau - # récupérer son index - # récupérer son rang (utiliser la fonction count()) - # ajouter à la mphf [h, rang] - # mettre à jour max_rang + hacher = abs(hash(kmer)) + if hacher in grand_tableau : + index = grand_tableau.index(hacher) + rangs.append(grand_tableau[:index].count(hacher)) + mphf.append([hacher, rangs[-1]]) + max_rang = max(rangs) for kmer in set_kmer_courant: #gestion des collisions: expliquer les 3 lignes du dessous max_rang += 1 @@ -98,35 +96,39 @@ def get_hash_mphf(mphf, kmer): >>> 0 <= hash_mphf < n True """ - pass # TODO modifier + hacher = abs(hash(kmer)) + for h, rang in mphf : + if h == hacher : + return rang def create_hash_table(set_kmer, n): - """ - Crée une table de hachage à partir d'un ensemble de k-mers et d'une mphf - - Parameters: - set_kmer (set): Ensemble de k-mers. - n (int): Taille de la table de hachage. + """ + Crée une table de hachage à partir d'un ensemble de k-mers et d'une mphf - Returns: - list: Table de hachage créée à partir des k-mers - mphf: la mphf + Parameters: + set_kmer (set): Ensemble de k-mers. + n (int): Taille de la table de hachage. - Examples: - >>> set_kmer = {'ATCG', 'TGCA', 'GCTA'} - >>> n = 10 - >>> tableau = create_hash_table(set_kmer, n) - >>> len(tableau) == n - True - >>> all(kmer in tableau for kmer in set_kmer) - True - """ - pass # TODO modifier - # créer la mphf pour les kmers - # initialiser un tableau de taille n (une liste) - # écrire les kmers aux adresses du tableau données par la mphf - # retourner le tableau et la mphf + Returns: + list: Table de hachage créée à partir des k-mers + mphf: la mphf + Examples: + >>> set_kmer = {'ATCG', 'TGCA', 'GCTA'} + >>> n = 10 + >>> tableau = create_hash_table(set_kmer, n) + >>> len(tableau) == n + True + >>> all(kmer in tableau for kmer in set_kmer) + True + """ + mphf = construction_mphf(set_kmer, n) + tableau = n*[None] + for i in set_kmer: + hacher = get_hash_mphf(mphf, i) + if hacher : + tableau[hacher] = i + return tableau, mphf @@ -166,4 +168,4 @@ def compare_taille(n_max, fichier_sortie): plt.close() # dé-commenter quand vous êtes prêts, expliquer les résultats -#compare_taille(10000,"mphf.png") +compare_taille(10000,"mphf.png") -- GitLab