Oubliez les bulles et les bacs : Le tri par seau est le tri le plus rapide !

Ne cliquez pas, car l'algorithme de tri des seaux est probablement la meilleure méthode de tri du monde des produits.

Je sais, c'est une grosse affirmation, mais nous allons voir pourquoi.

Dans cet article sur le tri des seaux

Alors, qu'est-ce que la méthode de tri des seaux ?

En partant du principe que vous cherchez à trier des données dans un tableau, le tri par seau est un excellent point de départ. S'il répond à vos besoins, ne cherchez pas plus loin - votre recherche est terminée !

Le tri d'un tableau d'éléments peut être effectué de deux manières principales : soit en parcourant la liste en comparant chaque valeur à une autre pour trouver l'ordre correct (tri à bulles), soit en attribuant à chaque valeur sa propre zone de stockage et en les déplaçant à leur place respective (tri par bacs).

Le tri par seau utilise cette dernière méthode, c'est-à-dire le tri par bac. Voyons de plus près en quoi il diffère du tri par bacs avant de vous montrer pourquoi le tri par seaux est si efficace.

Très bien, disons que nous avons un tableau contenant 10 entiers, ce sont nos seaux. Nous avons un compteur qui agit comme le nombre d'éléments dans chaque godet - donc quand nous démarrons, ce compteur est égal au nombre d'éléments dans notre tableau, c'est-à-dire 10.

Avant de commencer à trier ce tableau, nous allons remplir chaque godet avec la même valeur - une valeur entière comprise entre 0 et 9 inclus.

Maintenant que les 5 seaux sont pleins, il est temps de passer au tri. Comment savoir quelle est la capacité de chaque seau ? Chaque seau contiendra le double des valeurs qu'il contient actuellement, c'est-à-dire 2n où n = 0...9 (10 seaux). La raison de ce doublement est que lorsque vous regardez dans un seau pour voir si la valeur que vous recherchez s'y trouve, elle n'occupera que 1/10e de l'espace.

Par exemple, le seau 5 contient 8 valeurs (8 * 2) et le plus petit seau suivant, qui contient deux valeurs, en contient 4 (4 * 2). Voyez-vous comment il s'agit d'un doublement vers le bas ?

En regardant notre première valeur à trier, c'est-à-dire 5... nous savons que regarder dans le seau numéro 5 ne prendra qu'une infime fraction de seconde en raison de sa faible capacité. Maintenant, disons que nous voulons trouver où se trouve 34 dans notre tableau - eh bien, regarder dans le seau n°34 ne prendra même pas 0,000000001 seconde ! Cela prendra une éternité car il y a 100000 valeurs dedans !

Bon, je pense que vous avez compris. Maintenant, jetons un coup d'oeil rapide aux alternatives du tri par seau.

Historique de l'algorithme de tri des seaux

Alors, quand cette méthode a-t-elle vu le jour ? On dit que le tri par seau a été inventé en 1955, mais on a découvert par la suite que la méthode existait au moins depuis 1945.

Il a commencé à gagner du terrain dans les années 1970, mais n'a pas été largement adopté avant 1995, lorsque la vitesse des ordinateurs a vraiment commencé à augmenter.

De nos jours, le tri par seau est devenu l'un des algorithmes de tri les plus populaires - troisième après le tri par fusion et le tri rapide ! Bien que cela ne semble pas être un gros problème car le bin sort et le bucket sort sont généralement O(n * log(n)), si vos données sont volumineuses, vous voudrez de toute façon utiliser le bucket sort en raison de sa manière efficace de faire des comparaisons.

Qu'est-ce que le tri par bacs et bulles ?

Dans le tri par bacs, l'idée est d'avoir une "zone" distincte pour chaque valeur à trier. Voici un exemple de mise en œuvre du tri bin :

Cette mise en œuvre n'est probablement pas plus rapide que le tri par seau et sa complexité temporelle est à peu près la même que celle du tri par seau, mais que se passerait-il si nous pouvions gagner un tout petit peu plus ? Eh bien, c'est possible !

Tri à bulles et tri à godets - Quelle est la place du tri à bulles dans cette équation ?

Avec le tri à bulles, tout ce que vous faites est de comparer deux valeurs adjacentes et de les échanger si nécessaire (une approche par force brute). La seule différence avec le tri par godets est la taille de ces godets. Dans le tri à bulles, ils sont tous de taille égale. Si vous leur donnez la même taille que le plus grand seau dans un tri par seaux, vous obtenez un tri par seaux !

Tri à bulles et tri par seau - Pourquoi le tri par seau est-il plus rapide ?

En un mot, la complexité temporelle du tri à bulles est O(n^2). La complexité temporelle du tri par seau peut être trouvée en multipliant toutes les branches qu'il faudra pour trouver des éléments à l'intérieur de celui-ci, c'est-à-dire regarder à l'intérieur de chaque seau jusqu'à ce que finalement nous l'ayons trouvé ou que nous ne soyons pas allés assez loin.

