Chega de bolhas e caixas: A classificação por balde é a mais rápida!

Não deixe de clicar, pois o algoritmo Bucket Sort é possivelmente o melhor método de classificação do mundo dos produtos.

Grande afirmação, sim, eu sei - mas vamos explicar o porquê.

Neste artigo do Bucket Sort

Então, o que é o Bucket Sorting Method?

Partindo do pressuposto de que você está procurando classificar dados em uma matriz, o bucket sort é um ótimo ponto de partida. Se ele atender às suas necessidades, não procure mais - sua busca acabou!

A classificação de uma matriz de itens pode ser feita de duas maneiras principais: percorrendo a lista e comparando cada valor com outro para encontrar a ordem correta (classificação por bolhas) ou dando a cada valor sua própria área de armazenamento e movendo-os para seus respectivos lugares (classificação por caixas).

O Bucket Sort funciona usando o último método, ou seja, o bin sort. Vamos dar uma olhada mais de perto em como ele difere do bin sort antes de mostrarmos por que o bucket sort é tão bom.

Muito bem, digamos que temos uma matriz contendo 10 números inteiros, esses são os nossos buckets. Temos um contador que atua como o número de itens em cada balde; portanto, quando iniciamos, esse contador é igual ao número de elementos em nossa matriz, ou seja, 10.

Antes de começarmos a classificar essa matriz, vamos preencher cada balde com o mesmo valor: um valor inteiro entre 0 e 9, inclusive.

Agora que todos os 5 baldes estão cheios, é hora de passar para a classificação. Como sabemos qual é a capacidade de cada balde? Cada balde conterá o dobro dos valores atualmente contidos nele, ou seja, 2n onde n = 0...9 (10 baldes). A razão para dobrar as coisas aqui é porque quando você for olhar dentro de um balde para ver se o valor que está procurando está lá, ele ocupará apenas 1/10 do espaço.

Por exemplo, o balde 5 contém 8 valores (8 * 2) e o próximo balde menor, que contém dois valores, conteria 4 (4 * 2). Percebe como isso está duplicando até o fim?

Observando o nosso primeiro valor a ser classificado, ou seja, 5... sabemos que procurar dentro do balde número 5 levará apenas uma pequena fração de segundo devido à sua baixa capacidade. Agora, digamos que queiramos descobrir onde está o 34 em nossa matriz - bem, procurar dentro do balde nº 34 não levará nem 0,000000001 segundos! Levará uma eternidade porque há 100.000 valores lá dentro!

Muito bem, acho que você entendeu o que quero dizer. Agora vamos dar uma olhada rápida nas alternativas do Bucket Sort.

Histórico do algoritmo Bucket Sort

Então, quando esse método começou? Acredita-se que o Bucket Sort tenha sido inventado em 1955, mas descobriu-se mais tarde que o método já existia pelo menos desde 1945.

Ele começou a ganhar força na década de 1970, mas ainda não era amplamente adotado até 1995, quando as velocidades dos computadores realmente começaram a decolar.

Atualmente, o bucket sort se tornou um dos algoritmos de classificação mais populares do mercado - em terceiro lugar, depois do merge sort e do quick sort! Embora isso possa não parecer grande coisa, pois tanto o bin sort quanto o bucket sort são, em geral, O(n * log(n)), se os seus dados forem grandes, você desejará usar o bucket sort de qualquer forma devido à sua maneira eficiente de fazer comparações.

O que é Bin e Bubble Sort?

No Bin Sort, a ideia é ter uma "área" separada para cada valor que está sendo classificado. Aqui está um exemplo de implementação de classificação de compartimento:

Essa implementação provavelmente não é mais rápida do que o Bucket Sort e tem praticamente a mesma complexidade de tempo que o bucket sort, mas e se pudéssemos cortar aquele pouquinho a mais? Bem, nós podemos!

Bubble Sort vs Bucket Sort - Como o Bubble Sort se encaixa nessa equação?

