Dato sono due matrici ordinate a , b di tipo T con dimensione n e m . Sto cercando un algoritmo che unisce i due array in un nuovo array (di dimensioni massime n + m).
Se hai un'operazione di confronto economica, è abbastanza semplice. Basta prendere dall'array con il primo elemento più basso fino a quando uno o entrambi gli array sono completamente attraversati, quindi aggiungere gli elementi rimanenti. Qualcosa del genere /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
Tuttavia, la situazione cambia quando si confrontano due elementi è molto più costoso rispetto alla copia di un elemento dall'array di origine all'array di destinazione . Ad esempio, potresti avere un array di grandi numeri interi di precisione arbitraria, o stringhe, in cui un confronto può essere piuttosto costoso. Supponi solo che la creazione di array e la copia di elementi sia gratuita e l'unica cosa che costa è il confronto di elementi.
In questo caso, si desidera unire i due array con un numero minimo di confronti tra elementi . Ecco alcuni esempi in cui dovresti essere in grado di fare molto meglio del semplice algoritmo di unione:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
O
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Ci sono alcuni casi in cui il semplice algoritmo di unione sarà ottimale, come
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Quindi l'algoritmo dovrebbe idealmente degradarsi con grazia ed eseguire un massimo di n + m-1 confronti nel caso in cui le matrici siano interfogliate, o almeno non essere significativamente peggiori.
Una cosa che dovrebbe fare abbastanza bene per gli elenchi con una grande differenza di dimensioni sarebbe quella di usare la ricerca binaria per inserire gli elementi dell'array più piccolo nell'array più grande. Ma ciò non si degrada con garbo nel caso in cui entrambi gli elenchi abbiano le stesse dimensioni e interfogliati.
L'unica cosa disponibile per gli elementi è una funzione (totale) di ordinamento, quindi non è possibile alcuno schema che renda i confronti più economici.
Qualche idea?
Ho escogitato questo pezzo alla Scala . Credo che sia ottimale per quanto riguarda il numero di confronti, ma va oltre la mia capacità di dimostrarlo. Almeno è molto più semplice delle cose che ho trovato in letteratura.
E dal post originale, ho scritto un post sul blog su come funziona.