Sono presenti due array ordinati a , b di tipo T con dimensioni n e m . Sto cercando un algoritmo che unisce i due array in un nuovo array (di dimensione massima n + m).
Se si dispone di un'operazione di confronto a basso costo, questo è piuttosto semplice. Prendi dall'array il primo elemento più in basso fino a quando uno o entrambi gli array sono completamente attraversati, quindi aggiungi gli elementi rimanenti. Qualcosa come questo link
Tuttavia, la situazione cambia quando il confronto di due elementi è molto più costoso della copia di un elemento dall'array di origine all'array di destinazione . Ad esempio, potresti avere una matrice di numeri interi o stringhe di precisione arbitraria di grandi dimensioni, in cui un confronto può essere piuttosto costoso. Supponiamo che la creazione di array e gli elementi di copia siano gratuiti, e l'unica cosa che costa è il confronto degli elementi.
In questo caso, vuoi 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 fusione:
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 l'algoritmo di fusione semplice sarà ottimale, come
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Quindi l'algoritmo dovrebbe idealmente degradarsi ed eseguire un massimo di confronti n + m-1 nel caso in cui gli array siano intercalati, o almeno non peggiori significativamente.
Una cosa che dovrebbe fare abbastanza bene per gli elenchi con una differenza di grandi dimensioni sarebbe quella di utilizzare la ricerca binaria per inserire gli elementi dell'array più piccolo nell'array più grande. Ma questo non si degraderà con grazia nel caso in cui entrambi gli elenchi siano della stessa dimensione e interlacciati.
L'unica cosa disponibile per gli elementi è una (totale) funzione di ordinamento, quindi qualsiasi schema che rende i confronti più economici non è possibile.
Qualche idea?
Ho trovato questo bit in Scala . Credo che sia ottimale per quanto riguarda il numero di confronti, ma è oltre la mia capacità di dimostrarlo. Almeno è molto più semplice di quanto ho trovato in letteratura.
E dal post originale, ho scritto un post sul blog su come funziona.