Actualiser Readme.md
This commit is contained in:
parent
c0f05af956
commit
14803e0cbd
111
Readme.md
111
Readme.md
@ -71,35 +71,68 @@ O(\text{grades\_number} \cdot \text{students\_number}^3)
|
|||||||
|
|
||||||
#### **Exercice 3**
|
#### **Exercice 3**
|
||||||
|
|
||||||
|
Voici ma réponse reformulée comme si j'étais un étudiant :
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### **Algorithme proposé**
|
### **Algorithme proposé**
|
||||||
|
|
||||||
Pour trier un tableau à \( N \)-dimensions avec \( M \) valeurs par dimension, voici l'algo.
|
1. **Tri des sous-dimensions** :
|
||||||
|
- Si on est sur un tableau 1D (le plus bas niveau), on le trie avec un tri par insertion.
|
||||||
|
|
||||||
#### Étapes de l’algorithme :
|
2. **Calcul des sommes des sous-dimensions** :
|
||||||
|
- Pour chaque sous-tableau, on calcule la somme des valeurs pour s’en servir comme critère de tri.
|
||||||
|
|
||||||
1. Si on est au niveau d’un tableau 1D (dimension la plus basse), on le trie directement.
|
3. **Tri des sous-dimensions par leurs sommes** :
|
||||||
2. Sinon :
|
- On trie les sous-dimensions avec un tri par insertion basé sur les sommes calculées.
|
||||||
- Trier chaque sous-dimension récursivement.
|
|
||||||
- Calculer la somme des valeurs de chaque sous-dimension.
|
|
||||||
- Trier les sous-dimensions en fonction de leurs sommes.
|
|
||||||
|
|
||||||
|
4. **Répétition pour les autres dimensions** :
|
||||||
|
- On applique ces étapes de façon récursive à chaque niveau du tableau.
|
||||||
|
|
||||||
### **Implémentation en Python**
|
---
|
||||||
|
|
||||||
Voici l’algorithme en code :
|
### **Implémentation**
|
||||||
|
|
||||||
|
Voici l'algorithme en Python :
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
# Fonction pour trier un tableau 1D avec un tri par insertion
|
||||||
|
def insertion_sort(arr):
|
||||||
|
for i in range(1, len(arr)):
|
||||||
|
key = arr[i]
|
||||||
|
j = i - 1
|
||||||
|
# Déplacement des éléments plus grands que key
|
||||||
|
while j >= 0 and arr[j] > key:
|
||||||
|
arr[j + 1] = arr[j]
|
||||||
|
j -= 1
|
||||||
|
arr[j + 1] = key
|
||||||
|
|
||||||
|
# Fonction pour trier un tableau multidimensionnel récursivement
|
||||||
def recursive_sort(T):
|
def recursive_sort(T):
|
||||||
# Si c'est un tableau 1D, on le trie directement
|
# Si c'est un tableau 1D, on le trie
|
||||||
if not isinstance(T[0], list):
|
if not isinstance(T[0], list):
|
||||||
return sorted(T)
|
insertion_sort(T)
|
||||||
|
return T
|
||||||
|
|
||||||
# Sinon, on trie chaque sous-dimension récursivement
|
# Trier chaque sous-dimension
|
||||||
for i in range(len(T)):
|
for i in range(len(T)):
|
||||||
T[i] = recursive_sort(T[i])
|
T[i] = recursive_sort(T[i])
|
||||||
|
|
||||||
# Puis on trie le tableau actuel selon la somme des sous-dimensions
|
# Calculer les sommes des sous-dimensions
|
||||||
T.sort(key=lambda x: sum(sum(val) if isinstance(val, list) else val for val in x))
|
sums = [sum(sum(val) if isinstance(val, list) else val for val in sublist) for sublist in T]
|
||||||
|
|
||||||
|
# Trier les sous-dimensions en fonction de leurs sommes
|
||||||
|
for i in range(1, len(T)):
|
||||||
|
key_sum = sums[i]
|
||||||
|
key_sublist = T[i]
|
||||||
|
j = i - 1
|
||||||
|
while j >= 0 and sums[j] > key_sum:
|
||||||
|
sums[j + 1] = sums[j]
|
||||||
|
T[j + 1] = T[j]
|
||||||
|
j -= 1
|
||||||
|
sums[j + 1] = key_sum
|
||||||
|
T[j + 1] = key_sublist
|
||||||
|
|
||||||
return T
|
return T
|
||||||
|
|
||||||
# Exemple avec un tableau 2D
|
# Exemple avec un tableau 2D
|
||||||
@ -108,55 +141,57 @@ resultat = recursive_sort(tableau)
|
|||||||
print(resultat) # Résultat attendu : [[0, 2, 3], [1, 3, 4], [4, 5, 9]]
|
print(resultat) # Résultat attendu : [[0, 2, 3], [1, 3, 4], [4, 5, 9]]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### **Exemple d’exécution**
|
### **Exemple d’exécution**
|
||||||
|
|
||||||
Pour le tableau donné :
|
Prenons le tableau suivant :
|
||||||
\[ [ [0, 3, 2], [9, 4, 5], [4, 1, 3] ] \]
|
\[ [ [0, 3, 2], [9, 4, 5], [4, 1, 3] ] \]
|
||||||
|
|
||||||
1. **Trier chaque ligne individuellement** :
|
1. **Trier chaque ligne** :
|
||||||
|
- Première ligne : \( [0, 3, 2] \rightarrow [0, 2, 3] \)
|
||||||
|
- Deuxième ligne : \( [9, 4, 5] \rightarrow [4, 5, 9] \)
|
||||||
|
- Troisième ligne : \( [4, 1, 3] \rightarrow [1, 3, 4] \)
|
||||||
\[
|
\[
|
||||||
[ [0, 2, 3], [4, 5, 9], [1, 3, 4] ]
|
[ [0, 2, 3], [4, 5, 9], [1, 3, 4] ]
|
||||||
\]
|
\]
|
||||||
|
|
||||||
2. **Calculer la somme des valeurs pour chaque ligne** :
|
2. **Calculer les sommes** :
|
||||||
- Première ligne : \( 0 + 2 + 3 = 5 \)
|
- \( [0, 2, 3] \rightarrow 5 \)
|
||||||
- Deuxième ligne : \( 4 + 5 + 9 = 18 \)
|
- \( [4, 5, 9] \rightarrow 18 \)
|
||||||
- Troisième ligne : \( 1 + 3 + 4 = 8 \)
|
- \( [1, 3, 4] \rightarrow 8 \)
|
||||||
|
|
||||||
3. **Trier les lignes en fonction de leurs sommes** :
|
3. **Trier les lignes en fonction des sommes** :
|
||||||
\[
|
\[
|
||||||
[ [0, 2, 3], [1, 3, 4], [4, 5, 9] ]
|
[ [0, 2, 3], [1, 3, 4], [4, 5, 9] ]
|
||||||
\]
|
\]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### **Complexité de l’algorithme**
|
### **Complexité**
|
||||||
|
|
||||||
#### Analyse :
|
#### Analyse :
|
||||||
|
|
||||||
1. **Pour la dimension la plus basse (1D)** :
|
1. **Tri des tableaux 1D** :
|
||||||
- Trier \( M \) éléments coûte \( O(M \log M) \).
|
- Pour \( M \) éléments, le tri par insertion a une complexité de \( O(M^2) \).
|
||||||
|
|
||||||
2. **Pour les dimensions supérieures (\( N > 1 \))** :
|
2. **Tri des sous-tableaux (dimensions \( N > 1 \))** :
|
||||||
- Chaque dimension contient \( M^{N-1} \) sous-tableaux.
|
- Chaque sous-tableau contient \( M^{N-1} \) éléments. Trier ces sous-tableaux coûte \( O(M^{N-1} \cdot M^{N-1}) = O(M^{2(N-1)}) \).
|
||||||
- Trier ces sous-tableaux coûte \( O(M^{N-1} \log M^{N-1}) \).
|
|
||||||
- Calculer les sommes pour ces sous-tableaux prend \( O(M^N) \).
|
|
||||||
|
|
||||||
3. **Récursivité sur \( N \) dimensions** :
|
3. **Calcul des sommes** :
|
||||||
- La complexité totale est donnée par la somme :
|
- Calculer les sommes pour \( M^{N-1} \) sous-tableaux coûte \( O(M^N) \).
|
||||||
|
|
||||||
|
4. **Complexité totale** :
|
||||||
|
- L'algorithme s’applique de façon récursive sur \( N \) dimensions. La partie dominante vient du tri des sous-tableaux les plus grands :
|
||||||
\[
|
\[
|
||||||
T(N, M) = O(M^N \log M + M^{N-1} \log M^{N-1} + \dots + M \log M)
|
T(N, M) = O(M^{2N-2})
|
||||||
\]
|
|
||||||
- La partie dominante est celle de la dimension principale :
|
|
||||||
\[
|
|
||||||
T(N, M) = O(M^N \log M)
|
|
||||||
\]
|
\]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
### **Conclusion**
|
### **Conclusion**
|
||||||
|
|
||||||
- - La complexité globale est
|
La complexité globale est
|
||||||
\[
|
\[
|
||||||
O(M^N \log M)
|
O(M^{2N-2})
|
||||||
\]
|
\]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user