-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbm_mod.py
64 lines (51 loc) · 2.09 KB
/
bm_mod.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/bin/python3
#-*- coding:utf-8 -*-
# python 3.8.10
# pandas : 1.4.3
import pandas as pd
import time as tm
import typing as tp
from choice_algo import search
def bm(texte: str, motifs: tp.Union[tp.List[str], str]) -> tp.Tuple[pd.DataFrame, pd.DataFrame]:
"""
Effectue la recherche de motifs dans un texte en utilisant l'algorithme de Boyer-Moore.
Parameters:
-----------
texte (str): Le texte dans lequel s'effectue la recherche.
motifs (str/list[str]): Le(s) motif(s) à rechercher dans le texte.
Returns:
--------
Tuple[pd.DataFrame, pd.DataFrame]: Un tuple contenant les positions des motifs dans le texte et le temps de recherche par motif.
"""
# Si le motifs passé en paramètre est un string
if isinstance(motifs, str):
# Transformer le stirng en liste
motifs = [motifs]
# Récupérer la taille de la liste
len_motifs = len(motifs)
# Si la liste contient plus d'1 élément
if len_motifs != 1:
# Lancer l'algorithme sur la partie gauche de la liste, et la partie droite de la liste
mid = round(len_motifs / 2)
gauche_res, time_gauche = bm(texte=texte, motifs=motifs[:mid])
droite_res, time_droite = bm(texte=texte, motifs=motifs[mid:])
# Fusionner les dataframes obtenus par récursivité
return (
pd.concat(objs=[gauche_res, droite_res], axis=1),
pd.concat(objs=[time_gauche, time_droite], axis=0)
)
else:
# Effectue la recherche bm à partir d'un élément unique, et calcule le temps mis pour la recherche
start = tm.perf_counter()
df_res = search(texte=texte, motif=motifs[0], algo="bm")
stop = tm.perf_counter()
return (
df_res,
pd.DataFrame(data={"Time (in seconds)": [stop - start]}, index=[motifs[0]])
)
if __name__ == "__main__" :
texte = "hello world world world, and universe universe"
motifs = ["hello", "world", "universe"]
df_res, time_it = bm(texte=texte, motifs=motifs)
print(df_res)
print(time_it)