O que é estabilidade nos algoritmos de classificação e por que é importante?

292

Estou muito curioso, por que a estabilidade é ou não importante nos algoritmos de classificação?

DarthVader
fonte
2
Para fins de paralelização? por exemplo: a classificação de mesclagem é estável e pode ser bem paralelizada, assim como o quicksort.
DarthVader
13
Clássico QuickSort é instável
Konstantin Spirin
9
estável sort algo -IBM (Insertion, Bubble, Merge)
roottraveller
Uma observação para quem pode entender mal o conceito como eu: a ordem dos elementos iguais é garantida. significa: se os elementos em classificação estável forem considerados iguais, eles seguirão a ordem anterior. Não era o que eu costumava pensar: se os elementos na ordem anterior forem considerados iguais, então no próximo tipo estável, eles seguirão a ordem anterior. Embora você possa achar que o último entendimento também faz sentido em muitos casos.
Rick

Respostas:

371

Diz-se que um algoritmo de classificação é estável se dois objetos com chaves iguais aparecerem na mesma ordem na saída classificada, como aparecem na matriz de entrada a ser classificada. Alguns algoritmos de classificação são estáveis ​​por natureza, como Classificação de inserção, Classificação de mesclagem, Classificação de bolhas, etc. E alguns algoritmos de classificação não são, como Classificação de pilha, Classificação rápida, etc.

Antecedentes : um algoritmo de classificação "estável" mantém os itens com a mesma chave de classificação em ordem. Suponha que tenhamos uma lista de palavras de 5 letras:

peach
straw
apple
spork

Se ordenarmos a lista apenas pela primeira letra de cada palavra, uma classificação estável produzirá:

apple
peach
straw
spork

Em um algoritmo de classificação instável , strawou sporkpode ser trocado, mas em um estável, eles permanecem nas mesmas posições relativas (ou seja, como strawaparece antes sporkna entrada, também aparece antes sporkna saída).

Poderíamos classificar a lista de palavras usando este algoritmo: classificação estável pela coluna 5, depois 4, depois 3, depois 2 e depois 1. No final, ela será classificada corretamente. Convença-se disso. (a propósito, esse algoritmo é chamado de classificação radix)

Agora, para responder sua pergunta, suponha que tenhamos uma lista de nomes e sobrenomes. Somos solicitados a classificar "pelo sobrenome e depois pelo primeiro". Poderíamos primeiro classificar (estável ou instável) pelo primeiro nome, depois classificar estável pelo sobrenome. Após essas classificações, a lista é classificada principalmente pelo sobrenome. No entanto, onde os sobrenomes são iguais, os primeiros nomes são classificados.

Você não pode empilhar tipos instáveis ​​da mesma maneira.

Joey Adams
fonte
Então, como seria o tipo de ordem para colocar as palavras em ordem correta de palha esportiva de maçã e pêssego? O tipo estável nos deu spork pêssego palha maçã no entanto st deve ser após sp (em ordem alfabética correta), então o tipo correto final deve ser esporte pêssego palha maçã
user1416486
2
@ user1416486: Estamos classificando apenas pela primeira letra. Com essa suposição, strawe sporkcompare igual. A classificação estável preservará a ordem de entrada, enquanto a classificação instável não oferece essa garantia. "Correto" depende do aplicativo. A função de classificação na maioria das linguagens de programação permite ao usuário fornecer uma função de pedido personalizada. Se a função do usuário tratar diferentes itens como iguais (por exemplo, mesmo nome, sobrenome diferente), é útil saber se o pedido original será preservado. Consulte as funções de classificação de matriz do OCaml para obter um exemplo do mundo real.
Joey Adams
3
Eu não entendo a linha .. mesma chave de classificação ? O que você quer dizer com chave aqui? Por favor, explique a declaração chave ..same classificação
saplingPro
2
@ saplingPro: por "chave de classificação", quero dizer a coisa pela qual você está classificando os itens. Portanto, ao classificar pela primeira letra e, para cada item, sua "chave de classificação" é a primeira letra.
Joey Adams
12
Exemplo - Digamos que você tenha uma lista com cada item com informações sobre o destino do voo e a hora de partida. Você primeiro classifica a lista com base no tempo. Em seguida, classificamos com base no destino. Se o segundo tipo for estável , agora temos todos os voos com destino ao mesmo destino juntos e em ordem crescente do horário de partida. Se não fosse estável, eles não estariam em ordem crescente de tempo.
roottraveller
55

