Le tri rapide, utilise la principe diviser pour régner en:
Diviser : partitionne une liste grâce à un pivot de la liste: les inférieurs au pivot, le pivot et ceux supérieur au pivot.
Régner : Pour trier les parties inférieur et supérieur, on applique récursivement le même partitionnement, jusqu'à obtenir des partitions de 0 ou 1 élément (donc déjà triées).
Le point faible principal de la version précédente est la re copie des listes.
On peut éviter cela grâce à des permutations.
On va aussi améliorer en mettant tous les éléments du tableau égal au pivot côte à côte.
On utilise une fonction partition qui partitionne par rapport au pivot (ici premier éléments des éléments à partitionner) les éléments compris entre les indice debut et fin. La méthode utilisée au sein de cette fonction est celle du tri du drapeau hollandais.
Le code suivant utilise des fonctions définies au sein d'une autre fonction.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Pour multiplier deux nombres de n chiffres, la méthode naïve multiplie chaque chiffre du multiplicateur par chaque chiffre du multiplicande. Cela exige donc \(n^2\) produits de deux chiffres. Le temps de calcul est en \(\mathcal{O}(n^2)\).
En 1960, Karatsuba remarque que pour tout k, le calcul naïf d'un produit :
est une utilisation de la méthode diviser pour régner : elle effectue 4 multiplications avec des instances de taille environ \(n / 2\). Mais cela ne fait pas gagner en complexité, en effet \(4\times \mathcal{O}((n/ 2)^2) = \mathcal{O}(n^2)\)
Si cette multiplication semble nécessiter les quatre produits \(ac\), \(ad\), \(bc\) et \(bd\), elle peut en fait être effectué seulement avec les trois produits \(ac\), \(bd\) et \((a – b)(c – d)\) en regroupant les calculs sous la forme suivante :
Ainsi en calculant et mémorisant \(ac\) et \(bd\), il n y a avec cette méthode que 3 multiplications à effectuer. (les soustractions sont effectués en \(\mathcal{O}(n)\)
Complète le code qui permet de calculer le produit de \(m\) par \(n\)
avec \(m = a\times 10^{k}+b\) avec \(k\) partageant n, tels que \(a\) et \(b\) aient le nombre de chiffres le plus proches.
\(n = c\times 10^{k}+d\)
Astuces
le nombre de chiffres de l'écriture décimale d'un nombre m est égal à int(math.log10(n)) + 1
utiliser % 10 ** k et // 10 ** k pour calculer a,b,c,d.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
###(Dés-)Active le code après la ligne # Tests (insensible à la casse) (Ctrl+I)
Entrer ou sortir du mode "deux colonnes" (Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran" (Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)