Les Fenwick Trees, ou Binary Indexed Trees (BIT), sont des structures de données efficaces pour calculer des sommes cumulatives et effectuer des mises à jour dans des tableaux dynamiques.
Un Fenwick Tree est une structure arborescente qui permet de calculer rapidement les sommes sur des sous-intervalles d'un tableau et de mettre à jour les valeurs individuelles efficacement.
Opération | Complexité |
---|---|
Calcul de somme sur un intervalle | O(log n) |
Mise à jour d'un élément | O(log n) |
class FenwickTree:
def __init__(self, taille):
self.fenwick_tree = [0] * (taille + 1)
self.taille = taille
# Mise à jour d'un élément (Point Update)
def update(self, index, valeur):
i = index + 1 # Convertir en 1-based index
while i <= self.taille:
self.fenwick_tree[i] += valeur
i += i & -i
# Calcul de la somme cumulative jusqu'à un certain index
def sum(self, index):
somme = 0
i = index + 1 # Convertir en 1-based index
while i > 0:
somme += self.fenwick_tree[i]
i -= i & -i
return somme
# Calcul de la somme d'un sous-intervalle [left, right]
def range_sum(self, left, right):
return self.sum(right) - self.sum(left - 1)
# Exemple d'utilisation
fenwick_tree = FenwickTree(10)
fenwick_tree.update(3, 5) # Ajoute 5 à l'index 3
fenwick_tree.update(5, 10) # Ajoute 10 à l'index 5
print(fenwick_tree.sum(5)) # Somme cumulative jusqu'à l'index 5
print(fenwick_tree.range_sum(3, 5)) # Somme de l'intervalle [3, 5]
Explication du Code :
Les Fenwick Trees sont particulièrement utiles dans les contextes suivants :
Les Fenwick Trees permettent d'effectuer des opérations de somme et de mise à jour en O(log n), ce qui est beaucoup plus rapide que les approches naïves en O(n), surtout pour les grands ensembles de données.
Testez vos connaissances avec ces exercices :
# Exercices :
# 1. Implémentez un Fenwick Tree pour prendre en charge les opérations de maximum sur un intervalle au lieu des sommes.
# 2. Modifiez le Fenwick Tree pour fonctionner avec des tableaux 2D (Fenwick Tree 2D).
# 3. Écrivez une fonction pour construire un Fenwick Tree à partir d'un tableau existant en O(n) temps.
# 4. Comparez les performances d'un Fenwick Tree avec un Segment Tree pour des opérations similaires.
# 5. Implémentez un Fenwick Tree qui prend en charge les opérations de multiplication sur des intervalles.
Les Fenwick Trees sont des structures de données puissantes pour gérer efficacement les sommes sur des intervalles et les mises à jour dans des tableaux dynamiques. Ils sont essentiels pour les développeurs travaillant avec des données nécessitant des analyses rapides et fréquentes.