크기가 n 및 m 인 T 유형의 정렬 된 배열 a , b 가 제공 됩니다. 두 배열을 새 배열 (최대 크기 n + m)로 병합하는 알고리즘을 찾고 있습니다.
저렴한 비교 작업이 있으면 매우 간단합니다. 하나 또는 두 개의 배열이 완전히 이송 될 때까지 첫 번째 요소가 가장 낮은 배열에서 가져온 다음 나머지 요소를 추가하십시오. 이 같은 /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
그러나 두 요소를 비교할 때 상황이 변경되면 소스 배열에서 대상 배열로 요소를 복사하는 것보다 훨씬 비쌉니다 . 예를 들어 비교에 많은 비용이들 수있는 큰 임의 정밀도 정수 또는 문자열 배열이있을 수 있습니다. 배열을 만들고 요소를 복사하는 것이 자유롭고 비용이 드는 유일한 요소는 요소를 비교한다고 가정하십시오.
이 경우 두 배열 을 최소 수의 요소 비교와 병합하려고합니다 . 다음은 간단한 병합 알고리즘보다 훨씬 더 잘 수행 할 수있는 몇 가지 예입니다.
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
또는
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
간단한 병합 알고리즘이 최적의 경우가 있습니다.
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
따라서 알고리즘은 배열이 인터리브되거나 적어도 크게 나 빠지지 않을 경우 이상적으로 우아하게 최대 n + m-1 비교를 수행하고 수행해야합니다.
크기 차이가 큰 목록의 경우 잘 수행해야 할 한 가지 방법은 이진 검색을 사용하여 작은 배열의 요소를 큰 배열에 삽입하는 것입니다. 그러나 두 목록의 크기가 같고 인터리브 된 경우에는 정상적으로 저하되지 않습니다.
요소에 사용 가능한 유일한 것은 (총) 순서 함수이므로 비교를 저렴하게 만드는 체계는 불가능합니다.
어떤 아이디어?
나는 Scala에서이 비트를 생각해 냈습니다 . 나는 그것이 비교의 수와 관련하여 최적이라고 생각하지만 그것을 증명할 수있는 능력을 벗어났습니다. 적어도 내가 문학에서 찾은 것보다 훨씬 간단합니다.
그리고 원래 게시물 이후로, 이것이 어떻게 작동하는지에 대한 블로그 게시물을 썼습니다 .