Diberikan dua array yang diurutkan a , b tipe T dengan ukuran n dan m . Saya mencari algoritma yang menggabungkan dua array menjadi array baru (ukuran maksimum n + m).
Jika Anda memiliki operasi perbandingan yang murah, ini cukup sederhana. Cukup ambil dari array dengan elemen pertama terendah hingga satu atau kedua array benar-benar dilalui, lalu tambahkan elemen yang tersisa. Sesuatu seperti ini /programming/5958169/how-to-merge-two-sorted-arrays-into-a-sorted-array
Namun, situasinya berubah ketika membandingkan dua elemen jauh lebih mahal daripada menyalin elemen dari array sumber ke array target . Misalnya Anda mungkin memiliki array bilangan bulat presisi besar, atau string, di mana perbandingannya bisa sangat mahal. Anggap saja membuat array dan menyalin elemen adalah gratis, dan satu-satunya hal yang biayanya adalah membandingkan elemen.
Dalam hal ini, Anda ingin menggabungkan dua array dengan jumlah minimum perbandingan elemen . Berikut adalah beberapa contoh di mana Anda harus dapat melakukan jauh lebih baik daripada algoritma penggabungan sederhana:
a = [1,2,3,4, ... 1000]
b = [1001,1002,1003,1004, ... 2000]
Atau
a = [1,2,3,4, ... 1000]
b = [0,100,200, ... 1000]
Ada beberapa kasus di mana algoritma penggabungan sederhana akan optimal, seperti
a = [1,3,5,7,9,....,999]
b = [2,4,6,8,10,....,1000]
Jadi algoritma idealnya harus terdegradasi dengan anggun dan melakukan perbandingan maksimum n + m-1 jika array disisipkan, atau setidaknya tidak secara signifikan lebih buruk.
Satu hal yang harus dilakukan dengan cukup baik untuk daftar dengan perbedaan ukuran besar adalah menggunakan pencarian biner untuk memasukkan elemen-elemen dari array yang lebih kecil ke dalam array yang lebih besar. Tapi itu tidak akan menurunkan anggun jika kedua daftar memiliki ukuran yang sama dan disisipkan.
Satu-satunya hal yang tersedia untuk elemen adalah fungsi pemesanan (total), jadi skema apa pun yang membuat perbandingan lebih murah tidak mungkin.
Ada ide?
Saya telah menemukan bagian ini di Scala . Saya percaya itu optimal mengenai jumlah perbandingan, tetapi itu di luar kemampuan saya untuk membuktikannya. Setidaknya itu jauh lebih sederhana daripada hal-hal yang saya temukan dalam literatur.
Dan sejak posting asli, saya menulis posting blog tentang cara kerjanya.