Classificação de balde em Java

Classificação de balde em Java

1. Introdução

Neste artigo, vamos mergulhar nobucket sort algorithm.. Começaremos com umbit of theory, before working on the Java implementation rápido junto com o teste de unidade de nossa solução. Finalmente, vamoslook at the time complexity de classificação de bucket.

2. A teoria da classificação de baldes

A classificação por balde, às vezes conhecida como classificação em lixeira, é um algoritmo de classificação específico. A classificação funciona distribuindo os elementos que queremos classificar em vários buckets classificados individualmente. Ao fazer isso, podemos reduzir o número de comparações entre os elementos e ajudar a reduzir o tempo de classificação.

Vamos dar uma olhada rápida emsteps required to perform a bucket sort:

  1. Configure uma variedade de nossos baldes inicialmente vazios

  2. Distribua nossos elementos em seus baldes apropriados

  3. Classifique cada balde

  4. Concatene os buckets classificados juntos para recriar a lista completa

3. Implementação Java

Embora este algoritmo não seja específico de uma linguagem, implementaremos a classificação em Java. Vamos percorrer a lista acima passo a passo e escrever o código para classificar uma lista de inteiros.

3.1. Configuração da caçamba

Primeiro, nósneed to determine a hashing algorithm para decidir qual de nossos elementos é colocado em qual balde:

private int hash(int i, int max, int numberOfBuckets) {
    return (int) ((double) i / max * (numberOfBuckets - 1));
}

Com nosso método hash definido, agora podemosspecify the number of bins as a square root of the input list size:

final int numberOfBuckets = (int) Math.sqrt(initialList.size());
List> buckets = new ArrayList<>(numberOfBuckets);
for(int i = 0; i < numberOfBuckets; i++) {
    buckets.add(new ArrayList<>());
}

Finalmente, precisamos de um método curto para determinar o número máximo máximo em nossa lista de entradas:

private int findMax(List input) {
    int m = Integer.MIN_VALUE;
    for (int i : input) {
        m = Math.max(i, m);
    }
    return m;
}

3.2. Distribuindo os elementos

Agora que temos nossos intervalos definidos, podemosdistribute each element of our input list into its relevant bucket using the hash method:

int max = findMax(initialList);

for (int i : initialList) {
    buckets.get(hash(i, max, numberOfBuckets)).add(i);
}

3.3. Classificando os baldes individuais

Com nossos intervalos definidos e cheios de inteiros,let’s use a Comparator to sort them:

Comparator comparator = Comparator.naturalOrder();

for(List bucket  : buckets){
    bucket.sort(comparator);
}

3.4. Concatenando nossos baldes

Finalmente, precisamos reunir nossos baldes para recriar a lista única. Como nossos depósitos são classificados, precisamos apenas percorrer cada depósito uma vez e anexar os elementos a uma lista principal:

List sortedArray = new LinkedList<>();

for(List bucket : buckets) {
    sortedArray.addAll(bucket);
}

return sortedArray;

4. Testando nosso código

Com nossa implementação concluída, vamos escrever um teste de unidade rápido para garantir que funcione conforme o esperado:

BucketSorter sorter = new IntegerBucketSorter();

List unsorted = Arrays.asList(80,50,60,30,20,10,70,0,40,500,600,602,200,15);
List expected = Arrays.asList(0,10,15,20,30,40,50,60,70,80,200,500,600,602);

List sorted = sorter.sort(unsorted);

assertEquals(expected, sorted);

5. Complexidade temporal

A seguir, vamos dar uma olhada rápida na complexidade de tempo de realizar uma classificação de bucket.

5.1. Pior cenário

Em nosso pior cenário, encontraríamosall of our elements in the same bucket and in reverse order.. Quando esse caso ocorre, estamos reduzindo nossa classificação de intervalo a uma classificação simples em que cada elemento é comparado a todos os outros elementos,yielding a time complexity of O(n²).

5.2. Cenário Médio de Caso

Em nosso caso médio, descobrimos queelements are relatively evenly distributed among our input buckets.. Como cada uma de nossas etapas requer apenas uma iteração por meio de nossos depósitos de entrada, descobrimos que nosso depósito classificacompletes in O(n) time.

6. Conclusão

Neste artigo, vimos como implementar uma classificação de bucket em Java. Também analisamos a complexidade de tempo do algoritmo de classificação de bucket.

Como sempre, o código mostrado neste artigo está disponívelover on GitHub.