Um algoritmo de classificação estável é aquele que classifica os elementos idênticos na mesma ordem em que aparecem na entrada, enquanto a classificação instável pode não satisfazer o caso. - Agradeço ao meu professor de algoritmo, Didem Gozupek, por fornecer informações sobre os algoritmos .

Algoritmos de Classificação Estável:

  • Classificação de inserção
  • Mesclar classificação
  • Tipo de bolha
  • Tim Sort
  • Classificação de contagem
  • Classificar bloco
  • Quadsort
  • Classificação da biblioteca
  • Coqueteleira Sort
  • Classificação do Gnomo
  • Tipo ímpar - par

Algoritmos de classificação instável:

  • Classificação da pilha
  • Classificação da seleção
  • Classificação do shell
  • Ordenação rápida
  • Introsort (sujeito a Quicksort)
  • Classificação da árvore
  • Classificação do ciclo
  • Smoothsort
  • Classificação do torneio (sujeito a Hesapsort)

insira a descrição da imagem aqui

snr
fonte
2
Seus valores não são iguais. Você compara 9,7 e 9,8, mas de acordo com a verificação de estabilidade, você precisa dos mesmos valores, como 9,7 ou 9,8. E que os mesmos valores devem ser ordenados da mesma forma em algoritmos estáveis.
Erhun 21/05/19
1
Não, para verificar a estabilidade, seus valores devem ser os mesmos. Quero dizer, suponha que você use dois 9,7 e nomeie-o no nó A e no nó B. Se toda ordem de operação de classificação for como A, B (em vez de serem iguais), entenda que o algoritmo de classificação é estável (como classificação de mesclagem). Se A, B ordem é mudança quando classificá-los várias vezes (. 1 classificar A, B, em seguida, B, A novamente A, B etc.), entendemos que algoritmo de classificação é instável (como classificação rápida) @snr
erhun
@snr [9, 6] não está presente na matriz de entrada. Eu acho que você quis dizer [9, 8] na última faixa do array.
precisa
4
@erhun Eu acredito que ele está classificando apenas o primeiro número (aquele antes da vírgula) e usando o segundo número apenas como referência para você ver que os 9 primeiros são diferentes do 9º.
Tiago
20

A estabilidade da classificação significa que os registros com a mesma chave mantêm sua ordem relativa antes e depois da classificação.

Portanto, a estabilidade é importante se, e somente se, o problema que você está resolvendo exige a retenção dessa ordem relativa.

Se você não precisar de estabilidade, poderá usar um algoritmo rápido de absorção de memória de uma biblioteca, como heapsort ou quicksort, e esquecê-lo.

Se você precisa de estabilidade, é mais complicado. Algoritmos estáveis ​​têm maior CPU O-grande e / ou uso de memória do que algoritmos instáveis. Portanto, quando você tem um grande conjunto de dados, precisa escolher entre bater a CPU ou a memória. Se você está restrito à CPU e à memória, tem um problema. Um bom algoritmo estável de comprometimento é uma classificação de árvore binária; o artigo da Wikipedia tem uma implementação C ++ pateticamente fácil com base no STL.

Você pode transformar um algoritmo instável em um estável adicionando o número do registro original como a chave de último lugar para cada registro.

Bob Murphy
fonte
1
Algoritmos estáveis ​​como o Merge Sort têm a mesma complexidade O (NlogN) do Quicksort; o multiplicador constante no esforço é maior, no entanto.
31416 Jonathan Leffler
Sim, e o uso de memória no Merge Sort é O (N), enquanto no Quicksort é O (log N). A razão pela qual mencionei o Quicksort é que o qsort () é uma rotina de biblioteca padrão C, portanto está disponível de verdade.
Bob Murphy
1
Melhor resposta geral IMHO. a técnica com várias teclas mencionada em outras é interessante, mas superestimada; é simples de aplicar, mas tende a ser muito mais lento que as alternativas óbvias (basta usar uma classificação com uma comparação de várias chaves; ou classificar pela primeira chave e depois identificar e classificar qualquer sublista com duplicatas). O fato de que a classificação estável produz um resultado previsível pode ser importante em alguns aplicativos. Em particular, se você tiver duas listas de entrada A, B que são idênticas, exceto que a lista B possui uma entrada extra, as saídas para uma classificação estável serão idênticas, exceto que B possui a mesma entrada extra. E +1 no último pgph.
Greggo
16

