Dadas duas matrizes ordenadas a , b do tipo T com tamanho n e m . Estou procurando um algoritmo que mescla as duas matrizes em uma nova matriz (de tamanho máximo n + m).
Se você tem uma operação de comparação barata, isso é bastante simples. Apenas retire da matriz com o primeiro elemento mais baixo até que uma ou ambas as matrizes sejam atravessadas completamente e adicione os elementos restantes. Algo como este /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
No entanto, a situação muda ao comparar dois elementos, é muito mais caro do que copiar um elemento da matriz de origem para a matriz de destino . Por exemplo, você pode ter uma matriz de grandes números inteiros de precisão arbitrária, ou seqüências de caracteres, onde uma comparação pode ser bastante cara. Suponha que a criação de matrizes e cópia de elementos seja gratuita e a única coisa que custa é comparar elementos.
Nesse caso, você deseja mesclar as duas matrizes com um número mínimo de comparações de elementos . Aqui estão alguns exemplos em que você deve fazer muito melhor do que o algoritmo de mesclagem simples:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
Ou
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Existem alguns casos em que o algoritmo de mesclagem simples será ideal, como
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Portanto, o algoritmo idealmente deve degradar e executar no máximo n + m-1 comparações caso as matrizes sejam intercaladas ou, pelo menos, não sejam significativamente piores.
Uma coisa que deve funcionar muito bem para listas com uma grande diferença de tamanho seria usar a pesquisa binária para inserir os elementos da matriz menor na matriz maior. Mas isso não será degradado se as duas listas forem do mesmo tamanho e intercaladas.
A única coisa disponível para os elementos é uma função de pedido (total), portanto, qualquer esquema que torne as comparações mais baratas não é possível.
Alguma ideia?
Eu vim com essa parte em Scala . Eu acredito que é ótimo em relação ao número de comparações, mas está além da minha capacidade de provar isso. Pelo menos, é muito mais simples do que as coisas que encontrei na literatura.
E desde a postagem original, escrevi uma postagem no blog sobre como isso funciona.