Como funciona um algoritmo de classificação no local

Como funciona um algoritmo de classificação no local

1. Introdução

Neste tutorial, vamos explicar como funciona o algoritmo de classificação no local.

2. Algoritmos no local

The in-place algorithms are those that don’t need any auxiliary data structure in order to transform the input data. Basicamente, significa que o algoritmo não usa espaço extra para manipulação de entrada. Substitui praticamente a entrada pela saída.

No entanto, na realidade, o algoritmo realmente pode exigir um espaço adicional pequeno e não constante para variáveis ​​auxiliares. The complexity of this space is in most cases O(log n), although sometimes anything less than linear is allowed.

3. Pseudo-código

Vamos agora ver alguns pseudocódigos e comparar o algoritmo no local com o fora do local.

Assumiremos que queremos inverter uma matriz de númerosn.

3.1. Algoritmo no local

Se pensarmos sobre o problema, veremos que temos uma matriz de entrada e uma matriz invertida como saída. No final, não precisamos realmente do nosso array original, apenas o reverso.

Então, por que não substituiríamos a entrada em vez de mover seus valores para a matriz completamente nova, já que pode parecer o método mais óbvio? Para fazer isso,we’ll only need one additional variable para armazenar temporariamente os valores com os quais estamos trabalhando no momento:

reversInPlace(array A[n])
    for i from 0 to n/2
    temp = A[i]
    A[i] = A[n - 1 - i]
    A[n - 1 - i] = temp

É digno de nota mencionar que não importa o tamanho da matriz, o espaço extra de que precisamos sempre seráO(1) neste caso.

A ilustração mostra que precisamos de menos etapas do que no caso anterior:

image

3.2. Algoritmo fora do local

Por outro lado, também podemos fazer isso de uma maneira bem simples e mais óbvia. Podemos criar uma nova matriz do mesmo tamanho, copiar os valores da original na ordem correspondente e excluir a matriz original:

reverseOutOfPlace(array A[n])
    create new array B[n]
    for i from 0 to n - 1
        B[i] = A[i]
    delete A
    return B

Embora isso faça o que queríamos, não é eficiente o suficiente. We have O(n) extra space requiredsince we have two arrays to manipulate with. Além disso, criar e remover uma nova matriz geralmente é uma operação lenta.

Vamos ver a ilustração do processo:

image

4. Implementação Java

Vamos agora ver como podemos implementar em Java o que aprendemos na seção anterior.

Em primeiro lugar, vamos implementar um algoritmo no local:

public static int[] reverseInPlace(int A[]) {
    int n = A.length;
    for (int i = 0; i < n / 2; i++) {
        int temp = A[i];
        A[i] = A[n - 1 - i];
        A[n - 1 - i] = temp;
    }
    return A;
}

Podemos testar facilmente se isso funciona conforme o esperado:

@Test
public void givenArray_whenInPlaceSort_thenReversed() {
    int[] input = {1, 2, 3, 4, 5, 6, 7};
    int[] expected = {7, 6, 5, 4, 3, 2, 1};
    assertArrayEquals("the two arrays are not equal", expected,
      InOutSort.reverseInPlace(input));
}

Em segundo lugar, vamos verificar a implementação do algoritmo fora do lugar:

public static int[] reverseOutOfPlace(int A[]) {
    int n = A.length;
    int[] B = new int[n];
    for (int i = 0; i < n; i++) {
        B[n - i - 1] = A[i];
    }
    return B;
}

O teste é bem direto:

@Test
public void givenArray_whenOutOfPlaceSort_thenReversed() {
    int[] input = {1, 2, 3, 4, 5, 6, 7};
    int[] expected = {7, 6, 5, 4, 3, 2, 1};
    assertArrayEquals("the two arrays are not equal", expected,
      InOutSort.reverseOutOfPlace(input));
}

5. Exemplos

Existem muitos algoritmos de classificação que usam a abordagem no local. Alguns deles sãoinsertion sort,bubble sort,heap sort,quicksort eshell sort e você pode aprender mais sobre eles e verificar suas implementações Java.

Além disso, precisamos mencionar a classificação do tipo comb e o heapsort. Todos eles têm complexidade de espaçoO(log n).

Também pode ser útil aprender mais sobreTheory of Big-O Notation, bem como verificar algunsPractical Java Examples about the complexity of the algorithm.

6. Conclusão

Neste artigo, descrevemos os chamados algoritmos no local, ilustramos como eles funcionam usando pseudocódigo e alguns exemplos, listamos vários algoritmos que funcionam com esse princípio e finalmente implementamos os exemplos básicos em Java.

Como de costume, todo o código pode ser encontradoover on GitHub.