Com a classificação por bolhas, tudo o que você faz é comparar dois valores adjacentes e trocá-los, se necessário (uma abordagem de força bruta). A única diferença com a classificação por balde é o tamanho desses baldes; na classificação por bolha, eles são todos do mesmo tamanho. Se você fizer com que eles tenham o mesmo tamanho do maior balde em uma classificação por balde, terá uma classificação por balde!

Bubble Sort vs. Bucket Sort - Por que o Bucket Sort é mais rápido?

Em resumo, a complexidade de tempo do bubble sort é O(n^2). A complexidade de tempo do bucket sort pode ser encontrada multiplicando-se todas as ramificações necessárias para encontrar elementos dentro dele, ou seja, procurar dentro de cada um dos baldes até que, eventualmente, o encontremos ou não tenhamos nos aprofundado o suficiente.

Se fizéssemos isso para 10 compartimentos com 100.000 itens em cada um... bem... não acho que nosso sistema duraria muito tempo - esse também é o motivo pelo qual a classificação de compartimentos não funciona muito bem, porque não apenas temos a duplicação, mas também adicionamos outro fator que se torna exponencialmente lento.

Agora, e se deixarmos o bucket sort conter 10 buckets com 100.000 itens em cada um? Quanto tempo é necessário para o bucket sort agora? O(n) (linear)!

É isso mesmo. O mesmo que se fizéssemos uma pesquisa linear em uma matriz de 100.000 números inteiros! Todas as ramificações e verificações que o algoritmo de bucket sort está fazendo nos bastidores podem ser resumidas em "este número inteiro é menor ou maior do que aquele que estou procurando", que também seria encontrado usando uma pesquisa linear.

Classificação de balde Big O

A notação Big O do Bucket Sort é O(n + n * k), em que n = número de elementos na matriz e k = número de buckets.

Complexidade de tempo do Bucket Sort

A complexidade de tempo de um bucket sort é uma função do número de buckets. Um bucket sort com um bucket levará um tempo constante, mas os bucket sorts com mais de um bucket terão um tempo de execução aditivo porque sempre há duas operações realizadas em cada etapa: 1) verificar se o elemento já foi colocado e 2) colocá-lo no local correto. A escolha desse fator multiplicativo constante fica a seu critério: qual o tamanho desejado para suas estruturas de dados? De modo geral, otimizações como essa podem não ser necessárias até atingirmos um número muito grande de itens.

Classificação de balde Java

Para implementar um algoritmo de classificação de balde em Java, você precisará criar primeiro a estrutura de dados do balde - uma estrutura que possa conter pelo menos tantos elementos quanto os que serão fornecidos a ela. Provavelmente, a maneira mais fácil seria usar uma ArrayList com recursos de expansão automática, mas se você preferir listas vinculadas ou qualquer outra coisa, a decisão é sua! Não estou aqui para lhe dizer como programar seus próprios algoritmos de classificação...

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]); }

Ufa! Essa é uma longa linha de código

Algoritmo Bucket Sort - o algoritmo de classificação mais rápido do mercado...

Então, agora você sabe o que é o algoritmo de classificação de balde. É uma maneira muito rápida de classificar grandes blocos de dados e é especialmente útil na classificação de dados na memória. Usando o algoritmo de classificação de balde, você pode classificar rapidamente 100.000 números inteiros - uma impossibilidade para todos os tipos de outros algoritmos de classificação! O que você acha? Esse será seu método de classificação rápida de agora em diante?

tl;dv para empresas
tl;dv ajuda você a (finalmente) obter valor das reuniões em toda a organização. Grave, transcreva, resuma, gere e automatize insights de reuniões valiosos para você e sua organização. Configure em minutos.
Gravações e transcrições ilimitadas
Resumos de IA
Pergunte a tl;dv AI
Funciona em mais de 30 idiomas
Relatórios de IA para várias reuniões
+5000 integrações