Gegeben sind zwei sortierte Arrays a , b vom Typ T mit der Größe n und m . Ich suche nach einem Algorithmus, der die zwei Reihen in eine neue Reihe (der maximalen Größe n + m) zusammenführt.
Wenn Sie eine billige Vergleichsoperation haben, ist dies ziemlich einfach. Nehmen Sie einfach vom Array mit dem niedrigsten ersten Element, bis eines oder beide Arrays vollständig durchlaufen sind, und fügen Sie dann die verbleibenden Elemente hinzu. In etwa so /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
Die Situation ändert sich jedoch, wenn zwei Elemente verglichen werden. Dies ist wesentlich teurer als das Kopieren eines Elements vom Quell-Array in das Ziel-Array . Zum Beispiel könnten Sie ein Array von großen Ganzzahlen mit beliebiger Genauigkeit oder Strings haben, bei denen ein Vergleich ziemlich teuer sein kann. Nehmen Sie einfach an, dass das Erstellen von Arrays und das Kopieren von Elementen kostenlos ist und dass nur der Vergleich von Elementen kostet.
In diesem Fall möchten Sie die beiden Arrays mit einer minimalen Anzahl von Elementvergleichen zusammenführen . Hier sind einige Beispiele, bei denen Sie weitaus bessere Ergebnisse erzielen sollten als mit dem einfachen Zusammenführungsalgorithmus:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
Oder
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Es gibt einige Fälle, in denen der einfache Zusammenführungsalgorithmus optimal ist
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Daher sollte der Algorithmus im Idealfall n + m-1 Vergleiche in angemessener Weise herabsetzen und maximal durchführen, falls die Arrays verschachtelt sind oder zumindest nicht wesentlich schlechter sind.
Eine Sache, die sich für Listen mit einem großen Größenunterschied recht gut eignet, ist die Verwendung der binären Suche, um die Elemente des kleineren Arrays in das größere Array einzufügen. Dies verschlechtert sich jedoch nicht, wenn beide Listen gleich groß und verschachtelt sind.
Das einzige, was für die Elemente verfügbar ist, ist eine (Gesamt-) Ordnungsfunktion, so dass ein Schema, das Vergleiche billiger macht, nicht möglich ist.
Irgendwelche Ideen?
Ich habe mir dieses Stück in Scala ausgedacht . Ich glaube, es ist in Bezug auf die Anzahl der Vergleiche optimal, aber ich kann es nicht beweisen. Zumindest ist es viel einfacher als die Dinge, die ich in der Literatur gefunden habe.
Und seit dem ursprünglichen Posting habe ich einen Blog-Post darüber geschrieben, wie das funktioniert.