No último artigo, nos familiarizamos
com tipos de mesclagem de relíquias (causando principalmente interesse histórico). Qual é a tendência hoje?
Para se familiarizar com o conceito de pedido por meio de fusões, geralmente são usados algoritmos de mesclagem balanceada. O termo "equilíbrio" significa que o algoritmo divide recursivamente a matriz e seus sub-arranjos em partes aproximadamente iguais. Hoje, olhamos como fica na prática.
Um par de funções é o mesmo para os dois métodos. Enfim, esse "down-up", esse "up-down" é quase o mesmo algoritmo, apenas mostrado sob diferentes ângulos.
Precisamos, de fato, da fusão de duas metades do segmento em um subarray. As metades são classificadas simultaneamente em uma matriz, os elementos atuais em ambas as iterações são comparados e o elemento menor entra na segunda matriz:
Copiando um segmento de uma matriz para outra. Ambas as implementações operam em duas matrizes, os dados precisam ser constantemente direcionados do principal para o auxiliar e vice-versa:
Fusão equilibrada descendente
Primeiro, a matriz inteira é obtida, após o que uma descida recursiva começa. Uma matriz é dicotomizada até atingirmos os sub-arranjos de um elemento (que são classificados por eles mesmos). Em seguida, a recursão inicia a subida inversa, mesclando os subarrays ao longo do caminho (cujo tamanho dobra em cada nível).
Fusão ascendente equilibrada
Aqui a iteração sobre a matriz ocorre, ao longo do caminho, primeiro pegamos as matrizes mínimas vizinhas (de um elemento) e as fundimos em pares. Depois de duplicar as sub-matrizes classificadas em cada etapa, mesclamos os vizinhos novamente e continuamos até obtermos toda a matriz na forma classificada na saída.
Em geral, é preferível uma implementação de cima para baixo, pois utiliza duas matrizes com mais eficiência, que simplesmente alteram constantemente os papéis de "principal / auxiliar". Na versão upstream, a matriz A é sempre primária e a matriz B é sempre auxiliar. Como resultado, após cada iteração, os dados de B devem ser retornados na íntegra para A, o que não contribui para a melhoria da complexidade algorítmica. Por outro lado, a implementação do ascendente é mais simples, nem sequer tem recursão.
Fusão desequilibrada
Da própria palavra "equilíbrio", sopra algum tipo de confiabilidade, estabilidade. Você pode até ter a impressão de que um bom algoritmo deve ser equilibrado. E o “desequilíbrio” está associado a algum tipo de tremor e distorção. Bem, realmente, um
equilibrado não deveria ser melhor em todos os aspectos do que um
desequilibrado ?
De fato, é pior. Evidentemente, é muito mais fácil implementar a divisão de sub-matrizes em metades iguais (que é o que se entende por equilíbrio para tipos de mesclagem). Divida a matriz ao meio e aplique recursão a cada metade. Na verdade, essa facilidade é a principal vantagem de uma fusão equilibrada antes de uma desequilibrada.
Nas publicações a seguir, veremos métodos desequilibrados. Eles são visivelmente mais difíceis de entender e implementar. Os dados para mesclagem subsequente não serão distribuídos de maneira uniforme e uniforme entre matrizes auxiliares, mas de acordo com vários números generalizados de Fibonacci. E isso permitirá que você obtenha resultados poderosos que são inatingíveis para métodos equilibrados simplificados.
Referências
Mesclar (
tradução do Google ),
MesclarArtigos da série:
As próximas classificações de mesclagem estão agora disponíveis no aplicativo AlgoLab (para quem estuda algoritmos usando esse aplicativo do Excel, atualize o arquivo).
As matrizes são temporariamente limitadas - seu tamanho deve ser um poder de dois (devido a algumas dificuldades encontradas ao programar a visualização). Um pouco mais tarde, será possível classificar qualquer matriz.

Este artigo foi escrito com o suporte da EDISON Software, uma empresa que usa serviços em nuvem para criar software incorporado e desenvolver aplicativos móveis em JAVA .