Cho là hai mảng được sắp xếp a , b loại T với kích thước n và m . Tôi đang tìm kiếm một thuật toán hợp nhất hai mảng thành một mảng mới (có kích thước tối đa n + m).
Nếu bạn có một hoạt động so sánh giá rẻ, điều này là khá đơn giản. Chỉ cần lấy từ mảng có phần tử đầu tiên thấp nhất cho đến khi một hoặc cả hai mảng được duyệt hoàn toàn, sau đó thêm các phần tử còn lại. Một cái gì đó như thế này /programming/5958169/how-to-merge-two-sort-arrays-into-a-sort-array
Tuy nhiên, tình huống thay đổi khi so sánh hai phần tử đắt hơn nhiều so với việc sao chép một phần tử từ mảng nguồn sang mảng đích . Ví dụ, bạn có thể có một dãy các số nguyên chính xác lớn hoặc các chuỗi, trong đó một phép so sánh có thể khá tốn kém. Chỉ cần giả định rằng việc tạo mảng và sao chép các phần tử là miễn phí, và điều duy nhất là chi phí là so sánh các phần tử.
Trong trường hợp này, bạn muốn hợp nhất hai mảng với số lượng so sánh phần tử tối thiểu . Dưới đây là một số ví dụ mà bạn sẽ có thể làm tốt hơn nhiều so với thuật toán hợp nhất đơn giản:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
Hoặc là
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Có một số trường hợp thuật toán hợp nhất đơn giản sẽ tối ưu, như
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Vì vậy, thuật toán nên suy giảm một cách duyên dáng và thực hiện tối đa các phép so sánh n + m-1 trong trường hợp các mảng được xen kẽ, hoặc ít nhất là không tệ hơn đáng kể.
Một điều nên làm khá tốt cho các danh sách có chênh lệch kích thước lớn là sử dụng tìm kiếm nhị phân để chèn các phần tử của mảng nhỏ hơn vào mảng lớn hơn. Nhưng điều đó sẽ không làm giảm một cách duyên dáng trong trường hợp cả hai danh sách có cùng kích thước và xen kẽ.
Điều duy nhất có sẵn cho các yếu tố là một hàm (tổng) thứ tự, do đó, bất kỳ sơ đồ nào làm cho việc so sánh rẻ hơn là không thể.
Có ý kiến gì không?
Tôi đã nghĩ ra điều này ở Scala . Tôi tin rằng nó là tối ưu về số lượng so sánh, nhưng nó vượt quá khả năng của tôi để chứng minh điều đó. Ít nhất đó là nhiều đơn giản hơn những điều tôi đã tìm thấy trong các tài liệu.
Và kể từ khi đăng bài gốc, tôi đã viết một bài đăng trên blog về cách thức hoạt động của nó.