Si nous faisions cela pour 10 seaux contenant chacun 100 000 articles... eh bien... je ne pense pas que notre système tiendrait très longtemps - c'est aussi la raison pour laquelle le tri par bac ne fonctionne pas très bien, car non seulement nous avons le doublement, mais nous ajoutons un autre facteur qui devient exponentiellement lent.

Maintenant, que se passe-t-il si nous laissons le tri par seau contenir 10 seaux avec 100000 éléments dans chacun ? Combien de temps prend le tri par seau maintenant ? O(n) (linéaire) !

C'est exact. C'est la même chose que si nous devions effectuer une recherche linéaire dans un tableau de 100 000 entiers ! Toutes les branches et vérifications que l'algorithme du tri par seau effectue en coulisse peuvent être ramenées à "cet entier est-il inférieur ou supérieur à celui que je recherche ?

Tri des seaux Big O

La notation Big O de Bucket Sort est O(n + n * k), où n = nombre d'éléments dans le tableau et k = nombre de seaux.

Complexité du temps de tri des seaux

La complexité temporelle d'un tri par godets est fonction du nombre de godets. Un tri par godets avec un seul godet prendra un temps constant, mais les tris par godets avec plus d'un godet auront un temps d'exécution additif car il y a toujours deux opérations effectuées à chaque étape : 1) vérifier si l'élément a déjà été placé et 2) le placer à son emplacement correct. Le choix de ce facteur multiplicatif constant vous appartient - quelle taille voulez-vous donner à vos structures de données ? En règle générale, les optimisations de ce type ne sont pas nécessaires avant d'atteindre un très grand nombre d'éléments.

Tri des seaux Java

Pour mettre en œuvre un algorithme de tri par seau en Java, vous devez d'abord créer la structure de données du seau - une structure qui peut contenir au moins autant d'éléments que ceux qui lui seront donnés. Le moyen le plus simple serait probablement d'utiliser une ArrayList avec des capacités d'auto-expansion, mais si vous préférez les listes liées ou autre, c'est à vous de voir ! Je ne suis pas là pour vous dire comment programmer vos propres algorithmes de tri...

import java.util.*; class BucketSort { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here List<Integer> arr = new ArrayList<Integer>(); for (int i = 0; i < 100000; i++) { arr.add(i); } Bucket sortBucketSort = new BucketSort(); String bucketName = “”; int[] bucketArray = null; System.out.println(“Please input the number of buckets you would like to use.”); int bucketNumInput = Integer.parseInt( JOptionPane.showInputDialog(“How many buckets do you want?”)); if (bucketNumInput < 1) { JOptionPane.showMessageDialog(null, “Invalid Number”); return; } if (arr == null) { arr = new ArrayList<Integer>(); } bucketArray=new int [bucketNumInput]; for (int i=0; i<bucketNumInput ;i++){ bucketArray [i]=arr.size(); } Arrays.sort(bucketArray); for (int i=0; i<bucketArray.length-1; i++) { bucketName = Integer.toString(bucketArray [i]); System.out.println(“Working on bucket ” + bucketName); // inserts data from array to proper location int j = 0; while (j < arr.size()) { if (arr.get(j) > bucketArray [i+1]) { break; } else if (arr.get(j) <= bucketArray [i+1]) { continue; } else { arr.set(j, bucketArray [i+1]); j++; } } bucketArray [i] = arr.size(); // delete from array } System.out.println(“All done!”); for (int i=0; i<bucketArray.length-1; i++) { System.out.println(“Working on bucket ” + bucketName); System.out .print(bucketName + “, you have ” + arr.get(bucketArray [i])); if (arr.get(bucketArray [i]) != 0) { bucketName = Integer .toString(bucketArray [i]); System.out .print(“Removing ” + bucketName); arr .remove(bucketArray [i]); }

Ouf ! C'est une longue ligne de code

Algorithme de tri des seaux - Algorithme de tri le plus rapide du bloc...

Vous savez donc maintenant ce qu'est l'algorithme de tri des seaux. Il s'agit d'un moyen très rapide de trier de grandes quantités de données et il est particulièrement utile pour trier des données en mémoire. En utilisant l'algorithme de tri par seau, vous pouvez trier rapidement 100 000 entiers - une impossibilité pour toutes sortes d'autres algorithmes de tri ! Qu'en pensez-vous ? Sera-t-il désormais votre méthode de tri rapide préférée ?

tl;dv pour les entreprises
tl;dv vous aide (enfin) à tirer profit des réunions au sein de l'organisation. Enregistrez, transcrivez, résumez, générez et automatisez des informations sur les réunions qui vous sont utiles, à vous et à votre organisation. Installation en quelques minutes.
Enregistrements et transcriptions illimités
Résumés sur l'IA
Demandez à tl;dv AI
Fonctionne en plus de 30 langues
Rapports AI sur les réunions multiples
+5000 intégrations

tl;dv Blog

S'abonner à nos blogs

Abonnez-vous et restez au courant des derniers conseils et nouvelles sur les réunions, les ventes, Customer Success, la productivité et la culture du travail.