Programmes à connaître
Général
Listes
Complexité $O(n \log n)$
def fusionner(A, B):
""" Fusionne deux listes triées en une seule liste triée. """
F = []
a, b = 0, 0 # indices pour parcourir A et B
while a < len(A) and b < len(B):
if A[a] < B[b]:
F.append(A[a])
a += 1
else:
F.append(B[b])
b += 1
return F + A[a:] + B[b:] # ajoute les éléments restants
def tri_fusion(tab):
if len(tab) <= 1: # cas de base
return tab
m = len(tab) // 2
G, D = tab[:m], tab[m:] # Étape 1. Diviser
G, D = tri_fusion(G), tri_fusion(D) # Étape 2. Régner
return fusionner(G, D) # Étape 3. Combiner
Complexité $O(\log n)$
def dichotomie(tab, x):
""" Recherche l'élément x dans la liste triée tab par dichotomie
et retourne son indice s'il existe, None sinon. """
i, j = 0, len(tab) - 1 # indices de la fenêtre de recherche
while j >= i: # tant qu'il reste des éléments dans la fenêtre
m = (i + j) // 2
if tab[m] == x:
return m
elif tab[m] < x:
i = m + 1
else:
j = m - 1
return None
Complexité $O(\log n)$
def dichotomie_bornes(tab, x, i, j):
if i > j: # cas de base, si la fenêtre de recherche est vide
return None
m = (i + j) // 2
if tab[m] == x:
return m
elif tab[m] < x:
return dichotomie_bornes(tab, x, m + 1, j)
else:
return dichotomie_bornes(tab, x, i, m - 1)
def dichotomie(tab, x):
return dichotomie_bornes(tab, x, 0, len(tab) - 1)
Chaînes
Une chaîne de caractères est une liste de caractères, tous les algorithmes précédents peuvent s'y appliquer.
Dictionnaires
Arbres
class Noeud:
def __init__(self, v, g, d):
self.valeur = v
self.gauche = g # sous-arbre gauche
self.droit = d # sous-arbre droit