Depende do que você faz.

Imagine que você tem registros de algumas pessoas com um campo de nome e sobrenome. Primeiro você classifica a lista pelo primeiro nome. Se você classificar a lista com um algoritmo estável por sobrenome, terá uma lista classificada por nome E sobrenome.

svens
fonte
4
Eu acho que você quer dizer "sobrenome e nome". O sobrenome normalmente é o sobrenome.
Bacon Bits
14

Existem algumas razões pelas quais a estabilidade pode ser importante. Uma é que, se dois registros não precisarem ser trocados trocando-os, você poderá causar uma atualização de memória, uma página será marcada como suja e precisará ser reescrita no disco (ou em outro meio lento).

Clinton Pierce
fonte
O que a troca de registros tem a ver com estabilidade?
user1683793 5/03
4

Um algoritmo de classificação é considerado estável se dois objetos com chaves iguais aparecerem na mesma ordem na saída classificada, como aparecem na matriz não classificada de entrada. Alguns algoritmos de classificação são estáveis ​​por natureza, como Classificação de inserção, Classificação de mesclagem, Classificação de bolhas, etc. E alguns algoritmos de classificação não são, como Classificação de pilha, Classificação rápida, etc.

No entanto, qualquer item de classificação que não seja estável pode ser modificado para ser estável. Pode haver maneiras específicas de classificar algo para torná-lo estável, mas, em geral, qualquer algoritmo de classificação baseado em comparação que não seja estável por natureza pode ser modificado para ficar estável, alterando a operação de comparação de teclas para que a comparação de duas chaves considere a posição como um fator para objetos com chaves iguais.

Referências: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability

roottraveller
fonte
3

Eu sei que existem muitas respostas para isso, mas para mim, essa resposta , de Robert Harvey , resumiu muito mais claramente:

Uma classificação estável é aquela que preserva a ordem original do conjunto de entradas, em que o algoritmo [instável] não distingue entre dois ou mais itens.

Fonte

John R Perry
fonte
1

Se você assume que o que está classificando são apenas números e apenas seus valores os identificam / os distinguem (por exemplo, elementos com o mesmo valor são idênticos), então a questão da estabilidade da classificação não tem sentido.

No entanto, objetos com a mesma prioridade na classificação podem ser distintos e, em algum momento, sua ordem relativa é uma informação significativa. Nesse caso, a classificação instável gera problemas.

Por exemplo, você tem uma lista de dados que contém o custo de tempo [T] de todos os jogadores para limpar um labirinto com o Nível [L] em um jogo. Suponha que precisamos classificar os jogadores pela rapidez com que limpam o labirinto. No entanto, uma regra adicional se aplica: jogadores que limpam o labirinto com níveis mais altos sempre têm uma classificação mais alta, não importa quanto tempo o tempo seja.

Claro que você pode tentar mapear o valor emparelhado [T, L] para um número real [R] com algum algoritmo que segue as regras e depois classificar todos os jogadores com o valor [R].

No entanto, se a classificação estável for possível, você pode simplesmente classificar a lista inteira por [T] (jogadores mais rápidos primeiro) e depois por [L]. Nesse caso, a ordem relativa dos jogadores (por custo de tempo) não será alterada depois que você os agrupar por nível de labirinto que eles limparam.

PS: é claro que a abordagem para classificar duas vezes não é a melhor solução para o problema em particular, mas para explicar a questão do poster, deve ser suficiente.

M Ciel
fonte
0

A classificação estável sempre retornará a mesma solução (permutação) na mesma entrada.

Por exemplo, [2,1,2] serão classificados usando classificação estável como permutação [2,1,3] (primeiro é o índice 2, depois o índice 1 e o índice 3 na saída classificada) Isso significa que a saída é sempre embaralhada da mesma maneira. Outra permutação não estável, mas ainda correta, é [2,3,1].

