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:
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:
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.