Algoritmos de Classificação Estável

Algoritmos de Classificação Estável

1. Visão geral

Neste tutorial, aprenderemos o que são algoritmos de classificação estável e como funcionam. Além disso, vamos explorar quando a estabilidade da classificação é importante.

2. Estabilidade na classificação de algoritmos

A estabilidade de um algoritmo de classificação está relacionada ahow the algorithm treats equal (or repeated) elements. Os algoritmos de classificação estáveis ​​preservam a ordem relativa dos elementos iguais, enquanto os algoritmos de classificação instáveis ​​não. Em outras palavras, a classificação estável mantém a posição de dois elementos iguais em relação um ao outro.

SejaA uma coleção de elementos e strict weak ordering nos elementos. Além disso, sejaB a coleção de elementos emA na ordem de classificação. Vamos considerar dois elementos iguais emA nos índicesiej, ou seja,A[i]eA[j], que terminam nos índicesm e n respectivamente emB. Podemos classificar a classificação como estável se:

i < j and A[i] = A[j] and m < n

Vamos entender o conceito com a ajuda de um exemplo. Temos uma matriz de inteiros A:[ _5, 8, 9, 8, 3] _. Vamos representar nossa matriz usando bolas codificadas por cores, onde quaisquer duas bolas com o mesmo inteiro terão uma cor diferente, o que nos ajudaria a manter o controle de elementos iguais (8 em nosso caso):image A classificação estável mantém a ordem de as duas bolas iguais numeradas 8, enquanto a classificação instável pode inverter a ordem relativa dos dois 8s.

3. Quando a estabilidade é importante

3.1. Distinguir entre elementos iguais

Todos os algoritmos de classificação usam uma chave para determinar a ordem dos elementos na coleção, chamadasort key.

Se a chave de classificação for o próprio elemento (inteiro), elementos iguais são indistinguíveis, como números inteiros ou seqüências de caracteres.

Por outro lado, elementos iguais são distinguíveis se a chave de classificação for composta por um ou mais, mas não todos os atributos do elemento, comoage em uma classeEmployee.

3.2. A classificação estável é importante, às vezes

Nem sempre precisamos de uma classificação estável. A estabilidade não é uma preocupação se:

  • elementos iguais são indistinguíveis, ou

  • todos os elementos da coleção são distintos

Quandoequal elements are distinguishable, stability is imperative. Por exemplo, se a coleção já tiver algum pedido, a classificação em outra chave deverá preservar esse pedido.

Por exemplo, digamos que estejamos computando a contagem de palavras de cada palavra distinta em um arquivo de texto. Agora, precisamos relatar os resultados em ordem decrescente de contagem e, posteriormente, classificados em ordem alfabética, caso duas palavras tenham a mesma contagem:

Input:
how much wood would woodchuck chuck if woodchuck could chuck wood

Output:
chuck       2
wood        2
woodchuck   2
could       1
how         1
if          1
much        1
would       1

Depois de ordenar os elementos por contagem, precisamos classificá-lo ainda mais lexicograficamente. Nesse ponto, o algoritmo de classificação deve manter a ordem relativa das contagens:

First pass, sorted by count:
(wood, 2)
(chuck, 2)
(woodchuck, 2)
(much, 1)
(could, 1)
(would, 1)
(if, 1)
(how, 1)

Second pass, sorted lexicographically while preserving the previous relative order:
(chuck, 2)
(wood, 2)
(woodchuck, 2)
(could, 1)
(how, 1)
(if, 1)
(much, 1)
(would, 1)

3.3. Classificação Radix

Radix Sort é um algoritmo de ordenação de número inteiro quedepends on a sorting subroutine that must be stable. É um algoritmo de classificação não baseado em comparação que classifica uma coleção de números inteiros. Ele agrupa chaves por dígitos individuais que compartilham a mesma posição e valor significativos.

Vamos desvendar a definição formal e reafirmar a ideia básica:

for each digit 'k' from the least significant digit (LSD) to the most significant digit (MSD) of a number:
  apply counting-sort algorithm on digit 'k' to sort the input array

Estamos usandoCounting Sort como uma sub-rotina no Radix Sort. Classificação de contagem é um algoritmo de classificação inteira estável. Não precisamos entender como funciona, mas queCounting Sort is stable.

Vejamos um exemplo ilustrativo:image Cada invocação da sub-rotina de Classificação de contagem preserva a ordem das invocações anteriores. Por exemplo, ao classificar o dígito de posição das dezenas (segunda invocação) 9881 muda para baixo, mas permanece acima de 9888 mantendo sua ordem relativa.

Assim, o Radix Sort utiliza a estabilidade do algoritmo Counting Sort e fornece uma classificação linear de tempo inteiro.

4. Estável e instávelSorting Algorithms

Vários algoritmos de classificação comuns são estáveis ​​por natureza, comoMerge Sort,Timsort,Counting Sort,Insertion Sort eBubble Sort. Outros, comoQuicksort,HeapsorteSelection Sort são instáveis.

Podemos modificar os algoritmos de classificação instável para serem estáveis. Por exemplo, podemos usar espaço extra para manter a estabilidade no Quicksort.

5. Conclusion

Neste tutorial, aprendemos sobre algoritmos de classificação estável e analisamos quando a estabilidade é importante, usando o Radix Sort como exemplo.