A ordenação rápida não é uma classificação estável e as diferenças de permutação entre os mesmos elementos dependem do algoritmo para a escolha do pivô. Algumas implementações são selecionadas aleatoriamente e podem ser classificadas rapidamente, produzindo permutações diferentes na mesma entrada, usando o mesmo algoritmo.

O algoritmo de ordenação estável é determinístico necessário.

Luka Rahne
fonte
2
Não é isso que significa estabilidade. Veja en.wikipedia.org/wiki/Sorting_algorithm#Stability
Luís Oliveira
Devo corrigir a última frase, pois a classificação não estável pode gerar uma solução diferente, mesmo na mesma implementação, onde qualquer classificação estável gera a mesma solução.
22613 Luka Rahne
1
Por que -1? Alguém pode apontar o que está errado aqui? Não é isso que é classificação estável, mas que classificação estável de propriedade possui.
Luka Rahne
Se a classificação é determinística ou não, não determina se é estável. Eu posso escrever um algoritmo de classificação determinística não estável definindo um comportamento de desempate diferente (sub-agrupando partes não-chave, por exemplo). A classificação estável implica especificamente que a ordem relativa pré-classificada dos elementos seja preservada quando os laços são classificados. exemplo de uma saída de uma espécie estável: sort([(5,3),(1,5),(3,3),(1,3)], x) => [(1,5),(1,3),(3,3),(5,3)]. Eu posso fazer uma classificação determinística que sempre (deterministicamente) gera: [(1,3),(1,5),(3,3),(5,3)]mas essa não é uma classificação estável.
cowbert
@cowbert É mais uma afirmação, sobre uma propriedade legal que todo tipo estável possui. Isso não importa que o algoritmo de classificação estável ou a implementação seja usada, sempre que houver o mesmo resultado. É mais difícil manter essa propriedade entre diferentes implementações de classificação não estáveis.
Luka Rahne
0

Mais alguns exemplos do motivo de querer tipos estáveis. Bancos de dados são um exemplo comum. Considere o caso de um banco de dados de transações que inclua sobrenome, data, hora da compra, número do item, preço. Digamos que a base de dados seja normalmente classificada por data | hora. Em seguida, é feita uma consulta para fazer uma cópia ordenada do banco de dados pelo sobrenome | primeiro nome, uma vez que uma classificação estável preserva a ordem original, mesmo que a comparação da consulta envolva apenas o sobrenome, as transações para cada sobrenome | estar na ordem dos dados | tempo.

Um exemplo semelhante é o Excel clássico, que limita as classificações a 3 colunas por vez. Para classificar 6 colunas, uma classificação é feita com as 3 colunas menos significativas, seguida por uma classificação com as 3 colunas mais significativas.

Um exemplo clássico de uma classificação de raiz estável é um classificador de cartões, usado para classificar por um campo de base 10 colunas numéricas. Os cartões são classificados do dígito menos significativo para o dígito mais significativo. Em cada passagem, um baralho de cartas é lido e separado em 10 posições diferentes, de acordo com o dígito nessa coluna. Em seguida, os 10 compartimentos de cartões são recolocados no alimentador de entrada em ordem (cartões "0" primeiro, cartões "9" por último). Em seguida, outra passagem é feita pela próxima coluna, até que todas as colunas sejam classificadas. Os classificadores de cartões reais têm mais de 10 compartimentos, uma vez que existem 12 zonas em um cartão, uma coluna pode ficar em branco e há uma bandeja de leitura incorreta. Para classificar as letras, são necessárias 2 passagens por coluna, 1ª passagem para dígito, 2ª passagem para a zona 12 11.

Mais tarde (1937), havia máquinas de agrupar cartões (mesclar) que podiam mesclar dois baralhos de cartas comparando campos. A entrada eram dois baralhos já classificados, um baralho mestre e um baralho de atualização. O ordenador mesclou os dois decks em uma nova bandeja de materiais e uma de arquivo, que era opcionalmente usada para duplicatas mestre, para que a nova bandeja mestre tivesse apenas cartões de atualização em caso de duplicatas. Essa foi provavelmente a base da ideia por trás da classificação de mesclagem original (de baixo para cima).

rcgldr
fonte