Podano dwa posortowane tablice a , b typu T o rozmiarze n i m . Szukam algorytmu, który łączy dwie tablice w nową tablicę (o maksymalnym rozmiarze n + m).
Jeśli masz tanią operację porównania, jest to dość proste. Wystarczy pobrać z tablicy z najniższym pierwszym elementem, aż jeden lub oba tablice zostaną całkowicie przejrzane, a następnie dodaj pozostałe elementy. Coś takiego: /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
Jednak sytuacja zmienia się, gdy porównywanie dwóch elementów jest znacznie droższe niż kopiowanie elementu z tablicy źródłowej do tablicy docelowej . Na przykład możesz mieć tablicę dużych liczb całkowitych o dowolnej dokładności lub ciągów, gdzie porównanie może być dość drogie. Załóżmy, że tworzenie tablic i kopiowanie elementów jest bezpłatne, a jedyne, co kosztuje, to porównywanie elementów.
W takim przypadku chcesz połączyć dwie tablice z minimalną liczbą porównań elementów . Oto kilka przykładów, w których powinieneś być w stanie zrobić znacznie lepiej niż prosty algorytm scalania:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
Lub
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
W niektórych przypadkach prosty algorytm scalania będzie optymalny
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Dlatego algorytm powinien idealnie z wdziękiem zdegradować i wykonać maksymalnie n + m-1 porównań w przypadku, gdy tablice są przeplatane, lub przynajmniej nie być znacznie gorszy.
Jedną z rzeczy, które powinny być całkiem dobre w przypadku list o dużej różnicy wielkości, byłoby użycie wyszukiwania binarnego do wstawienia elementów mniejszej tablicy do większej tablicy. Ale to nie pogorszy się z wdziękiem, jeśli obie listy będą tego samego rozmiaru i przeplatane.
Jedyną rzeczą dostępną dla elementów jest (całkowita) funkcja porządkowania, więc żaden schemat, który powoduje, że porównania są tańsze, nie jest możliwy.
Jakieś pomysły?
Wymyśliłem ten kawałek w Scali . Uważam, że jest optymalny pod względem liczby porównań, ale nie jestem w stanie tego udowodnić. Przynajmniej jest to o wiele prostsze niż rzeczy, które znalazłem w literaturze.
A od czasu oryginalnego posta napisałem post na blogu o tym, jak to działa.