Dado son dos matrices ordenadas una , b de tipo T con el tamaño de n y m . Estoy buscando un algoritmo que combine las dos matrices en una nueva matriz (de tamaño máximo n + m).
Si tiene una operación de comparación barata, esto es bastante simple. Simplemente tome de la matriz con el primer elemento más bajo hasta que una o ambas matrices estén completamente atravesadas, luego agregue los elementos restantes. Algo como esto /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
Sin embargo, la situación cambia cuando comparar dos elementos es mucho más costoso que copiar un elemento de la matriz de origen a la matriz de destino . Por ejemplo, puede tener una gran variedad de enteros de precisión arbitraria, o cadenas, donde la comparación puede ser bastante costosa. Simplemente suponga que crear matrices y copiar elementos es gratuito, y lo único que cuesta es comparar elementos.
En este caso, desea fusionar las dos matrices con un número mínimo de comparaciones de elementos . Estos son algunos ejemplos en los que debería poder hacerlo mucho mejor que el algoritmo de fusión simple:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
O
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Hay algunos casos en los que el algoritmo de fusión simple será óptimo, como
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Por lo tanto, el algoritmo idealmente debería degradarse con gracia y realizar un máximo de n + m-1 comparaciones en caso de que las matrices estén entrelazadas, o al menos no sean significativamente peores.
Una cosa que debería funcionar bastante bien para las listas con una gran diferencia de tamaño sería utilizar la búsqueda binaria para insertar los elementos de la matriz más pequeña en la matriz más grande. Pero eso no se degradará con gracia en caso de que ambas listas sean del mismo tamaño y estén intercaladas.
Lo único disponible para los elementos es una función de orden (total), por lo que no es posible ningún esquema que haga las comparaciones más baratas.
¿Algunas ideas?
Se me ocurrió esta parte en Scala . Creo que es óptimo con respecto al número de comparaciones, pero está más allá de mi capacidad de demostrarlo. Al menos es mucho más simple que las cosas que he encontrado en la literatura.
Y desde la publicación original, escribí una publicación de blog sobre cómo funciona esto.